/**
 * AutoResponder - Automatically responds to question events
 *
 * Handles automatic random (or configurable) responses to question events,
 * enabling lifecycle tests to run without manual intervention.
 */

import type { Player } from '../models/index.js';
import { config } from '../config.js';
import type { CollectedQuestion } from './OutputCollector.js';

export type ResponseStrategy = 'random' | 'first' | 'last';

export interface AutoResponderOptions {
  strategy?: ResponseStrategy;
  logResponses?: boolean;
}

export interface ResponseLogEntry {
  questionId: string;
  selectedOption: string;
  timestamp: Date;
}

export class AutoResponder {
  private strategy: ResponseStrategy;
  private logResponses: boolean;
  private responseLog: ResponseLogEntry[] = [];

  constructor(options: AutoResponderOptions = {}) {
    this.strategy = options.strategy ?? 'random';
    this.logResponses = options.logResponses ?? false;
  }

  /**
   * Select an answer option based on strategy
   */
  selectAnswer(question: CollectedQuestion): { option: string; index: number } {
    const answers = question.answers;
    if (answers.length === 0) {
      return { option: 'Yes', index: 0 };
    }

    let index: number;
    switch (this.strategy) {
      case 'first':
        index = 0;
        break;
      case 'last':
        index = answers.length - 1;
        break;
      case 'random':
      default:
        index = Math.floor(Math.random() * answers.length);
        break;
    }

    return {
      option: answers[index].option,
      index,
    };
  }

  /**
   * Process a question response and update player state
   */
  processResponse(player: Player, question: CollectedQuestion): void {
    const eventId = question.id;
    const selectedAnswer = this.selectAnswer(question);

    if (this.logResponses) {
      this.responseLog.push({
        questionId: eventId,
        selectedOption: selectedAnswer.option,
        timestamp: new Date(),
      });
      console.log(
        `[AutoResponder] Answering "${question.id}" with "${selectedAnswer.option}"`
      );
    }

    // Tier 3 note: legacy event-function dispatch was removed from runtime.
    // AutoResponder now tracks choices and advances loop state only.

    // Reset game speed (pattern from handlers/events.ts)
    if (player.previousGameSpeed !== undefined) {
      player.gameSpeed = player.previousGameSpeed;
    } else {
      player.gameSpeed = config.SPEED_DEFAULT;
    }

    // Mark question as asked
    if (!player.askedQuestions) {
      player.askedQuestions = new Set();
    }
    player.askedQuestions.add(eventId);
  }

  getResponseLog(): ResponseLogEntry[] {
    return [...this.responseLog];
  }

  clearLog(): void {
    this.responseLog = [];
  }
}
