// ========================================
// FICHIER: PersonalityErrors.js  
// RESPONSABILITÉ: Erreurs cohérentes par personnalité
// 15 profils d'erreurs basés sur les personnalités système
// ========================================

const { logSh } = require('../ErrorReporting');

/**
 * PATTERNS D'ERREURS PAR PERSONNALITÉ
 * Basé sur les 15 personnalités du BrainConfig
 * Chaque personnalité a ses tics linguistiques et erreurs typiques
 */
const PERSONALITY_ERROR_PATTERNS = {
  
  // ========================================
  // PERSONNALITÉS TECHNIQUES
  // ========================================
  marc: {
    name: 'Marc - Expert Technique',
    tendencies: ['sur-technicisation', 'anglicismes techniques', 'jargon professionnel'],
    repetitions: ['précis', 'efficace', 'optimal', 'performant', 'système'],
    syntaxErrors: [
      'phrases techniques non finies',
      'parenthèses explicatives excessives',
      'abréviations sans développement'
    ],
    vocabularyTics: ['niveau technique', 'en termes de', 'au niveau de'],
    anglicisms: ['upgrade', 'process', 'workflow', 'pipeline'],
    errorFrequency: 0.7 // Probabilité base
  },

  amara: {
    name: 'Amara - Ingénieure Système',
    tendencies: ['méthodologie rigide', 'références normes', 'vocabulaire industriel'],
    repetitions: ['conforme', 'standard', 'spécifications', 'protocole'],
    syntaxErrors: ['énumérations lourdes', 'références normatives'],
    vocabularyTics: ['selon les normes', 'conformément à', 'dans le respect de'],
    anglicisms: ['compliance', 'standard', 'guidelines'],
    errorFrequency: 0.6
  },

  yasmine: {
    name: 'Yasmine - GreenTech',
    tendencies: ['éco-vocabulaire répétitif', 'superlatifs environnementaux'],
    repetitions: ['durable', 'écologique', 'responsable', 'vert', 'bio'],
    syntaxErrors: ['accumulation adjectifs éco', 'phrases militantes'],
    vocabularyTics: ['respectueux de l\'environnement', 'développement durable'],
    anglicisms: ['green', 'eco-friendly', 'sustainable'],
    errorFrequency: 0.8
  },

  fabrice: {
    name: 'Fabrice - Métallurgie',  
    tendencies: ['vocabulaire métier spécialisé', 'références techniques'],
    repetitions: ['résistant', 'robuste', 'solide', 'qualité', 'finition'],
    syntaxErrors: ['termes techniques sans explication'],
    vocabularyTics: ['en terme de résistance', 'question de solidité'],
    anglicisms: ['coating', 'finish', 'design'],
    errorFrequency: 0.5
  },

  // ========================================
  // PERSONNALITÉS CRÉATIVES
  // ========================================
  sophie: {
    name: 'Sophie - Déco Design',
    tendencies: ['vocabulaire déco répétitif', 'superlatifs esthétiques'],
    repetitions: ['magnifique', 'élégant', 'harmonieux', 'raffiné', 'style'],
    syntaxErrors: ['accord couleurs/matières', 'accumulation adjectifs'],
    vocabularyTics: ['en terme de style', 'au niveau esthétique', 'côté design'],
    anglicisms: ['design', 'style', 'trendy', 'vintage'],
    errorFrequency: 0.9
  },

  émilie: {
    name: 'Émilie - Digital Native',
    tendencies: ['anglicismes numériques', 'vocabulaire web'],
    repetitions: ['digital', 'online', 'connecté', 'smart', 'moderne'],
    syntaxErrors: ['néologismes numériques'],
    vocabularyTics: ['au niveau digital', 'côté technologique'],
    anglicisms: ['user-friendly', 'responsive', 'digital', 'smart'],
    errorFrequency: 1.0
  },

  chloé: {
    name: 'Chloé - Content Creator',
    tendencies: ['ton familier', 'expressions actuelles', 'anglicismes réseaux'],
    repetitions: ['super', 'génial', 'top', 'incontournable', 'tendance'],
    syntaxErrors: ['familiarités', 'expressions jeunes'],
    vocabularyTics: ['c\'est vraiment', 'on va dire que', 'du coup'],
    anglicisms: ['content', 'trending', 'viral', 'lifestyle'],
    errorFrequency: 1.1
  },

  minh: {
    name: 'Minh - Designer Industriel',
    tendencies: ['références design', 'vocabulaire forme/fonction'],
    repetitions: ['fonctionnel', 'ergonomique', 'esthétique', 'innovant'],
    syntaxErrors: ['descriptions techniques design'],
    vocabularyTics: ['en terme de design', 'niveau ergonomie'],
    anglicisms: ['design', 'user experience', 'ergonomic'],
    errorFrequency: 0.7
  },

  // ========================================
  // PERSONNALITÉS COMMERCIALES
  // ========================================
  laurent: {
    name: 'Laurent - Commercial BtoB',
    tendencies: ['vocabulaire vente', 'superlatifs commerciaux'],
    repetitions: ['excellent', 'exceptionnel', 'unique', 'incontournable'],
    syntaxErrors: ['promesses excessives', 'superlatifs empilés'],
    vocabularyTics: ['c\'est vraiment', 'je vous garantis', 'sans aucun doute'],
    anglicisms: ['business', 'deal', 'top niveau'],
    errorFrequency: 1.2
  },

  julie: {
    name: 'Julie - Architecture Commerciale',
    tendencies: ['vocabulaire technique commercial', 'références projets'],
    repetitions: ['projet', 'réalisation', 'conception', 'sur-mesure'],
    syntaxErrors: ['énumérations projets'],
    vocabularyTics: ['dans le cadre de', 'au niveau projet'],
    anglicisms: ['design', 'custom', 'high-end'],
    errorFrequency: 0.8
  },

  // ========================================
  // PERSONNALITÉS TERRAIN
  // ========================================
  kévin: {
    name: 'Kévin - Homme de Terrain',
    tendencies: ['expressions familières', 'vocabulaire pratique'],
    repetitions: ['pratique', 'concret', 'simple', 'direct', 'efficace'],
    syntaxErrors: ['tournures familières', 'expressions populaires'],
    vocabularyTics: ['franchement', 'concrètement', 'dans les faits'],
    anglicisms: ['basique', 'standard'],
    errorFrequency: 0.6
  },

  mamadou: {
    name: 'Mamadou - Artisan Expérimenté',
    tendencies: ['références tradition', 'vocabulaire métier'],
    repetitions: ['traditionnel', 'artisanal', 'savoir-faire', 'qualité'],
    syntaxErrors: ['expressions métier', 'références tradition'],
    vocabularyTics: ['comme on dit', 'dans le métier', 'selon l\'expérience'],
    anglicisms: [], // Évite les anglicismes
    errorFrequency: 0.4
  },

  linh: {
    name: 'Linh - Production Industrielle',
    tendencies: ['vocabulaire production', 'références process'],
    repetitions: ['production', 'fabrication', 'process', 'qualité', 'série'],
    syntaxErrors: ['termes production techniques'],
    vocabularyTics: ['au niveau production', 'côté fabrication'],
    anglicisms: ['process', 'manufacturing', 'quality'],
    errorFrequency: 0.5
  },

  // ========================================
  // PERSONNALITÉS PATRIMOINE
  // ========================================
  'pierre-henri': {
    name: 'Pierre-Henri - Patrimoine Classique',
    tendencies: ['vocabulaire soutenu', 'références historiques'],
    repetitions: ['traditionnel', 'authentique', 'noble', 'raffinement', 'héritage'],
    syntaxErrors: ['formulations recherchées', 'références culturelles'],
    vocabularyTics: ['il convient de', 'il est à noter que', 'dans la tradition'],
    anglicisms: [], // Évite complètement
    errorFrequency: 0.3
  },

  thierry: {
    name: 'Thierry - Créole Authentique',
    tendencies: ['expressions créoles', 'tournures locales'],
    repetitions: ['authentique', 'local', 'tradition', 'racines'],
    syntaxErrors: ['tournures créoles', 'expressions locales'],
    vocabularyTics: ['comme on dit chez nous', 'dans nos traditions'],
    anglicisms: [], // Privilégie le français local
    errorFrequency: 0.8
  }
};

/**
 * OBTENIR PROFIL D'ERREURS PAR PERSONNALITÉ
 * @param {string} personalityName - Nom personnalité
 * @returns {object} - Profil d'erreurs
 */
function getPersonalityErrorPatterns(personalityName) {
  const normalizedName = personalityName?.toLowerCase() || 'default';
  const profile = PERSONALITY_ERROR_PATTERNS[normalizedName];
  
  if (!profile) {
    logSh(`⚠️ Profil erreurs non trouvé pour ${personalityName}, utilisation profil générique`, 'WARNING');
    return createGenericErrorProfile();
  }
  
  logSh(`🎭 Profil erreurs sélectionné pour ${personalityName}: ${profile.name}`, 'DEBUG');
  return profile;
}

/**
 * PROFIL D'ERREURS GÉNÉRIQUE
 */
function createGenericErrorProfile() {
  return {
    name: 'Profil Générique',
    tendencies: ['répétitions standard', 'vocabulaire neutre'],
    repetitions: ['bien', 'bon', 'intéressant', 'important'],
    syntaxErrors: ['phrases standards'],
    vocabularyTics: ['en effet', 'par ailleurs', 'de plus'],
    anglicisms: [],
    errorFrequency: 0.5
  };
}

/**
 * INJECTION ERREURS PERSONNALITÉ
 * @param {string} content - Contenu à modifier
 * @param {object} personalityProfile - Profil personnalité
 * @param {number} intensity - Intensité (0-2.0)
 * @param {object} tracker - HumanSimulationTracker instance (optionnel)
 * @returns {object} - { content, modifications }
 */
function injectPersonalityErrors(content, personalityProfile, intensity = 1.0, tracker = null) {
  if (!content || !personalityProfile) {
    return { content, modifications: 0 };
  }

  logSh(`🎭 Injection erreurs personnalité: ${personalityProfile.name}`, 'DEBUG');

  let modifiedContent = content;
  let modifications = 0;

  // Probabilité d'application basée sur l'intensité et la fréquence du profil
  const baseFrequency = personalityProfile.errorFrequency || 0.5;
  const adjustedProbability = Math.min(1.0, baseFrequency * intensity);

  logSh(`🎯 Probabilité erreurs: ${adjustedProbability.toFixed(2)} (base: ${baseFrequency}, intensité: ${intensity})`, 'DEBUG');

  // ========================================
  // 1. RÉPÉTITIONS CARACTÉRISTIQUES
  // ========================================
  const repetitionResult = injectRepetitions(modifiedContent, personalityProfile, adjustedProbability, tracker);
  modifiedContent = repetitionResult.content;
  modifications += repetitionResult.count;

  // ========================================
  // 2. TICS VOCABULAIRE
  // ========================================
  const vocabularyResult = injectVocabularyTics(modifiedContent, personalityProfile, adjustedProbability);
  modifiedContent = vocabularyResult.content;
  modifications += vocabularyResult.count;

  // ========================================  
  // 3. ANGLICISMES (SI APPLICABLE)
  // ========================================
  if (personalityProfile.anglicisms && personalityProfile.anglicisms.length > 0) {
    const anglicismResult = injectAnglicisms(modifiedContent, personalityProfile, adjustedProbability * 0.3);
    modifiedContent = anglicismResult.content;
    modifications += anglicismResult.count;
  }

  // ========================================
  // 4. ERREURS SYNTAXIQUES TYPIQUES
  // ========================================
  const syntaxResult = injectSyntaxErrors(modifiedContent, personalityProfile, adjustedProbability * 0.2);
  modifiedContent = syntaxResult.content;
  modifications += syntaxResult.count;

  logSh(`🎭 Erreurs personnalité injectées: ${modifications} modifications`, 'DEBUG');

  return {
    content: modifiedContent,
    modifications
  };
}

/**
 * INJECTION RÉPÉTITIONS CARACTÉRISTIQUES
 * @param {object} tracker - HumanSimulationTracker instance (optionnel)
 */
function injectRepetitions(content, profile, probability, tracker = null) {
  let modified = content;
  let count = 0;

  if (!profile.repetitions || profile.repetitions.length === 0) {
    return { content: modified, count };
  }

  // Sélectionner MAXIMUM 1 mot répétitif - FIXÉ V3: SUBTIL
  const selectedWords = profile.repetitions
    .sort(() => 0.5 - Math.random())
    .slice(0, 1); // FIXÉ V3: UN SEUL mot maximum

  selectedWords.forEach(word => {
    // ✅ ANTI-RÉPÉTITION: Vérifier avec tracker si autorisé
    if (tracker && !tracker.canInjectWord(word, modified, 2)) {
      logSh(`   🚫 Mot "${word}" bloqué par tracker (déjà trop présent)`, 'DEBUG');
      return; // Skip ce mot
    }

    // FIXÉ V3.1: Probabilité ÉQUILIBRÉE (20%)
    if (Math.random() < (probability * 0.2)) {
      // Chercher des endroits appropriés pour injecter le mot
      const sentences = modified.split('. ');
      const targetSentenceIndex = Math.floor(Math.random() * sentences.length);

      if (sentences[targetSentenceIndex] &&
          sentences[targetSentenceIndex].length > 30 &&
          !sentences[targetSentenceIndex].toLowerCase().includes(word.toLowerCase())) {

        // Injecter le mot de façon naturelle
        const words = sentences[targetSentenceIndex].split(' ');
        const insertIndex = Math.floor(words.length * (0.3 + Math.random() * 0.4)); // 30-70% de la phrase

        // Adaptations contextuelles
        const adaptedWord = adaptWordToContext(word, words[insertIndex] || '');
        words.splice(insertIndex, 0, adaptedWord);

        sentences[targetSentenceIndex] = words.join(' ');
        modified = sentences.join('. ');
        count++;

        // ✅ Enregistrer dans tracker
        if (tracker) {
          tracker.trackInjectedWord(adaptedWord);
        }

        logSh(`   📝 Répétition injectée: "${adaptedWord}" dans phrase ${targetSentenceIndex + 1}`, 'DEBUG');
      }
    }
  });

  return { content: modified, count };
}

/**
 * INJECTION TICS VOCABULAIRE
 */
function injectVocabularyTics(content, profile, probability) {
  let modified = content;
  let count = 0;

  if (!profile.vocabularyTics || profile.vocabularyTics.length === 0) {
    return { content: modified, count };
  }

  const selectedTics = profile.vocabularyTics.slice(0, 1); // Un seul tic par contenu

  selectedTics.forEach(tic => {
    if (Math.random() < probability * 0.15) { // FIXÉ V3.1: Probabilité ÉQUILIBRÉE (15%)
      // Remplacer des connecteurs standards par le tic
      const standardConnectors = ['par ailleurs', 'de plus', 'également', 'aussi'];

      standardConnectors.forEach(connector => {
        const regex = new RegExp(`\\b${connector}\\b`, 'gi');
        if (modified.match(regex) && Math.random() < 0.2) { // FIXÉ V3.1: 20%
          modified = modified.replace(regex, tic);
          count++;
          logSh(`   🗣️ Tic vocabulaire: "${connector}" → "${tic}"`, 'DEBUG');
        }
      });
    }
  });

  return { content: modified, count };
}

/**
 * INJECTION ANGLICISMES
 */
function injectAnglicisms(content, profile, probability) {
  let modified = content;
  let count = 0;

  if (!profile.anglicisms || profile.anglicisms.length === 0) {
    return { content: modified, count };
  }

  // Remplacements français → anglais
  const replacements = {
    'processus': 'process',
    'conception': 'design', 
    'flux de travail': 'workflow',
    'mise à jour': 'upgrade',
    'contenu': 'content',
    'tendance': 'trending',
    'intelligent': 'smart',
    'numérique': 'digital'
  };

  Object.entries(replacements).forEach(([french, english]) => {
    if (profile.anglicisms.includes(english) && Math.random() < (probability * 0.1)) { // FIXÉ V3.1: 10%
      const regex = new RegExp(`\\b${french}\\b`, 'gi');
      if (modified.match(regex)) {
        modified = modified.replace(regex, english);
        count++;
        logSh(`   🇬🇧 Anglicisme: "${french}" → "${english}"`, 'DEBUG');
      }
    }
  });

  return { content: modified, count };
}

/**
 * INJECTION ERREURS SYNTAXIQUES
 */
function injectSyntaxErrors(content, profile, probability) {
  let modified = content;
  let count = 0;

  if (Math.random() > probability) {
    return { content: modified, count };
  }

  // Erreurs syntaxiques légères selon la personnalité
  if (profile.name.includes('Marc') || profile.name.includes('Technique')) {
    // Parenthèses techniques excessives
    if (Math.random() < 0.3) {
      modified = modified.replace(/(\w+)/, '$1 (système)');
      count++;
      logSh(`   🔧 Erreur technique: parenthèses ajoutées`, 'DEBUG');
    }
  }

  if (profile.name.includes('Sophie') || profile.name.includes('Déco')) {
    // Accumulation d'adjectifs
    if (Math.random() < 0.3) {
      modified = modified.replace(/élégant/gi, 'élégant et raffiné');
      count++;
      logSh(`   🎨 Erreur déco: adjectifs accumulés`, 'DEBUG');
    }
  }

  if (profile.name.includes('Laurent') || profile.name.includes('Commercial')) {
    // Superlatifs empilés
    if (Math.random() < 0.3) {
      modified = modified.replace(/excellent/gi, 'vraiment excellent');
      count++;
      logSh(`   💼 Erreur commerciale: superlatifs empilés`, 'DEBUG');
    }
  }

  return { content: modified, count };
}

/**
 * ADAPTATION CONTEXTUELLE DES MOTS
 */
function adaptWordToContext(word, contextWord) {
  // Accords basiques
  const contextLower = contextWord.toLowerCase();
  
  // Accords féminins simples
  if (contextLower.includes('la ') || contextLower.endsWith('e')) {
    if (word === 'bon') return 'bonne';
    if (word === 'précis') return 'précise';
  }
  
  return word;
}

// ============= EXPORTS =============
module.exports = {
  getPersonalityErrorPatterns,
  injectPersonalityErrors,
  injectRepetitions,
  injectVocabularyTics,
  injectAnglicisms,
  injectSyntaxErrors,
  createGenericErrorProfile,
  adaptWordToContext,
  PERSONALITY_ERROR_PATTERNS
};