/**
 * Career Setback Events
 * Negative career and workplace events
 *
 * Events:
 * - passedOverPromotion: Missed deserved promotion
 * - workplaceBullying: Coworker making work life miserable
 * - projectFailure: Major project fails spectacularly
 * - badPerformanceReview: Harsh performance review
 * - businessFailure: Business is failing
 * - colleagueStealingCredit: Colleague takes credit for your work
 */

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

/**
 * Someone less qualified got the promotion you deserved (ages 25-65, working)
 */
export function passedOverPromotion(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'passedOverPromotion';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 25 &&
    ageYears <= 65 &&
    player.character.occupation === 'work' &&
    player.character.job &&
    checkProbability(1000);

  const message =
    "Someone less qualified got the promotion you deserved. You're frustrated and demoralized.";

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

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

/**
 * A coworker has been making your work life miserable (ages 18-65, working)
 */
export function workplaceBullying(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'workplaceBullying';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 18 &&
    ageYears <= 65 &&
    player.character.occupation === 'work' &&
    player.character.job &&
    checkProbability(1000);

  const message = 'A coworker has been making your work life miserable. You dread going in.';

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

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

/**
 * A major project you led failed spectacularly (ages 22-65, working)
 */
export function projectFailure(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'projectFailure';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 22 &&
    ageYears <= 65 &&
    player.character.occupation === 'work' &&
    player.character.job &&
    checkProbability(1000);

  const message = 'A major project you led failed spectacularly. Your reputation has taken a hit.';

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

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

/**
 * Your performance review was harsh (ages 22-65, working)
 */
export function badPerformanceReview(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'badPerformanceReview';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 22 &&
    ageYears <= 65 &&
    player.character.occupation === 'work' &&
    player.character.job &&
    checkProbability(1000);

  const message = 'Your performance review was harsh. Your boss listed all your shortcomings.';

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

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

/**
 * Your business is failing (ages 25-65, owns business)
 */
export function businessFailure(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'businessFailure';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 25 &&
    ageYears <= 65 &&
    player.character.ownsBusiness &&
    checkProbability(5000);

  const message = 'Your business is failing. You might have to close it down.';

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

  return createMessageEvent(fname, message, player, check, { moneyCost: 5000 });
}

/**
 * A colleague is stealing credit for your work (ages 22-65, working)
 */
export function colleagueStealingCredit(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'colleagueStealingCredit';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    ageYears >= 22 &&
    ageYears <= 65 &&
    player.character.occupation === 'work' &&
    player.character.job &&
    checkProbability(2000);

  const message =
    "You discover that a colleague has been taking credit for your work in meetings with upper management. You feel betrayed and frustrated.";

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

    // Find job ActivityRecord and reduce performance (reputation hit)
    const jobRecord = player.character.activityRecords?.find(
      (r: { type: string; id: string }) => r.type === 'job' && r.id === player.character.job?.id
    );
    if (jobRecord) {
      jobRecord.performance = Math.max(0, (jobRecord.performance ?? 50) - 10);
    }
  }

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