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

/**
 * Validador do jogo Aspirador (Atualizado para 10 Fases).
 * @class AspiradorValidator
 * @extends BaseGameValidator
 */
export class AspiradorValidator extends BaseGameValidator {
  validatePhase(history, config, gameConfig, sceneRef) {
    // 1. Sanity Check: O robô se mexeu?
    if (!history || history.length === 0) {
      return this.failure(gameConfig?.mensagens?.semMovimento || "O robô não saiu do lugar!");
    }

    // 2. Validação Específica por ID de Fase (Regras Pedagógicas)
    if (config.id === 5) {
      // Bordas: deve ter virado sempre para o mesmo lado para fazer o contorno
      const viradas = history.filter(h => h.tipo === 'virar');
      const soUmLado = new Set(viradas.map(v => v.valor)).size === 1;
      if (!soUmLado) return this.failure(config.msgErroValidacao);
    }

    if (config.id === 7 || config.id === 8) {
      // Verifica se o aluno usou o bloco de criar/incrementar variável
      const codigo = sceneRef?.currentCode || '';
      const temDeclaracao = /(?:var|let|const)\s+passos/.test(codigo);
      const temIncremento = /passos\s*(?:=\s*passos\s*\+\s*1|\+=\s*1|\+\+)/.test(codigo);
      
      if (!temDeclaracao || !temIncremento) {
        return this.failure(config.msgErroIncremento || "Você precisa usar a variável e incrementá-la!");
      }
    }

    if (config.id === 10) {
      // Zigue-Zague: deve ter virado para ambos os lados no padrão de espelho
      const viradas = history.filter(h => h.tipo === 'virar').map(h => h.valor);
      const usouAmbos = viradas.includes('ESQUERDA') && viradas.includes('DIREITA');
      if (!usouAmbos) return this.failure(config.msgErroValidacao);
    }

    // 3. Check Final Universal: Sobrou sujeira?
    if (sceneRef && sceneRef.aindaTemSujeira()) {
      return this.failure("Ainda há sujeira na sala! O algoritmo não cobriu toda a área.");
    }

    return this.success();
  }
}

export function validationSolution(history, config, gameConfig, sceneRef) {
  const validator = new AspiradorValidator();
  return validator.validate(history, config, gameConfig, sceneRef);
}