/**
 * Annual Holiday Events
 * Date-specific holiday celebrations
 */

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

export function christmas(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `christmas_${player.character.ageYears}`;
  const check = !player.events.has(fname) && player.date === '12-25';

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

  return createMessageEvent(fname, 'You have celebrated Christmas!', player, check);
}

export function newYear(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `newyear_${player.character.ageYears}`;
  const check = !player.events.has(fname) && player.date === '01-01';

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

  return createMessageEvent(fname, 'You have celebrated New Years!', player, check);
}

export function thanksgiving(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `thanksgiving_${player.character.ageYears}`;
  const check = !player.events.has(fname) && player.date === '11-23';

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

  return createMessageEvent(fname, 'You have celebrated Thanksgiving!', player, check);
}

export function blackfriday(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `blackfriday_${player.character.ageYears}`;
  const check = !player.events.has(fname) && player.date === '11-24';

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

  return createMessageEvent(fname, 'It is Black Friday', player, check);
}

export function independenceday(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `independenceday_${player.character.ageYears}`;
  const check = !player.events.has(fname) && player.date === '07-04';

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

  return createMessageEvent(fname, 'You have celebrated Independence Day', player, check);
}

export function birthday(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `birthday_${player.character.ageYears}`;
  const check = !player.askedQuestions.has(fname) &&
    player.character.ageDays > 0 &&
    player.character.ageDays % 365 === 0;

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

  return createQuestionEvent(
    fname,
    "It's your birthday! How would you like to spend it?",
    player,
    check,
    {
      answerOptions: [
        'Spend it with family.',
        'Spend it with friends.',
        'Spend it alone, doing what you enjoy.'
      ]
    }
  );
}

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

  if (check) {
    player.events.add(fname);
    player.character.immunizations = true;
  }

  return createMessageEvent(fname, 'You have received your immunizations', player, check);
}

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

  if (check) {
    player.events.add(fname);
    const destinations = ['the beach', 'the mountains', 'another country', 'a theme park', 'a cruise', 'a national park', 'a lake', 'a cabin', 'a resort', 'a city'];
    const destination = destinations[Math.floor(Math.random() * destinations.length)];
    return createMessageEvent(fname, `You have gone on vacation to ${destination}`, player, true);
  }

  return null;
}

export function newFood(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'newFood';
  const check = player.character.ageDays > 0 &&
    !player.askedQuestions.has(fname) &&
    player.character.ageYears >= 2 &&
    player.character.ageYears <= 6 &&
    checkProbability(100);

  if (check) {
    player.askedQuestions.add(fname);
    const foods = ['Broccoli', 'Celery', 'Mushrooms', 'Brussels sprouts', 'Onions', 'Tomatoes'];
    const food = foods[Math.floor(Math.random() * foods.length)];

    return createQuestionEvent(
      fname,
      `Today at dinner your parents have you try ${food}. Do you like it?`,
      player,
      true,
      {
        answerOptions: [
          createAnswerOption('Yes, yum!', food),
          createAnswerOption('No, gross!', food)
        ]
      }
    );
  }

  return null;
}

export function halloween(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `halloween_${player.character.ageYears}`;
  const check = !player.askedQuestions.has(fname) &&
    player.date === '10-31' &&
    player.character.ageYears >= 3 &&
    player.character.ageYears <= 16;

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

  // Age-dependent costume options
  const answerOptions = player.character.ageYears <= 10
    ? ['Princess/Superhero', 'Scary Monster', 'Funny Character', 'No costume']
    : ['Group costume with friends', 'Ironically cute', 'Too cool for costumes', 'Hand out candy instead'];

  return createQuestionEvent(
    fname,
    "It's Halloween! What costume do you wear?",
    player,
    check,
    { answerOptions }
  );
}

export function valentinesDay(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `valentinesDay_${player.character.ageYears}`;
  const check = !player.askedQuestions.has(fname) &&
    player.date === '02-14' &&
    player.character.ageYears >= 10;

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

  // Different options based on relationship status
  const answerOptions = player.character.partner
    ? [
        createAnswerOption('Romantic dinner', '', 0, 0, 100),
        createAnswerOption('Stay in and cook'),
        createAnswerOption('Exchange small gifts')
      ]
    : [
        createAnswerOption("Galentine's/Palentine's with friends"),
        createAnswerOption('Treat yourself', '', 0, 0, 50),
        createAnswerOption('Ignore it completely')
      ];

  return createQuestionEvent(
    fname,
    "It's Valentine's Day! How do you spend it?",
    player,
    check,
    { answerOptions }
  );
}

export function easterEggHunt(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `easterEggHunt_${player.character.ageYears}`;
  const check = !player.events.has(fname) &&
    player.date === '04-10' &&
    player.character.ageYears >= 2 &&
    player.character.ageYears <= 10;

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

  return createMessageEvent(
    fname,
    'You find a basket full of candy and colorful eggs! Easter is so fun!',
    player,
    check
  );
}

export function backToSchoolShopping(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `backToSchoolShopping_${player.character.ageYears}`;
  const check = !player.askedQuestions.has(fname) &&
    player.date >= '08-20' &&
    player.date <= '08-31' &&
    player.character.ageYears >= 5 &&
    player.character.ageYears <= 18;

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

  return createQuestionEvent(
    fname,
    "It's time for back-to-school shopping! What's your style?",
    player,
    check,
    {
      answerOptions: [
        createAnswerOption('Cool new backpack', '', 0, 0, 50),
        createAnswerOption('Fancy notebooks', '', 0, 0, 30),
        createAnswerOption('Just the basics', '', 0, 0, 20),
        createAnswerOption("Use last year's stuff")
      ]
    }
  );
}

export function springCleaning(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `springCleaning_${player.character.ageYears}`;
  const check = !player.askedQuestions.has(fname) &&
    player.date >= '03-15' &&
    player.date <= '04-15' &&
    player.character.ageYears >= 18;

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

  return createQuestionEvent(
    fname,
    "It's time for spring cleaning! How thorough are you?",
    player,
    check,
    {
      answerOptions: [
        createAnswerOption('Deep clean everything', '', 30, 0, 0),
        createAnswerOption('Just the visible areas', '', 15, 0, 0),
        createAnswerOption('Hire a cleaner', '', 0, 0, 200),
        createAnswerOption('Ignore it')
      ]
    }
  );
}

export function mothersDayForgot(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  // Only trigger once per lifetime (not yearly)
  const fname = 'mothersDayForgot';
  const check = !player.events.has(fname) &&
    player.date >= '05-08' &&
    player.date <= '05-14' &&
    player.character.ageYears >= 12 &&
    checkProbability(500); // Reduced probability since it's once per lifetime

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

  return createMessageEvent(
    fname,
    "You forgot it was Mother's Day! You scramble to call your mom and feel guilty.",
    player,
    check
  );
}

export function summerFirstDayPool(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `summerFirstDayPool_${player.character.ageYears}`;
  const check = !player.events.has(fname) &&
    player.date >= '06-01' &&
    player.date <= '06-07' &&
    player.character.ageYears >= 5 &&
    player.character.ageYears <= 30;

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

  return createMessageEvent(
    fname,
    "It's finally warm enough to swim! You spend the whole day at the pool/beach and get totally sunburned.",
    player,
    check,
    { energyCost: 10 }
  );
}

export function snowDay(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `snowDay_${player.character.ageYears}`;

  // Check winter months
  const currentMonth = parseInt(player.date.split('-')[0], 10);
  const isWinter = currentMonth === 12 || currentMonth === 1 || currentMonth === 2;
  const isStudentOrWork = player.character.occupation === 'student' || player.character.occupation === 'work';

  const check = !player.events.has(fname) &&
    isWinter &&
    player.character.ageYears >= 5 &&
    player.character.ageYears <= 65 &&
    isStudentOrWork &&
    checkProbability(20);

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

  const message = player.character.occupation === 'student'
    ? 'Heavy snow overnight! School is cancelled and you get an unexpected day off!'
    : 'Heavy snow overnight! Work is cancelled and you get an unexpected day off!';

  return createMessageEvent(fname, message, player, check);
}

export function newYearsResolution(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `newYearsResolution_${player.character.ageYears}`;
  const check = !player.askedQuestions.has(fname) &&
    player.date === '01-01' &&
    player.character.ageYears >= 10;

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

  return createQuestionEvent(
    fname,
    "What's your New Year's resolution?",
    player,
    check,
    {
      answerOptions: ['Exercise more', 'Save money', 'Make new friends', 'No resolutions']
    }
  );
}

export function blackFridayChaos(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = `blackFridayChaos_${player.character.ageYears}`;
  const check = !player.askedQuestions.has(fname) &&
    player.date === '11-24' &&
    player.character.ageYears >= 16;

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

  return createQuestionEvent(
    fname,
    'Black Friday is here! Brave the crowds for deals?',
    player,
    check,
    {
      answerOptions: [
        createAnswerOption('Yes, wake up early!', '', 20, 0, 200),
        createAnswerOption('Online shopping only', '', 0, 0, 150),
        createAnswerOption('Skip it completely'),
        createAnswerOption('Just window shop', '', 10, 0, 0)
      ]
    }
  );
}
