/**
 * Social & Relationship Problem Events
 * Negative events related to social situations, friendships, and romantic relationships
 *
 * NOTE: Some social events exist in other modules:
 * - childhood/setbacks.ts: lostFavoriteToy, notInvitedToParty, scolded, lostGame, friendMovedAway
 * - adolescence/lifeEvents.ts: embarrassingSituation, groupProjectDrama
 * - adulthood/lifeEvents.ts: forgotBirthdayCall, friendsDrifting, unexpectedBill
 *
 * Events in this file:
 * - publicEmbarrassment: Hugely embarrassing moment in public
 * - friendshipBetrayal: Friend talking behind your back
 * - romanticRejection: Confession of feelings rejected
 * - breakup: Relationship ending with heartbreak
 * - socialMediaDrama: Drama on social media involving you
 * - leftOutOfGroup: Friend group making plans without you
 * - argumentWithFriend: Big fight with a close friend
 * - partyDisaster: Party you threw going terribly wrong
 * - lowAffinity: Relationship with someone has deteriorated (ages 10-100)
 */

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

/**
 * Hugely embarrassing moment in front of lots of people (ages 10-30)
 */
export function publicEmbarrassment(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'publicEmbarrassment';
  const ageYears = player.character.ageYears;

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

  const message =
    'You had a hugely embarrassing moment in front of lots of people. You want to disappear.';

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

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

/**
 * Friend has been talking behind your back (ages 10-100)
 */
export function friendshipBetrayal(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'friendshipBetrayal';
  const ageYears = player.character.ageYears;

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

  const message =
    'You found out a friend has been talking behind your back. You feel hurt and betrayed.';

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

    // 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) - 40;
    }
  }

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

/**
 * Confessed feelings to someone and got rejected (ages 12-30)
 */
export function romanticRejection(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'romanticRejection';
  const ageYears = player.character.ageYears;

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

  const message = 'You confessed your feelings to someone and they rejected you. It stings.';

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

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

/**
 * Relationship ending with heartbreak (ages 14-100, has partner with low affinity)
 */
export function breakup(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'breakup';
  const ageYears = player.character.ageYears;

  // Check if player has a partner with low affinity
  const hasPartner = !!player.character.partner;
  let partnerLowAffinity = false;

  if (hasPartner) {
    const relationships = player.relationships ?? [];
    const partner = relationships.find((p) => p.id === player.character.partner);
    if (partner && (partner.affinity ?? 100) < 40) {
      partnerLowAffinity = true;
    }
  }

  const check =
    !player.events.has(fname) &&
    ageYears >= 14 &&
    ageYears <= 100 &&
    hasPartner &&
    partnerLowAffinity &&
    checkProbability(2000);

  const message = "Your relationship ended. You're heartbroken and don't know how to move forward.";

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

    // Remove partner relationship
    player.character.partner = undefined;
  }

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

/**
 * Drama on social media involving you (ages 13-30)
 */
export function socialMediaDrama(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'socialMediaDrama';
  const ageYears = player.character.ageYears;

  // Age-based proxy for having social media
  const hasSocialMedia = ageYears >= 13;

  const check =
    !player.events.has(fname) &&
    ageYears >= 13 &&
    ageYears <= 30 &&
    hasSocialMedia &&
    checkProbability(1200);

  const message =
    'Drama on social media involving you. Everyone is talking about it and taking sides.';

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

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

/**
 * Friend group made plans without you (ages 10-25)
 */
export function leftOutOfGroup(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'leftOutOfGroup';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 10 &&
    ageYears <= 25 &&
    checkProbability(900);

  const message =
    "Your friend group made plans without you. You saw the photos and realize you've been excluded.";

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

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

/**
 * Big fight with a close friend (ages 8-100)
 */
export function argumentWithFriend(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'argumentWithFriend';
  const ageYears = player.character.ageYears;

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

  const message = "You had a big fight with a close friend. Things were said that can't be taken back.";

  if (check) {
    player.events.add(fname);
    player.character.happiness -= 20;
    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) - 25;
    }
  }

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

/**
 * Party you threw went terribly wrong (ages 16-30)
 */
export function partyDisaster(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'partyDisaster';
  const ageYears = player.character.ageYears;

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

  const message =
    'You threw a party and it went terribly wrong. People are talking about it for all the wrong reasons.';

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

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

/**
 * Relationship with someone has deteriorated (ages 10-100)
 * Triggered when a relationship's affinity drops too low
 */
export function lowAffinity(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'lowAffinity';
  const ageYears = player.character.ageYears;

  // Find relationships with low affinity (below 30)
  const relationships = player.relationships ?? [];
  const lowAffinityRelations = relationships.filter(
    (person) => (person.affinity ?? 50) < 30 && person.title !== 'Acquaintance'
  );

  const check =
    !player.events.has(fname) &&
    ageYears >= 10 &&
    ageYears <= 100 &&
    lowAffinityRelations.length > 0 &&
    checkProbability(1500);

  // Pick a random low-affinity relationship for the message
  const affectedPerson =
    lowAffinityRelations.length > 0
      ? lowAffinityRelations[Math.floor(Math.random() * lowAffinityRelations.length)]
      : null;
  const relationName = affectedPerson?.firstname ?? 'someone';
  const relationTitle = affectedPerson?.title?.toLowerCase() ?? 'close to you';

  const message = `Your relationship with ${relationName}, your ${relationTitle}, has really deteriorated. You barely talk anymore and there is tension whenever you are together.`;

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

    // Further decrease affinity with the affected person
    if (affectedPerson) {
      affectedPerson.affinity = (affectedPerson.affinity ?? 0) - 10;
    }
  }

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