import test from 'node:test';
import assert from 'node:assert';
import { requireCommonJS } from './_helpers/commonjs-bridge.js';
import { AutoReporter } from './reporters/AutoReporter.js';

/**
 * TESTS TI AVEC AUTO-REPORTING
 * Version simplifiée qui capture automatiquement tout depuis les logs
 */

// Auto-reporter qui se branche automatiquement sur les logs
const autoReporter = new AutoReporter();

const mockCsvData = {
  mc0: 'plaque test intégration rapide',
  t0: 'Test intégration modulaire rapide',
  personality: {
    nom: 'Marc',
    style: 'technique',
    description: 'Expert technique pour tests rapides'
  }
};

const mockContent = {
  'Titre_H1': 'Test titre avec contenu générique nécessitant amélioration technique',
  'Introduction': 'Introduction générique avec vocabulaire basique à améliorer',
  'Contenu_Principal': 'Contenu principal avec termes génériques optimal et efficace nécessitant précision technique',
  'Conclusion': 'Conclusion basique qui nécessite enhancement professionnel'
};

// =========================================
// TESTS ESSENTIELS AVEC AUTO-CAPTURE
// =========================================

test('lightEnhancement (rapide)', { timeout: 30000 }, async () => {
  autoReporter.onTestStart('lightEnhancement (rapide)');

  const { applyPredefinedStack } = requireCommonJS('selective-enhancement/SelectiveLayers');
  const result = await applyPredefinedStack(mockContent, 'lightEnhancement', {
    csvData: mockCsvData,
    analysisMode: true
  });

  assert.ok(result, 'Résultat lightEnhancement');
  assert.ok(result.content, 'Contenu généré');
  assert.equal(result.stats.stackName, 'lightEnhancement', 'Stack correct');
  console.log(`✅ lightEnhancement: ${result.stats.totalModifications} modifications en ${result.stats.totalDuration}ms`);
});

test('standardEnhancement (complet)', { timeout: 60000 }, async () => {
  autoReporter.onTestStart('standardEnhancement (complet)');

  const { applyPredefinedStack } = requireCommonJS('selective-enhancement/SelectiveLayers');
  const result = await applyPredefinedStack(mockContent, 'standardEnhancement', {
    csvData: mockCsvData,
    analysisMode: true
  });

  assert.ok(result, 'Résultat standardEnhancement');
  assert.ok(result.content, 'Contenu généré');
  assert.equal(result.stats.stackName, 'standardEnhancement', 'Stack correct');
  console.log(`✅ standardEnhancement: ${result.stats.layers.length} couches, ${result.stats.totalModifications} modifications`);
});

test('fullEnhancement (maximum)', { timeout: 90000 }, async () => {
  autoReporter.onTestStart('fullEnhancement (maximum)');

  const { applyPredefinedStack } = requireCommonJS('selective-enhancement/SelectiveLayers');
  const result = await applyPredefinedStack(mockContent, 'fullEnhancement', {
    csvData: mockCsvData,
    analysisMode: true
  });

  assert.ok(result, 'Résultat fullEnhancement');
  assert.ok(result.content, 'Contenu généré');
  assert.equal(result.stats.stackName, 'fullEnhancement', 'Stack correct');
  console.log(`✅ fullEnhancement: ${result.stats.layers.length} couches, ${result.stats.totalModifications} modifications`);
});

test('Adversarial general', { timeout: 45000 }, async () => {
  autoReporter.onTestStart('Adversarial general');

  const { applyAdversarialLayer } = requireCommonJS('adversarial-generation/AdversarialCore');
  const result = await applyAdversarialLayer(mockContent, {
    detectorTarget: 'general',
    method: 'regeneration',
    intensity: 0.8
  });

  assert.ok(result, 'Résultat adversarial general');
  console.log(`✅ Adversarial general: ${Object.keys(result).length} éléments traités`);
});

test('Pipeline Standard → Adversarial', { timeout: 120000 }, async () => {
  autoReporter.onTestStart('Pipeline Standard → Adversarial');

  const { applyPredefinedStack } = requireCommonJS('selective-enhancement/SelectiveLayers');
  const { applyAdversarialLayer } = requireCommonJS('adversarial-generation/AdversarialCore');

  // Étape 1: Selective standardEnhancement
  const step1 = await applyPredefinedStack(mockContent, 'standardEnhancement', {
    csvData: mockCsvData,
    analysisMode: true
  });

  assert.ok(step1?.content, 'Étape 1 standard réussie');

  // Étape 2: Adversarial sur résultat
  const step2 = await applyAdversarialLayer(step1.content, {
    detectorTarget: 'general',
    method: 'enhancement',
    intensity: 0.7
  });

  assert.ok(step2, 'Étape 2 adversarial réussie');
  console.log(`✅ Pipeline Standard→Adversarial: ${step1.stats.totalModifications} selective + adversarial`);
});

// =========================================
// GÉNÉRATION AUTOMATIQUE DU RAPPORT
// =========================================

test.after(() => {
  // Attendre un peu pour que tous les tests soient terminés et capturés
  setTimeout(() => {
    autoReporter.generateReport();
  }, 1000);
});