#!/usr/bin/env node
// ========================================
// RUNNER TESTS D'INTÉGRATION
// Description: Lance les vrais tests qui valident le comportement système
// ========================================

const { spawn } = require('child_process');
const path = require('path');

console.log(`
╔════════════════════════════════════════════════════════════╗
║                 🔥 TESTS D'INTÉGRATION RÉELS                ║
║              Validation comportement système                ║
╚════════════════════════════════════════════════════════════╝
`);

async function runIntegrationTests() {
  const testFiles = [
    'real-workflow.test.js',
    'api-consistency.test.js'
  ];

  let totalTests = 0;
  let passedTests = 0;
  let failedTests = 0;

  for (const testFile of testFiles) {
    console.log(`\n🧪 === EXÉCUTION: ${testFile} ===`);

    try {
      const result = await runSingleTest(testFile);

      if (result.success) {
        console.log(`✅ ${testFile}: RÉUSSI`);
        passedTests += result.passed;
        totalTests += result.total;
      } else {
        console.log(`❌ ${testFile}: ÉCHEC`);
        failedTests += result.failed;
        totalTests += result.total;

        if (result.error) {
          console.error(`💥 Erreur: ${result.error}`);
        }
      }

    } catch (error) {
      console.error(`💥 Erreur fatale lors du test ${testFile}: ${error.message}`);
      failedTests++;
      totalTests++;
    }
  }

  // Résumé final
  console.log(`
╔════════════════════════════════════════════════════════════╗
║                     📊 RÉSUMÉ FINAL                        ║
╠════════════════════════════════════════════════════════════╣
║  Total tests:    ${totalTests.toString().padStart(3)} tests                              ║
║  Réussis:        ${passedTests.toString().padStart(3)} tests (${passedTests > 0 ? '✅' : '❌'})                           ║
║  Échoués:        ${failedTests.toString().padStart(3)} tests (${failedTests === 0 ? '✅' : '❌'})                           ║
║                                                            ║
║  Status global:  ${failedTests === 0 ? '🎯 TOUS LES TESTS RÉUSSIS' : '💥 DES TESTS ONT ÉCHOUÉ'}               ║
╚════════════════════════════════════════════════════════════╝
  `);

  if (failedTests > 0) {
    console.log(`
🚨 ACTION REQUISE:
   ${failedTests} test(s) ont échoué. Le système n'est pas prêt pour la production.
   Vérifie les erreurs ci-dessus et corrige les problèmes identifiés.
    `);
    process.exit(1);
  } else {
    console.log(`
🎉 SYSTÈME VALIDÉ:
   Tous les tests d'intégration sont passés.
   Le système est cohérent et prêt pour la production !
    `);
    process.exit(0);
  }
}

function runSingleTest(testFile) {
  return new Promise((resolve) => {
    const testPath = path.join(__dirname, testFile);

    console.log(`📡 Lancement: node --test ${testPath}`);

    const child = spawn('node', ['--test', testPath], {
      stdio: ['pipe', 'pipe', 'pipe'],
      cwd: path.join(__dirname, '../..')
    });

    let stdout = '';
    let stderr = '';

    child.stdout.on('data', (data) => {
      const output = data.toString();
      stdout += output;
      // Afficher en temps réel pour feedback
      process.stdout.write(output);
    });

    child.stderr.on('data', (data) => {
      const output = data.toString();
      stderr += output;
      // Afficher erreurs en temps réel
      process.stderr.write(output);
    });

    child.on('close', (code) => {
      const success = code === 0;

      // Parser les résultats du test runner Node.js
      const testResults = parseTestOutput(stdout);

      resolve({
        success,
        total: testResults.total,
        passed: testResults.passed,
        failed: testResults.failed,
        error: success ? null : (stderr || 'Test failed with code ' + code)
      });
    });

    child.on('error', (error) => {
      resolve({
        success: false,
        total: 1,
        passed: 0,
        failed: 1,
        error: error.message
      });
    });
  });
}

function parseTestOutput(output) {
  // Parser basique pour extraire les résultats du test runner Node.js
  const lines = output.split('\n');

  let total = 0;
  let passed = 0;
  let failed = 0;

  for (const line of lines) {
    // Chercher patterns comme "✓ test name" ou "✗ test name"
    if (line.includes('✓') || line.includes('ok ')) {
      passed++;
      total++;
    } else if (line.includes('✗') || line.includes('not ok ')) {
      failed++;
      total++;
    }

    // Parser summary si disponible
    const summaryMatch = line.match(/tests (\d+), pass (\d+), fail (\d+)/);
    if (summaryMatch) {
      total = parseInt(summaryMatch[1]);
      passed = parseInt(summaryMatch[2]);
      failed = parseInt(summaryMatch[3]);
      break;
    }
  }

  return { total, passed, failed };
}

// Configuration environnement pour les tests
process.env.NODE_ENV = 'test';
process.env.LOG_LEVEL = 'INFO'; // Réduire verbosité pendant tests

// Démarrer les tests
runIntegrationTests().catch((error) => {
  console.error(`💥 Erreur fatale du runner: ${error.message}`);
  process.exit(1);
});