#!/usr/bin/env node

// 🧪 TESTE DO MODO RIGOROSO - API ANALYZER V2.0
// Demonstra como o sistema para a execução quando não consegue acessar endpoints reais

const { analyzeAPIForDomain } = require('./create-domain-v2-api-analyzer.js');

console.log('🧪 TESTE DO MODO RIGOROSO - API ANALYZER V2.0');
console.log('='.repeat(50));

async function testStrictMode() {
  const testCases = [
    {
      name: 'product',
      description: 'Domínio que DEVERIA ter endpoint real',
      expectation: 'Deve parar execução se não conseguir acessar dados reais'
    },
    {
      name: 'nonexistent',
      description: 'Domínio que NÃO existe na API',
      expectation: 'Deve parar execução no modo rigoroso'
    }
  ];

  for (const testCase of testCases) {
    console.log(`\n${'='.repeat(60)}`);
    console.log(`🔍 TESTANDO: ${testCase.name.toUpperCase()}`);
    console.log(`📋 Descrição: ${testCase.description}`);
    console.log(`🎯 Expectativa: ${testCase.expectation}`);
    console.log('='.repeat(60));

    try {
      console.log('🔒 Executando em MODO RIGOROSO...\n');
      
      const result = await analyzeAPIForDomain(testCase.name, undefined, true);
      
      if (result.success) {
        console.log(`✅ SUCESSO! Estratégia: ${result.strategy}`);
        
        if (result.strategy === 'response_analysis') {
          console.log('🎉 DADOS REAIS DA API DETECTADOS!');
          console.log(`📊 Endpoint: ${result.metadata.endpoint}`);
          console.log(`📦 Sample size: ${result.metadata.sampleSize}`);
          
          console.log('\n📝 Interface gerada:');
          console.log(result.interface.split('\n').slice(0, 10).join('\n'));
          console.log('...');
        } else {
          console.log('⚠️ Usando estratégia alternativa (não dados reais)');
        }
      } else {
        console.log('❌ Falha na análise');
      }
      
    } catch (error) {
      if (error.code === 'ENDPOINT_ACCESS_FAILED') {
        console.log('\n🚨 ERRO CRÍTICO DETECTADO!');
        console.log(`❌ ${error.message}`);
        console.log(`🔗 Endpoint que falhou: ${error.endpoint}`);
        console.log('\n🎯 COMPORTAMENTO CORRETO: Sistema parou execução');
        console.log('📋 Isso é o esperado quando endpoint existe mas não consegue acessar');
        
      } else if (error.code === 'STRICT_MODE_FAILURE') {
        console.log('\n🚨 MODO RIGOROSO - TODAS AS ESTRATÉGIAS FALHARAM!');
        console.log(`❌ ${error.message}`);
        console.log('\n🎯 COMPORTAMENTO CORRETO: Sistema parou execução');
        console.log('📋 Isso é o esperado quando não consegue obter dados reais');
        
      } else {
        console.log('\n❌ ERRO INESPERADO:');
        console.log(error.message);
      }
    }

    console.log('\n' + '⏸️ '.repeat(30));
    
    // Pequena pausa entre testes
    await new Promise(resolve => setTimeout(resolve, 2000));
  }

  console.log('\n🏁 TESTE DE MODO RIGOROSO CONCLUÍDO');
  console.log('\n📊 RESUMO:');
  console.log('✅ Modo rigoroso implementado');
  console.log('✅ Sistema para execução quando não consegue acessar endpoints reais');
  console.log('✅ Erros informativos com soluções sugeridas');
  console.log('✅ Comportamento correto para diferentes cenários');
  
  console.log('\n🚀 PRONTO PARA PRODUÇÃO!');
  console.log('📋 Agora o Create-Domain V2.0 só gera interfaces baseadas em dados reais');
}

// Demonstração de uso normal vs rigoroso
async function demonstrateComparison() {
  console.log('\n' + '='.repeat(60));
  console.log('🔄 DEMONSTRAÇÃO: MODO NORMAL VS RIGOROSO');
  console.log('='.repeat(60));

  const testDomain = 'product';

  console.log('\n1️⃣ MODO NORMAL (strictMode = false):');
  try {
    const normalResult = await analyzeAPIForDomain(testDomain, undefined, false);
    console.log(`✅ Resultado: ${normalResult.strategy} (${normalResult.fields.length} campos)`);
    console.log('📋 Modo normal: Sempre retorna resultado (fallback se necessário)');
  } catch (error) {
    console.log(`❌ Erro no modo normal: ${error.message}`);
  }

  console.log('\n2️⃣ MODO RIGOROSO (strictMode = true):');
  try {
    const strictResult = await analyzeAPIForDomain(testDomain, undefined, true);
    console.log(`✅ Resultado: ${strictResult.strategy} (${strictResult.fields.length} campos)`);
    console.log('📋 Modo rigoroso: Só aceita dados reais da API');
  } catch (error) {
    console.log(`❌ Erro no modo rigoroso: ${error.message}`);
    console.log('📋 Modo rigoroso: Para execução se não conseguir dados reais');
  }
}

if (require.main === module) {
  testStrictMode()
    .then(() => demonstrateComparison())
    .catch(console.error);
} 