/**
 * Run a full lifecycle simulation and display all events
 */

import { HeadlessGame } from '../src/testing/index.js';

async function main() {
  console.log('Starting lifecycle simulation...\n');

  const game = new HeadlessGame({
    autoRespond: true,
    responseStrategy: 'random',
    logResponses: true,
    maxTicksPerAdvance: 100_000_000, // Allow full lifecycle
    playerOptions: {
      firstname: 'Alex',
      lastname: 'Chen',
      sex: 'Male',
    },
  });

  // Run to death or age 120
  await game.advanceToEnd(120);

  console.log('\n========================================');
  console.log('FULL LIFE STORY OF ' + game.player.c.fullName.toUpperCase());
  console.log('========================================\n');

  // Group events by age
  const events = game.getEvents();
  let lastAge = -1;

  console.log('LIFE EVENTS (' + events.length + ' total):');
  console.log('----------------------------------------');

  for (const e of events) {
    // Calculate age at event time (rough estimate based on total days at end)
    const eventAge = Math.floor(
      (game.player.c.ageDays * events.indexOf(e)) / events.length / 365
    );

    if (eventAge !== lastAge && eventAge > 0) {
      console.log('');
    }
    lastAge = eventAge;

    const message = e.event.message;
    const id = e.event.id;

    // Add some formatting based on event type
    if (id.includes('birthday')) {
      console.log(`🎂 ${message}`);
    } else if (id.includes('death')) {
      console.log(`💀 ${message}`);
    } else if (id.includes('first_day')) {
      console.log(`👶 ${message}`);
    } else {
      console.log(`📌 [${id}] ${message}`);
    }
  }

  // Show all questions that were asked
  const questions = game.getQuestions();
  if (questions.length > 0) {
    console.log('\n----------------------------------------');
    console.log('LIFE DECISIONS (' + questions.length + ' questions):');
    console.log('----------------------------------------');
    for (const q of questions) {
      console.log(`\n❓ ${q.message}`);
      console.log(`   Options: ${q.answers.map((a) => a.option).join(' | ')}`);
    }
  }

  // Show response log
  const responses = game.getResponseLog();
  if (responses.length > 0) {
    console.log('\n----------------------------------------');
    console.log('CHOICES MADE (' + responses.length + ' decisions):');
    console.log('----------------------------------------');
    for (const r of responses) {
      console.log(`  • ${r.questionId}: chose "${r.selectedOption}"`);
    }
  }

  console.log('\n');
  game.printSummary();

  // Additional stats
  console.log('LIFE STATISTICS:');
  console.log('----------------------------------------');
  console.log(`Final Money: $${game.player.c.money.toFixed(2)}`);
  console.log(`Final Health: ${game.player.c.health}%`);
  console.log(`Final Happiness: ${game.player.c.happiness.toFixed(1)}%`);
  console.log(`Final Intelligence: ${game.player.c.intelligence.toFixed(1)}`);
  console.log(`Final Stress: ${game.player.c.stress.toFixed(1)}`);
  console.log(`Relationships: ${game.player.r.length}`);
  console.log(`Children: ${game.player.c.children?.length ?? 0}`);
  console.log(`Partner: ${game.player.c.partner ?? 'None'}`);
  console.log(`Occupation: ${game.player.c.occupation}`);
  console.log(`Education: ${game.player.c.education}`);
  console.log('----------------------------------------\n');

  // Analysis - look for issues
  console.log('========================================');
  console.log('ANALYSIS & POTENTIAL ISSUES');
  console.log('========================================\n');

  const issues: string[] = [];

  // Check event distribution by age
  const eventsByDecade: Record<string, number> = {};
  const questionsByDecade: Record<string, number> = {};

  // Analyze events
  const eventIds = events.map(e => e.event.id);
  const uniqueEvents = new Set(eventIds);
  const duplicateEvents = eventIds.filter((id, i) => eventIds.indexOf(id) !== i);

  if (duplicateEvents.length > 0) {
    const dupCounts: Record<string, number> = {};
    duplicateEvents.forEach(id => dupCounts[id] = (dupCounts[id] || 0) + 1);
    const topDups = Object.entries(dupCounts)
      .sort((a, b) => b[1] - a[1])
      .slice(0, 10);
    issues.push(`DUPLICATE EVENTS: ${duplicateEvents.length} duplicates found`);
    topDups.forEach(([id, count]) => {
      issues.push(`  - "${id}" triggered ${count + 1} times`);
    });
  }

  // Check for missing life stages
  const ageYears = game.player.c.ageYears;
  if (ageYears < 60) {
    issues.push(`EARLY DEATH: Player died at ${ageYears}, missing senior content`);
  }

  // Check questions by type
  const questionTypes: Record<string, number> = {};
  questions.forEach(q => {
    const type = q.id.replace(/_\d+$/, ''); // Remove age suffix
    questionTypes[type] = (questionTypes[type] || 0) + 1;
  });

  const birthdayCount = questionTypes['birthday'] || 0;
  if (birthdayCount > ageYears + 5) {
    issues.push(`BIRTHDAY SPAM: ${birthdayCount} birthday questions for ${ageYears} years`);
  }

  // Check for events that should have happened
  const expectedEvents = [
    { id: 'learnedWalk', age: 2, desc: 'Learning to walk' },
    { id: 'lostFirstTooth', age: 8, desc: 'Lost first tooth' },
    { id: 'puberty', age: 14, desc: 'Puberty' },
    { id: 'learningToDrive', age: 17, desc: 'Learning to drive' },
  ];

  expectedEvents.forEach(exp => {
    if (ageYears >= exp.age && !uniqueEvents.has(exp.id)) {
      issues.push(`MISSING EVENT: "${exp.desc}" (${exp.id}) didn't trigger by age ${exp.age}`);
    }
  });

  // Check stat changes
  if (game.player.c.money === 0 && ageYears > 25) {
    issues.push(`NO INCOME: Player has $0 at age ${ageYears} - job/salary system may not be working`);
  }

  if (game.player.r.length === 0 && ageYears > 10) {
    issues.push(`NO RELATIONSHIPS: Player has no relationships at age ${ageYears}`);
  }

  if (!game.player.c.partner && ageYears > 30) {
    issues.push(`NO PARTNER: Player never found a partner by age ${ageYears}`);
  }

  if ((game.player.c.children?.length ?? 0) === 0 && ageYears > 40) {
    issues.push(`NO CHILDREN: Player had no children by age ${ageYears}`);
  }

  // Print issues
  if (issues.length === 0) {
    console.log('✅ No major issues detected!\n');
  } else {
    console.log(`Found ${issues.length} potential issues:\n`);
    issues.forEach((issue, i) => {
      console.log(`${i + 1}. ${issue}`);
    });
    console.log('');
  }

  // Event frequency analysis
  console.log('EVENT FREQUENCY BY TYPE:');
  console.log('----------------------------------------');
  const eventTypeCounts: Record<string, number> = {};
  events.forEach(e => {
    const type = e.event.id.replace(/_\d+$/, '');
    eventTypeCounts[type] = (eventTypeCounts[type] || 0) + 1;
  });
  Object.entries(eventTypeCounts)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 15)
    .forEach(([type, count]) => {
      console.log(`  ${type}: ${count}`);
    });
  console.log('');

  // Question frequency analysis
  console.log('QUESTION FREQUENCY BY TYPE:');
  console.log('----------------------------------------');
  Object.entries(questionTypes)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 15)
    .forEach(([type, count]) => {
      console.log(`  ${type}: ${count}`);
    });
  console.log('');
}

main().catch(console.error);
