/**
 * Negative Random Events
 * Unfortunate events and mishaps
 */

import { Player } from '../../models/Player';
import { createMessageEvent, createQuestionEvent, checkProbability, createAnswerOption, modifyStat, type EventResult } from '../base';
import { deductEnergy } from '../../utils/statUtils.js';

export function spilledDrink(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'spilledDrink';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 8 &&
    player.character.ageYears <= 100 &&
    checkProbability(5000);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 10;
    deductEnergy(player.character, 5);
  }

  return createMessageEvent(
    fname,
    "You spilled coffee/juice all over yourself. Great start to the day...",
    player,
    check
  );
}

export function phoneDropped(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'phoneDropped';
  const check = !player.askedQuestions.has(fname) &&
    player.character.ageYears >= 12 &&
    player.character.ageYears <= 100 &&
    checkProbability(10000);

  if (check) {
    player.askedQuestions.add(fname);
  }

  return createQuestionEvent(
    fname,
    "You dropped your phone! Did it survive?",
    player,
    check,
    { answerOptions: ["It's fine!", 'Screen cracked', 'Completely shattered'] }
  );
}

export function birdPooped(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'birdPooped';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 5 &&
    player.character.ageYears <= 100 &&
    checkProbability(8000);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 10;
  }

  return createMessageEvent(
    fname,
    "A bird pooped on you. People say it's good luck, but it just feels gross.",
    player,
    check
  );
}

export function forgotWallet(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'forgotWallet';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 16 &&
    player.character.ageYears <= 100 &&
    checkProbability(6000);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 15;
    player.character.social -= 10;
  }

  return createMessageEvent(
    fname,
    "You're at the checkout and realize you forgot your wallet. So embarrassing!",
    player,
    check
  );
}

export function missedBus(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'missedBus';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 10 &&
    player.character.ageYears <= 100 &&
    checkProbability(7000);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 10;
    deductEnergy(player.character, 10);
  }

  return createMessageEvent(
    fname,
    "You ran for the bus but it pulled away right as you got there. Now you have to wait 20 minutes.",
    player,
    check
  );
}

export function badHairDay(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'badHairDay';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 12 &&
    player.character.ageYears <= 40 &&
    checkProbability(400);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 5;
  }

  return createMessageEvent(
    fname,
    "Your hair looks terrible today and there's nothing you can do about it.",
    player,
    check
  );
}

export function caughtInRain(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'caughtInRain';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 5 &&
    player.character.ageYears <= 100 &&
    checkProbability(500);

  if (check) {
    player.events.add(fname);
    player.character.happiness = modifyStat(player.character.happiness, -10);
    player.character.health = modifyStat(player.character.health, -5);
  }

  return createMessageEvent(
    fname,
    "You got caught in a downpour without an umbrella. You're soaked.",
    player,
    check
  );
}

export function lostKeys(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'lostKeys';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 12 &&
    player.character.ageYears <= 100 &&
    checkProbability(450);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 10;
    player.character.stress += 15;
    deductEnergy(player.character, 10);
  }

  return createMessageEvent(
    fname,
    "You can't find your keys anywhere. You're going to be late.",
    player,
    check
  );
}

export function sleepThroughAlarm(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'sleepThroughAlarm';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 12 &&
    player.character.ageYears <= 100 &&
    checkProbability(400);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 15;
    player.character.stress += 20;
    deductEnergy(player.character, 10);
  }

  return createMessageEvent(
    fname,
    "You slept through your alarm! You're going to be late for something important.",
    player,
    check
  );
}

export function packageStolen(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'packageStolen';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 18 &&
    player.character.ageYears <= 100 &&
    checkProbability(500);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 20;
    player.character.money -= 100;
  }

  return createMessageEvent(
    fname,
    "Someone stole the package from your doorstep. Great.",
    player,
    check,
    { moneyCost: 100 }
  );
}

export function phoneBreakdown(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'phoneBreakdown';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 12 &&
    player.character.ageYears <= 100 &&
    checkProbability(1200);

  if (check) {
    player.events.add(fname);
    player.character.money -= 600;
    player.character.happiness -= 20;
    player.character.stress += 15;
  }

  return createMessageEvent(
    fname,
    "Your phone completely died. You'll need a new one.",
    player,
    check,
    { moneyCost: 600 }
  );
}

export function dataLoss(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'dataLoss';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 16 &&
    player.character.ageYears <= 100 &&
    checkProbability(1500);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 30;
    player.character.stress += 35;
    deductEnergy(player.character, 40);
  }

  return createMessageEvent(
    fname,
    "Your computer crashed and you lost important files. All that work... gone.",
    player,
    check
  );
}

export function cyberbullying(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'cyberbullying';
  const check = !player.events.has(fname) &&
    player.character.ageYears >= 10 &&
    player.character.ageYears <= 25 &&
    player.character.hasSocialMedia &&
    checkProbability(1500);

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 35;
    player.character.stress += 40;
  }

  return createMessageEvent(
    fname,
    "You're being cyberbullied. The constant harassment is taking a toll.",
    player,
    check
  );
}
