/**
 * Education Events - Quick Wins
 * Additional school and college events
 */

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

export function popQuiz(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'popQuiz';
  const check = !player.askedQuestions.has(fname) &&
    player.character.location.includes('school') &&
    player.character.ageYears >= 10 &&
    player.character.ageYears <= 18 &&
    checkProbability(200);

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

  return createQuestionEvent(
    fname,
    "The teacher announces a surprise pop quiz! You didn't study. What do you do?",
    player,
    check,
    {
      answerOptions: [
        createAnswerOption('Try your best', '', 10, 0, 0),
        createAnswerOption("Glance at neighbor's paper"),
        createAnswerOption('Fake being sick'),
        createAnswerOption('Stay calm and think', '', 0, 5, 0)
      ]
    }
  );
}

export function raisedHandNotCalled(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'raisedHandNotCalled';
  const check = !player.events.has(fname) &&
    player.character.location.includes('school') &&
    player.character.ageYears >= 8 &&
    player.character.ageYears <= 18 &&
    checkProbability(300);

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

  return createMessageEvent(
    fname,
    "You know the answer! Your hand shoots up, but the teacher calls on someone else who gets it wrong. So frustrating.",
    player,
    check
  );
}

export function lostHomework(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'lostHomework';
  const check = !player.askedQuestions.has(fname) &&
    (player.character.location.includes('school') || player.character.location.includes('home')) &&
    player.character.ageYears >= 8 &&
    player.character.ageYears <= 16 &&
    checkProbability(250);

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

  return createQuestionEvent(
    fname,
    "You finished your homework but can't find it anywhere! What do you do?",
    player,
    check,
    {
      answerOptions: [
        createAnswerOption('Redo it quickly before class', '', 20, 0, 0),
        createAnswerOption('Explain to the teacher'),
        createAnswerOption('Say your dog ate it'),
        createAnswerOption('Take the late grade')
      ]
    }
  );
}

export function presentationNerves(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'presentationNerves';
  const check = !player.askedQuestions.has(fname) &&
    player.character.location.includes('school') &&
    player.character.ageYears >= 10 &&
    player.character.ageYears <= 18 &&
    checkProbability(200);

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

  return createQuestionEvent(
    fname,
    "It's your turn to present to the class. How do you handle your nerves?",
    player,
    check,
    {
      answerOptions: [
        createAnswerOption('Take deep breaths and go', '', 10, 0, 0),
        createAnswerOption('Rush through it quickly', '', 5, 0, 0),
        createAnswerOption('Picture everyone in underwear'),
        createAnswerOption('Ask to go last', '', 15, 3, 0)
      ]
    }
  );
}

export function teacherFavorite(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'teacherFavorite';
  const check = !player.events.has(fname) &&
    player.character.location.includes('school') &&
    player.character.ageYears >= 8 &&
    player.character.ageYears <= 17 &&
    checkProbability(300);

  if (check) {
    player.events.add(fname);
    player.character.energy = modifyStat(player.character.energy, 10);
  }

  return createMessageEvent(
    fname,
    "Your teacher keeps calling on you and praising your work. Some classmates whisper that you're the 'teacher's pet.'",
    player,
    check
  );
}

export function studyGroupInvite(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'studyGroupInvite';
  const check = !player.askedQuestions.has(fname) &&
    player.character.location.includes('school') &&
    player.character.ageYears >= 14 &&
    player.character.ageYears <= 22 &&
    checkProbability(200);

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

  return createQuestionEvent(
    fname,
    "Some classmates invite you to their study group. Do you join?",
    player,
    check,
    {
      answerOptions: [
        createAnswerOption('Yes, study together', '', 10, 0, 0),
        createAnswerOption('No, prefer solo studying'),
        createAnswerOption('Yes, but mostly socialize', '', 5, 0, 0)
      ]
    }
  );
}

export function extracurricularBurnout(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'extracurricularBurnout';
  const check = !player.askedQuestions.has(fname) &&
    player.character.ageYears >= 13 &&
    player.character.ageYears <= 18 &&
    player.character.activities.length > 2 &&
    checkProbability(150);

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

  return createQuestionEvent(
    fname,
    "You're juggling school, activities, and friends. You're exhausted. What gives?",
    player,
    check,
    {
      answerOptions: [
        createAnswerOption('Quit an activity'),
        createAnswerOption('Power through it', '', 20, 0, 0),
        createAnswerOption('Talk to parents about it', '', 0, 5, 0),
        createAnswerOption('Drop the lowest priority')
      ]
    }
  );
}

export function cafeteriaFoodPoisoning(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'cafeteriaFoodPoisoning';
  const check = !player.events.has(fname) &&
    player.character.location.includes('school') &&
    player.character.ageYears >= 8 &&
    player.character.ageYears <= 18 &&
    checkProbability(400);

  if (check) {
    player.events.add(fname);
    deductEnergy(player.character, 15);
  }

  return createMessageEvent(
    fname,
    "That mystery meat from the cafeteria is not sitting well. You spend most of the afternoon in the bathroom.",
    player,
    check,
    { energyCost: 15 }
  );
}

export function substituteTeacher(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'substituteTeacher';
  const check = !player.events.has(fname) &&
    player.character.location.includes('school') &&
    player.character.ageYears >= 8 &&
    player.character.ageYears <= 18 &&
    checkProbability(300);

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

  return createMessageEvent(
    fname,
    "You have a substitute teacher today. The class is chaotic and you barely get any work done.",
    player,
    check
  );
}

export function collegeAllNighter(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'collegeAllNighter';
  const check = !player.askedQuestions.has(fname) &&
    player.character.ageYears >= 18 &&
    player.character.ageYears <= 22 &&
    player.character.education === 'college' &&
    checkProbability(150);

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

  return createQuestionEvent(
    fname,
    "You have a huge exam tomorrow and you're behind. Pull an all-nighter?",
    player,
    check,
    {
      answerOptions: [
        createAnswerOption('Yes, study all night', '', 30, 0, 0),
        createAnswerOption('No, get sleep instead'),
        createAnswerOption('Study until midnight', '', 15, 0, 0),
        createAnswerOption('Get help from study buddy', '', 0, 10, 0)
      ]
    }
  );
}
