/**
 * @fileoverview Utility module for validators.js
 * 
 * @module games.automato.validation.validators
 */

import { BaseGameValidator } from "../../../../shared/BaseGameValidator";

/**
 * Validador do Automato Game.
 * Valida se o Pegman chegou ao objetivo (tile marcado como 3) e aplica
 * mensagens de feedback configuradas em `gameConfig`.
 *
 * @class AutomatoValidator
 * @extends BaseGameValidator
 */
class AutomatoValidator extends BaseGameValidator {
  /**
   * Valida a solução do aluno
   *
   * @param {Array} history - Histórico de ações (para debug/estatísticas)
   * @param {Object} config - Configuração da fase atual
   * @param {Object} gameConfig - Configuração global do jogo
   * @param {Object} sceneRef - Referência à cena Phaser
   * @returns {Object} { success: boolean, reason?: string }
   */
  validatePhase(history, config, gameConfig, sceneRef) {
    // Verificar se o jogo falhou (bateu na parede, etc)
    if (sceneRef && sceneRef.resultadoJogada === "falha") {
      return this.failure(
        gameConfig?.mensagens?.falhouExecucao ||
          "Você bateu em uma parede ou saiu do caminho!",
      );
    }

    // Validar se chegou no objetivo
    // A cena implementa chegouNoAlvo() que verifica se está no tile 3
    if (sceneRef && sceneRef.chegouNoAlvo && sceneRef.chegouNoAlvo()) {
      return this.success();
    }

    // Não chegou ao objetivo
    return this.failure(
      gameConfig?.mensagens?.naoChegou ||
        "Você não chegou ao objetivo! Verifique seu caminho.",
    );
  }
}

// Singleton para reutilização
const validatorInstance = new AutomatoValidator();

/**
 * Função exportada para validação de soluções do Automato Game
 *
 * @param {Array} history - Histórico de ações
 * @param {Object} config - Configuração da fase
 * @param {Object} gameConfig - Configuração global
 * @param {Object} sceneRef - Referência à cena (necessário para validação)
 * @returns {Object} { success: boolean, reason?: string }
 */
export const validateSolution = (history, config, gameConfig, sceneRef) => {
  return validatorInstance.validatePhase(history, config, gameConfig, sceneRef);
};
