/**
 * Childhood Setback Events
 * Negative events and minor disappointments for young children (ages 2-18)
 *
 * Events:
 * - lostFavoriteToy: Lost favorite toy causing sadness
 * - notInvitedToParty: Feeling excluded from a birthday party
 * - scolded: Getting in trouble with parents
 * - lostGame: Losing a game and playing poorly
 * - friendMovedAway: Best friend moving to another city
 */

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

/**
 * Lost favorite toy (ages 2-8)
 */
export function lostFavoriteToy(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'lostFavoriteToy';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 2 &&
    ageYears <= 8 &&
    checkProbability(3000);

  const message = "You lost your favorite toy and can't find it anywhere. You're heartbroken.";

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

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

/**
 * Not invited to party (ages 5-12)
 */
export function notInvitedToParty(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'notInvitedToParty';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 5 &&
    ageYears <= 12 &&
    checkProbability(4000);

  const message =
    "Everyone in your class is talking about a birthday party you weren't invited to. You feel left out.";

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

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

/**
 * Scolded by parents (ages 3-12)
 */
export function scolded(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'scolded';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 3 &&
    ageYears <= 12 &&
    checkProbability(2500);

  const message = 'You got in trouble and your parents scolded you. You feel bad.';

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

    // Decrease affinity with parents if they exist
    const relationships = player.relationships ?? [];
    for (const person of relationships) {
      if (['Mother', 'Father', 'Parent'].includes(person.title ?? '')) {
        person.affinity = (person.affinity ?? 0) - 10;
      }
    }
  }

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

/**
 * Lost a game (ages 5-15)
 */
export function lostGame(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'lostGame';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 5 &&
    ageYears <= 15 &&
    checkProbability(3500);

  const message = "Your team lost the game and you played poorly. You're disappointed in yourself.";

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

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

/**
 * Friend moved away (ages 5-18)
 */
export function friendMovedAway(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'friendMovedAway';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 5 &&
    ageYears <= 18 &&
    checkProbability(8000);

  const message = "Your best friend is moving to another city. You're sad you won't see them anymore.";

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 25;
    player.character.social = (player.character.social ?? 0) - 15;

    // Decrease affinity with a random friend if they exist
    const relationships = player.relationships ?? [];
    const friends = relationships.filter((p) => p.title === 'Friend');
    if (friends.length > 0) {
      const friend = friends[Math.floor(Math.random() * friends.length)];
      friend.affinity = (friend.affinity ?? 0) - 30;
    }
  }

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