// ========================================
// FICHIER: HumanSimulationLayers.js
// RESPONSABILITÉ: Stacks prédéfinis Human Simulation
// Compatible avec architecture modulaire existante
// ========================================

const { logSh } = require('../ErrorReporting');
const { tracer } = require('../trace');
const { applyHumanSimulationLayer } = require('./HumanSimulationCore');

/**
 * STACKS PRÉDÉFINIS HUMAN SIMULATION
 * Configuration par niveau d'intensité
 */
const HUMAN_SIMULATION_STACKS = {
  
  // ========================================
  // SIMULATION LÉGÈRE - Pour tests et développement
  // ========================================
  lightSimulation: {
    name: 'lightSimulation',
    description: 'Simulation humaine légère - développement et tests',
    layersCount: 3,
    config: {
      fatigueEnabled: true,
      personalityErrorsEnabled: true,
      temporalStyleEnabled: false,      // Désactivé en mode light
      graduatedErrorsEnabled: true,     // ✅ Erreurs graduées procédurales
      imperfectionIntensity: 0.3,
      naturalRepetitions: true,
      qualityThreshold: 0,              // ✅ VALIDATION DÉSACTIVÉE
      maxModificationsPerElement: 2
    },
    expectedImpact: {
      modificationsPerElement: '1-2',
      qualityPreservation: '95%',
      detectionReduction: '10-15%',
      executionTime: '+20%'
    }
  },

  // ========================================
  // SIMULATION STANDARD - Usage production normal
  // ========================================
  standardSimulation: {
    name: 'standardSimulation',
    description: 'Simulation humaine standard - équilibre performance/qualité',
    layersCount: 3,
    config: {
      fatigueEnabled: true,
      personalityErrorsEnabled: true,
      temporalStyleEnabled: true,
      graduatedErrorsEnabled: true,     // ✅ Erreurs graduées procédurales
      imperfectionIntensity: 0.5,
      naturalRepetitions: true,
      qualityThreshold: 0,              // ✅ VALIDATION DÉSACTIVÉE
      maxModificationsPerElement: 3
    },
    expectedImpact: {
      modificationsPerElement: '2-3',
      qualityPreservation: '85%',
      detectionReduction: '25-35%',
      executionTime: '+40%'
    }
  },

  // ========================================
  // SIMULATION INTENSIVE - Maximum anti-détection
  // ========================================
  heavySimulation: {
    name: 'heavySimulation',
    description: 'Simulation humaine intensive - anti-détection maximale',
    layersCount: 3,
    config: {
      fatigueEnabled: true,
      personalityErrorsEnabled: true,
      temporalStyleEnabled: true,
      spellingErrorsEnabled: true,      // ✅ NOUVEAU
      imperfectionIntensity: 0.7,
      naturalRepetitions: true,
      qualityThreshold: 0,              // ✅ VALIDATION DÉSACTIVÉE
      maxModificationsPerElement: 4
    },
    expectedImpact: {
      modificationsPerElement: '3-5',
      qualityPreservation: '75%',
      detectionReduction: '40-50%',
      executionTime: '+60%'
    }
  },

  // ========================================
  // SIMULATION ADAPTIVE - Intelligence contextuelle
  // ========================================
  adaptiveSimulation: {
    name: 'adaptiveSimulation',
    description: 'Simulation humaine adaptive - ajustement intelligent selon contexte',
    layersCount: 3,
    config: {
      fatigueEnabled: true,
      personalityErrorsEnabled: true,
      temporalStyleEnabled: true,
      imperfectionIntensity: 'adaptive',  // Calculé dynamiquement
      naturalRepetitions: true,
      qualityThreshold: 'adaptive',       // Ajusté selon complexité
      maxModificationsPerElement: 'adaptive', // Variable
      adaptiveLogic: true                 // Flag pour logique adaptive
    },
    expectedImpact: {
      modificationsPerElement: '1-4',
      qualityPreservation: '80-90%',
      detectionReduction: '30-45%',
      executionTime: '+45%'
    }
  },

  // ========================================
  // SIMULATION PERSONNALISÉE - Focus personnalité
  // ========================================
  personalityFocus: {
    name: 'personalityFocus',
    description: 'Focus erreurs personnalité - cohérence maximale',
    layersCount: 2,
    config: {
      fatigueEnabled: false,            // Désactivé
      personalityErrorsEnabled: true,
      temporalStyleEnabled: false,      // Désactivé
      imperfectionIntensity: 1.0,       // Focus sur personnalité
      naturalRepetitions: true,
      qualityThreshold: 0.75,
      maxModificationsPerElement: 3
    },
    expectedImpact: {
      modificationsPerElement: '2-3',
      qualityPreservation: '85%',
      detectionReduction: '20-30%',
      executionTime: '+25%'
    }
  },

  // ========================================
  // SIMULATION TEMPORELLE - Focus variations horaires
  // ========================================
  temporalFocus: {
    name: 'temporalFocus',
    description: 'Focus style temporel - variations selon heure',
    layersCount: 2,
    config: {
      fatigueEnabled: false,
      personalityErrorsEnabled: false,
      temporalStyleEnabled: true,        // Focus principal
      imperfectionIntensity: 0.8,
      naturalRepetitions: true,
      qualityThreshold: 0.75,
      maxModificationsPerElement: 3
    },
    expectedImpact: {
      modificationsPerElement: '1-3',
      qualityPreservation: '85%',
      detectionReduction: '15-25%',
      executionTime: '+20%'
    }
  }
};

/**
 * APPLICATION STACK PRÉDÉFINI
 * @param {object} content - Contenu à simuler
 * @param {string} stackName - Nom du stack
 * @param {object} options - Options additionnelles
 * @returns {object} - Résultat simulation
 */
async function applyPredefinedSimulation(content, stackName, options = {}) {
  return await tracer.run(`HumanSimulationLayers.applyPredefinedSimulation(${stackName})`, async () => {
    
    const stack = HUMAN_SIMULATION_STACKS[stackName];
    if (!stack) {
      throw new Error(`Stack Human Simulation non trouvé: ${stackName}`);
    }

    await tracer.annotate({
      stackName,
      stackDescription: stack.description,
      layersCount: stack.layersCount,
      contentElements: Object.keys(content).length
    });

    logSh(`🧠 APPLICATION STACK: ${stack.name}`, 'INFO');
    logSh(`   📝 ${stack.description}`, 'DEBUG');
    logSh(`   ⚙️ ${stack.layersCount} couches actives`, 'DEBUG');

    try {
      // Configuration fusionnée
      let finalConfig = { ...stack.config, ...options };

      // ========================================
      // LOGIQUE ADAPTIVE (si applicable)
      // ========================================
      if (stack.config.adaptiveLogic) {
        finalConfig = await applyAdaptiveLogic(content, finalConfig, options);
        logSh(`   🧠 Logique adaptive appliquée`, 'DEBUG');
      }

      // ========================================
      // APPLICATION SIMULATION PRINCIPALE
      // ========================================
      const simulationOptions = {
        ...finalConfig,
        elementIndex: options.elementIndex || 0,
        totalElements: options.totalElements || Object.keys(content).length,
        currentHour: options.currentHour || new Date().getHours(),
        csvData: options.csvData,
        stackName: stack.name
      };

      const result = await applyHumanSimulationLayer(content, simulationOptions);

      // ========================================
      // ENRICHISSEMENT RÉSULTAT
      // ========================================
      const enrichedResult = {
        ...result,
        stackInfo: {
          name: stack.name,
          description: stack.description,
          layersCount: stack.layersCount,
          expectedImpact: stack.expectedImpact,
          configUsed: finalConfig
        }
      };

      logSh(`✅ STACK ${stack.name} terminé: ${result.stats.totalModifications} modifications`, 'INFO');
      
      await tracer.event('Stack Human Simulation terminé', {
        stackName,
        success: !result.fallback,
        modifications: result.stats.totalModifications,
        qualityScore: result.qualityScore
      });

      return enrichedResult;

    } catch (error) {
      logSh(`❌ ERREUR STACK ${stack.name}: ${error.message}`, 'ERROR');
      
      await tracer.event('Stack Human Simulation échoué', {
        stackName,
        error: error.message
      });

      // Fallback gracieux
      return {
        content,
        stats: { fallbackUsed: true, error: error.message },
        modifications: 0,  // ✅ AJOUTÉ: Mapping pour PipelineExecutor (fallback = 0 modifs)
        fallback: true,
        stackInfo: { name: stack.name, error: error.message }
      };
    }

  }, { stackName, contentElements: Object.keys(content).length });
}

/**
 * LOGIQUE ADAPTIVE INTELLIGENTE
 * Ajuste la configuration selon le contexte
 */
async function applyAdaptiveLogic(content, config, options) {
  logSh('🧠 Application logique adaptive', 'DEBUG');

  const adaptedConfig = { ...config };

  // ========================================
  // 1. ANALYSE COMPLEXITÉ CONTENU
  // ========================================
  const totalText = Object.values(content).join(' ');
  const wordCount = totalText.split(/\s+/).length;
  const avgElementLength = wordCount / Object.keys(content).length;

  // ========================================
  // 2. AJUSTEMENT INTENSITÉ SELON COMPLEXITÉ
  // ========================================
  if (avgElementLength > 200) {
    // Contenu long = intensité réduite pour préserver qualité
    adaptedConfig.imperfectionIntensity = 0.5;
    adaptedConfig.qualityThreshold = 0.8;
    logSh('   📏 Contenu long détecté: intensité réduite', 'DEBUG');
  } else if (avgElementLength < 50) {
    // Contenu court = intensité augmentée
    adaptedConfig.imperfectionIntensity = 1.0;
    adaptedConfig.qualityThreshold = 0.6;
    logSh('   📏 Contenu court détecté: intensité augmentée', 'DEBUG');
  } else {
    // Contenu moyen = intensité équilibrée
    adaptedConfig.imperfectionIntensity = 0.7;
    adaptedConfig.qualityThreshold = 0.7;
  }

  // ========================================
  // 3. AJUSTEMENT SELON PERSONNALITÉ
  // ========================================
  const personality = options.csvData?.personality;
  if (personality) {
    const personalityName = personality.nom.toLowerCase();
    
    // Personnalités techniques = moins d'erreurs de personnalité
    if (['marc', 'amara', 'fabrice'].includes(personalityName)) {
      adaptedConfig.imperfectionIntensity *= 0.8;
      logSh('   🎭 Personnalité technique: intensité erreurs réduite', 'DEBUG');
    }
    
    // Personnalités créatives = plus d'erreurs stylistiques  
    if (['sophie', 'émilie', 'chloé'].includes(personalityName)) {
      adaptedConfig.imperfectionIntensity *= 1.2;
      logSh('   🎭 Personnalité créative: intensité erreurs augmentée', 'DEBUG');
    }
  }

  // ========================================
  // 4. AJUSTEMENT SELON HEURE
  // ========================================
  const currentHour = options.currentHour || new Date().getHours();
  
  if (currentHour >= 22 || currentHour <= 6) {
    // Nuit = plus de fatigue, moins de complexité
    adaptedConfig.fatigueEnabled = true;
    adaptedConfig.temporalStyleEnabled = true;
    adaptedConfig.imperfectionIntensity *= 1.3;
    logSh('   🌙 Période nocturne: simulation fatigue renforcée', 'DEBUG');
  } else if (currentHour >= 6 && currentHour <= 10) {
    // Matin = énergie, moins d'erreurs
    adaptedConfig.imperfectionIntensity *= 0.7;
    logSh('   🌅 Période matinale: intensité réduite', 'DEBUG');
  }

  // ========================================
  // 5. LIMITATION SÉCURITÉ
  // ========================================
  adaptedConfig.imperfectionIntensity = Math.max(0.2, Math.min(1.5, adaptedConfig.imperfectionIntensity));
  adaptedConfig.qualityThreshold = Math.max(0.5, Math.min(0.9, adaptedConfig.qualityThreshold));
  
  // Modifs max adaptées à la taille du contenu
  adaptedConfig.maxModificationsPerElement = Math.min(6, Math.max(1, Math.ceil(avgElementLength / 50)));

  logSh(`   🎯 Config adaptée: intensité=${adaptedConfig.imperfectionIntensity.toFixed(2)}, seuil=${adaptedConfig.qualityThreshold.toFixed(2)}`, 'DEBUG');

  return adaptedConfig;
}

/**
 * OBTENIR STACKS DISPONIBLES
 * @returns {array} - Liste des stacks avec métadonnées
 */
function getAvailableSimulationStacks() {
  return Object.values(HUMAN_SIMULATION_STACKS).map(stack => ({
    name: stack.name,
    description: stack.description,
    layersCount: stack.layersCount,
    expectedImpact: stack.expectedImpact,
    configPreview: {
      fatigueEnabled: stack.config.fatigueEnabled,
      personalityErrorsEnabled: stack.config.personalityErrorsEnabled,
      temporalStyleEnabled: stack.config.temporalStyleEnabled,
      intensity: stack.config.imperfectionIntensity
    }
  }));
}

/**
 * VALIDATION STACK
 * @param {string} stackName - Nom du stack à valider
 * @returns {object} - Résultat validation
 */
function validateSimulationStack(stackName) {
  const stack = HUMAN_SIMULATION_STACKS[stackName];
  
  if (!stack) {
    return {
      valid: false,
      error: `Stack '${stackName}' non trouvé`,
      availableStacks: Object.keys(HUMAN_SIMULATION_STACKS)
    };
  }

  // Validation configuration
  const configIssues = [];
  
  if (typeof stack.config.imperfectionIntensity === 'number' && 
      (stack.config.imperfectionIntensity < 0 || stack.config.imperfectionIntensity > 2)) {
    configIssues.push('intensité hors limites (0-2)');
  }
  
  if (typeof stack.config.qualityThreshold === 'number' && 
      (stack.config.qualityThreshold < 0.3 || stack.config.qualityThreshold > 1)) {
    configIssues.push('seuil qualité hors limites (0.3-1)');
  }

  return {
    valid: configIssues.length === 0,
    stack,
    issues: configIssues,
    recommendation: configIssues.length > 0 ? 
      'Corriger la configuration avant utilisation' : 
      'Stack prêt à utiliser'
  };
}

/**
 * RECOMMANDATION STACK AUTOMATIQUE
 * @param {object} context - Contexte { contentLength, personality, hour, goal }
 * @returns {string} - Nom du stack recommandé
 */
function recommendSimulationStack(context = {}) {
  const { contentLength, personality, hour, goal } = context;

  logSh('🤖 Recommandation stack automatique', 'DEBUG');

  // Priorité 1: Objectif spécifique
  if (goal === 'development') return 'lightSimulation';
  if (goal === 'maximum_stealth') return 'heavySimulation';
  if (goal === 'personality_focus') return 'personalityFocus';
  if (goal === 'temporal_focus') return 'temporalFocus';

  // Priorité 2: Complexité contenu
  if (contentLength > 2000) return 'lightSimulation'; // Contenu long = prudent
  if (contentLength < 300) return 'heavySimulation';  // Contenu court = intensif

  // Priorité 3: Personnalité
  if (personality) {
    const personalityName = personality.toLowerCase();
    if (['marc', 'amara', 'fabrice'].includes(personalityName)) {
      return 'standardSimulation'; // Techniques = équilibré
    }
    if (['sophie', 'chloé', 'émilie'].includes(personalityName)) {
      return 'personalityFocus'; // Créatives = focus personnalité
    }
  }

  // Priorité 4: Heure
  if (hour >= 22 || hour <= 6) return 'temporalFocus'; // Nuit = focus temporel
  if (hour >= 6 && hour <= 10) return 'lightSimulation'; // Matin = léger

  // Par défaut: adaptive pour intelligence contextuelle
  logSh('   🎯 Recommandation: adaptiveSimulation (par défaut)', 'DEBUG');
  return 'adaptiveSimulation';
}

// ============= EXPORTS =============
module.exports = {
  applyPredefinedSimulation,
  getAvailableSimulationStacks,
  validateSimulationStack,
  recommendSimulationStack,
  applyAdaptiveLogic,
  HUMAN_SIMULATION_STACKS
};