/**
 * Family Conflict Events
 * Negative events related to family relationships and conflicts
 *
 * Events:
 * - parentDivorce: Parents getting divorced (ages 5-18)
 * - siblingRivalry: Parents favoring sibling (ages 5-25)
 * - familyEstrangement: Major falling out with family (ages 18-100)
 * - parentIllness: Parent diagnosed with serious illness (ages 20-100)
 * - familyDebt: Family member needs financial help (ages 18-100)
 * - inheritanceDispute: Family fighting over inheritance (ages 30-100)
 */

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

/**
 * Parents getting divorced (ages 5-18)
 */
export function parentDivorce(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'parentDivorce';
  const ageYears = player.character.ageYears;

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

  const message = 'Your parents are getting divorced. Your whole world feels unstable.';

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

    // Decrease affinity with both parents
    const relationships = player.relationships ?? [];
    for (const person of relationships) {
      const title = person.title?.toLowerCase() ?? '';
      if (title === 'mother' || title === 'father') {
        person.affinity = (person.affinity ?? 0) - 20;
      }
    }
  }

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

/**
 * Parents clearly favoring sibling (ages 5-25)
 */
export function siblingRivalry(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'siblingRivalry';
  const ageYears = player.character.ageYears;

  // Find siblings
  const relationships = player.relationships ?? [];
  const siblings = relationships.filter((person) =>
    (person.relationships ?? []).some((rel) => rel.toLowerCase().includes('sibling'))
  );

  const check =
    !player.events.has(fname) &&
    ageYears >= 5 &&
    ageYears <= 25 &&
    siblings.length > 0 &&
    checkProbability(2000);

  const message =
    'Your parents are clearly favoring your sibling. You feel overlooked and undervalued.';

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

    // Decrease affinity with parents
    for (const person of relationships) {
      const title = person.title?.toLowerCase() ?? '';
      if (title === 'mother' || title === 'father') {
        person.affinity = (person.affinity ?? 0) - 15;
      }
    }

    // Decrease affinity with random sibling
    if (siblings.length > 0) {
      const sibling = siblings[Math.floor(Math.random() * siblings.length)];
      sibling.affinity = (sibling.affinity ?? 0) - 20;
    }
  }

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

/**
 * Major falling out with family members (ages 18-100)
 */
export function familyEstrangement(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'familyEstrangement';
  const ageYears = player.character.ageYears;

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

  const message = "You've had a major falling out with family members. You're not speaking anymore.";

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 35;
    player.character.stress = (player.character.stress ?? 0) + 30;

    // Decrease affinity with all family members
    const relationships = player.relationships ?? [];
    const familyTitles = ['mother', 'father', 'sibling', 'brother', 'sister', 'parent'];
    for (const person of relationships) {
      const title = person.title?.toLowerCase() ?? '';
      if (familyTitles.some((ft) => title.includes(ft))) {
        person.affinity = (person.affinity ?? 0) - 40;
      }
    }
  }

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

/**
 * Parent diagnosed with serious illness (ages 20-100)
 */
export function parentIllness(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'parentIllness';
  const ageYears = player.character.ageYears;

  // Check if player has at least one parent
  const relationships = player.relationships ?? [];
  const hasParent = relationships.some((person) => {
    const title = person.title?.toLowerCase() ?? '';
    return title === 'mother' || title === 'father';
  });

  const check =
    !player.events.has(fname) &&
    ageYears >= 20 &&
    ageYears <= 100 &&
    hasParent &&
    checkProbability(3000);

  const message = "Your parent has been diagnosed with a serious illness. You're worried and scared.";

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

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

/**
 * Family member needs financial help (ages 18-100)
 */
export function familyDebt(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'familyDebt';
  const ageYears = player.character.ageYears;

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

  const message = 'A family member needs financial help for an emergency. You feel obligated to help.';

  if (check) {
    player.events.add(fname);
    if (player.character.money >= 1000) {
      player.character.money -= 1000;
    } else {
      player.character.money = 0;
      player.character.stress = (player.character.stress ?? 0) + 20;
    }
    player.character.stress = (player.character.stress ?? 0) + 20;
    player.character.happiness -= 15;
  }

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

/**
 * Family fighting over inheritance (ages 30-100)
 */
export function inheritanceDispute(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'inheritanceDispute';
  const ageYears = player.character.ageYears;

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

  const message = 'Family members are fighting over inheritance. Relationships are being destroyed.';

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 25;
    player.character.stress = (player.character.stress ?? 0) + 30;

    // Decrease affinity with all family members
    const relationships = player.relationships ?? [];
    const familyTitles = ['mother', 'father', 'sibling', 'brother', 'sister', 'parent'];
    for (const person of relationships) {
      const title = person.title?.toLowerCase() ?? '';
      if (familyTitles.some((ft) => title.includes(ft))) {
        person.affinity = (person.affinity ?? 0) - 30;
      }
    }
  }

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