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

/**
 * TESTS PRODUCTION WORKFLOW
 * Test du workflow production réel avec Google Sheets
 */

test('Production Workflow: handleFullWorkflow avec rowNumber 2', { timeout: 60000 }, async () => {
  console.log('🎯 Test Production Workflow - Démarrage...');

  const { handleFullWorkflow } = requireCommonJS('Main');

  // Test avec les paramètres production réels
  const productionData = {
    rowNumber: 2,
    source: 'production'
  };

  console.log('📊 Données de test:', productionData);

  try {
    const result = await handleFullWorkflow(productionData);

    // Vérifications de base
    assert.ok(result, 'Le workflow doit retourner un résultat');
    console.log('✅ Workflow production exécuté avec succès');

    // Log du résultat pour debug
    console.log('📋 Résultat workflow:', {
      type: typeof result,
      keys: result && typeof result === 'object' ? Object.keys(result) : 'N/A'
    });

  } catch (error) {
    console.error('❌ Erreur workflow production:', error.message);
    console.error('Stack:', error.stack);
    throw error;
  }
});

test('Production Workflow: Connectivité Google Sheets', { timeout: 30000 }, async () => {
  console.log('🔗 Test Connectivité Google Sheets...');

  const { readInstructionsData } = requireCommonJS('BrainConfig');

  try {
    const data = await readInstructionsData(2);

    assert.ok(data, 'Les données Google Sheets doivent être disponibles');
    assert.ok(data.slug || data.t0 || data.mc0, 'Les données doivent contenir au moins un champ');

    console.log('✅ Connexion Google Sheets OK');
    console.log('📊 Données récupérées:', {
      slug: data.slug ? 'OK' : 'MANQUE',
      t0: data.t0 ? 'OK' : 'MANQUE',
      mc0: data.mc0 ? 'OK' : 'MANQUE'
    });

  } catch (error) {
    console.error('❌ Erreur connexion Google Sheets:', error.message);
    throw error;
  }
});

test('Production Workflow: Test personnalité aléatoire', { timeout: 20000 }, async () => {
  console.log('🎭 Test Personnalité Aléatoire...');

  const { getPersonalities, selectPersonalityWithAI } = requireCommonJS('BrainConfig');

  try {
    const personalities = await getPersonalities();

    assert.ok(Array.isArray(personalities), 'Les personnalités doivent être un array');
    assert.ok(personalities.length > 0, 'Il doit y avoir des personnalités');

    console.log(`✅ ${personalities.length} personnalités chargées`);

    // Test sélection avec AI
    const selected = await selectPersonalityWithAI('test', 'test', personalities);

    assert.ok(selected, 'Une personnalité doit être sélectionnée');
    assert.ok(selected.nom, 'La personnalité doit avoir un nom');

    console.log(`✅ Personnalité sélectionnée: ${selected.nom}`);

  } catch (error) {
    console.error('❌ Erreur personnalités:', error.message);
    throw error;
  }
});

test('Production Workflow: Test LLM connectivity', { timeout: 25000 }, async () => {
  console.log('🤖 Test Connectivité LLM...');

  const { testLLMManager } = requireCommonJS('LLMManager');

  try {
    await testLLMManager();
    console.log('✅ LLM connectivity OK');

  } catch (error) {
    console.error('❌ Erreur LLM connectivity:', error.message);
    // Ne pas faire échouer le test si juste les LLMs sont down
    console.log('⚠️ LLM connectivity failed - continuing test suite');
  }
});

test('Production Workflow: Pipeline modulaire complet', { timeout: 90000 }, async () => {
  console.log('🔄 Test Pipeline Modulaire Complet...');

  const { handleModularWorkflow } = requireCommonJS('Main');

  const config = {
    rowNumber: 2,
    source: 'test_production_pipeline',
    selectiveStack: 'lightEnhancement',
    adversarialMode: 'none',
    humanSimulationMode: 'none',
    patternBreakingMode: 'none',
    saveIntermediateSteps: false
  };

  try {
    const result = await handleModularWorkflow(config);

    assert.ok(result, 'Le pipeline modulaire doit retourner un résultat');
    console.log('✅ Pipeline modulaire exécuté avec succès');

  } catch (error) {
    console.error('❌ Erreur pipeline modulaire:', error.message);
    throw error;
  }
});