/**
 * Puberty and Physical Development Events
 * Events related to puberty and physical changes (ages 10-16)
 *
 * Events:
 * - puberty: General puberty start event
 * - startedPeriod: First period for female characters
 * - braces: Getting braces
 * - glasses: Getting glasses
 */

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

/**
 * General puberty start event (age 12)
 */
export function puberty(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'puberty';
  const ageYears = player.character.ageYears;

  const check = ageYears === 12 && !player.events.has(fname);

  if (check) {
    player.events.add(fname);
    const message = 'You wake up to feel a dot on your face just under the skin. Welcome to puberty!';
    return createMessageEvent(fname, message, player, check);
  }

  return null;
}

/**
 * First period for female characters (ages 10-13)
 */
export function startedPeriod(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'startedPeriod';
  const ageYears = player.character.ageYears;

  const check =
    !player.events.has(fname) &&
    player.character.sex === 'Female' &&
    ageYears >= 10 &&
    ageYears < 14 &&
    checkProbability(1000);

  const message = 'You have started your first period';

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

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

/**
 * Getting braces (ages 7-19)
 */
export function braces(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'braces';
  const ageYears = player.character.ageYears;

  const check =
    !player.askedQuestions.has(fname) &&
    ageYears >= 7 &&
    ageYears < 20 &&
    checkProbability(10000);

  if (check) {
    player.askedQuestions.add(fname);
    // 50% chance of needing braces
    if (Math.random() > 0.5) {
      return null;
    } else {
      player.character.braces = true;
      const message = 'At a recent trip to the dentist they said you need to get braces!';
      return createMessageEvent(fname, message, player, true);
    }
  }

  return null;
}

/**
 * Getting glasses (ages 7-19)
 */
export function glasses(player: Player, _type: 'message' | 'question' = 'message'): EventResult {
  const fname = 'glasses';
  const ageYears = player.character.ageYears;

  const check =
    !player.askedQuestions.has(fname) &&
    ageYears >= 7 &&
    ageYears < 20 &&
    checkProbability(10000);

  if (check) {
    player.askedQuestions.add(fname);
    // 40% chance of needing glasses
    if (Math.random() > 0.6) {
      return null;
    } else {
      player.character.glasses = true;
      const message = 'At a recent trip to the eye doctor they said you need to get glasses!';
      return createMessageEvent(fname, message, player, true);
    }
  }

  return null;
}
