// ========================================
// TREND MANAGER - GESTION TENDANCES PROMPTS
// Responsabilité: Configuration tendances pour moduler les prompts selon contexte
// ========================================

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

/**
 * TREND MANAGER
 * Gère les tendances configurables pour adapter les prompts selon le contexte
 */
class TrendManager {
  constructor() {
    this.name = 'TrendManager';
    this.currentTrend = null;
    this.customTrends = new Map();

    // Initialiser les tendances prédéfinies
    this.initializePredefinedTrends();
  }

  /**
   * TENDANCES PRÉDÉFINIES
   */
  initializePredefinedTrends() {
    this.predefinedTrends = {
      // ========== TENDANCES SECTORIELLES ==========

      'eco-responsable': {
        name: 'Eco-Responsable',
        description: 'Accent sur durabilité, écologie, responsabilité environnementale',
        config: {
          technical: {
            targetTerms: ['durable', 'écologique', 'responsable', 'recyclé', 'bio', 'naturel'],
            focusAreas: ['impact environnemental', 'cycle de vie', 'matériaux durables']
          },
          style: {
            targetStyle: 'conscient et responsable',
            tone: 'engagé mais pédagogique',
            values: ['durabilité', 'respect environnement', 'qualité long terme']
          },
          adversarial: {
            avoidTerms: ['jetable', 'synthétique', 'intensive'],
            emphasize: ['naturel', 'durable', 'responsable']
          }
        }
      },

      'tech-innovation': {
        name: 'Tech Innovation',
        description: 'Focus technologie avancée, innovation, digitalisation',
        config: {
          technical: {
            targetTerms: ['intelligent', 'connecté', 'automatisé', 'numérique', 'innovation'],
            focusAreas: ['technologie avancée', 'connectivité', 'automatisation']
          },
          style: {
            targetStyle: 'moderne et dynamique',
            tone: 'enthousiaste et précis',
            values: ['innovation', 'performance', 'efficacité']
          },
          adversarial: {
            avoidTerms: ['traditionnel', 'manuel', 'basique'],
            emphasize: ['intelligent', 'avancé', 'innovant']
          }
        }
      },

      'artisanal-premium': {
        name: 'Artisanal Premium',
        description: 'Savoir-faire artisanal, qualité premium, tradition',
        config: {
          technical: {
            targetTerms: ['artisanal', 'fait main', 'traditionnel', 'savoir-faire', 'premium'],
            focusAreas: ['qualité artisanale', 'techniques traditionnelles', 'finitions soignées']
          },
          style: {
            targetStyle: 'authentique et raffiné',
            tone: 'respectueux et valorisant',
            values: ['authenticité', 'qualité', 'tradition']
          },
          adversarial: {
            avoidTerms: ['industriel', 'masse', 'standard'],
            emphasize: ['unique', 'authentique', 'raffiné']
          }
        }
      },

      // ========== TENDANCES GÉNÉRATIONNELLES ==========

      'generation-z': {
        name: 'Génération Z',
        description: 'Style moderne, inclusif, digital native',
        config: {
          technical: {
            targetTerms: ['tendance', 'viral', 'personnalisable', 'inclusif', 'durable'],
            focusAreas: ['personnalisation', 'impact social', 'durabilité']
          },
          style: {
            targetStyle: 'moderne et inclusif',
            tone: 'décontracté mais informatif',
            values: ['authenticité', 'inclusivité', 'durabilité']
          },
          adversarial: {
            avoidTerms: ['traditionnel', 'conventionnel'],
            emphasize: ['moderne', 'inclusif', 'authentique']
          }
        }
      },

      'millenial-pro': {
        name: 'Millennial Pro',
        description: 'Efficacité, équilibre vie-travail, qualité',
        config: {
          technical: {
            targetTerms: ['efficace', 'pratique', 'gain de temps', 'qualité de vie'],
            focusAreas: ['efficacité', 'praticité', 'équilibre']
          },
          style: {
            targetStyle: 'pratique et équilibré',
            tone: 'professionnel mais humain',
            values: ['efficacité', 'équilibre', 'qualité']
          },
          adversarial: {
            avoidTerms: ['compliqué', 'chronophage'],
            emphasize: ['pratique', 'efficace', 'équilibré']
          }
        }
      },

      // ========== TENDANCES SAISONNIÈRES ==========

      'automne-cocooning': {
        name: 'Automne Cocooning',
        description: 'Chaleur, confort, intérieur douillet',
        config: {
          technical: {
            targetTerms: ['chaleureux', 'confortable', 'douillet', 'cosy', 'réconfortant'],
            focusAreas: ['ambiance chaleureuse', 'confort', 'bien-être']
          },
          style: {
            targetStyle: 'chaleureux et enveloppant',
            tone: 'bienveillant et réconfortant',
            values: ['confort', 'chaleur', 'sérénité']
          },
          adversarial: {
            avoidTerms: ['froid', 'strict', 'minimaliste'],
            emphasize: ['chaleureux', 'confortable', 'accueillant']
          }
        }
      },

      'printemps-renouveau': {
        name: 'Printemps Renouveau',
        description: 'Fraîcheur, renouveau, énergie positive',
        config: {
          technical: {
            targetTerms: ['frais', 'nouveau', 'énergisant', 'revitalisant', 'lumineux'],
            focusAreas: ['renouveau', 'fraîcheur', 'dynamisme']
          },
          style: {
            targetStyle: 'frais et dynamique',
            tone: 'optimiste et énergique',
            values: ['renouveau', 'fraîcheur', 'vitalité']
          },
          adversarial: {
            avoidTerms: ['terne', 'monotone', 'statique'],
            emphasize: ['frais', 'nouveau', 'dynamique']
          }
        }
      }
    };

    logSh(`✅ TrendManager: ${Object.keys(this.predefinedTrends).length} tendances prédéfinies chargées`, 'DEBUG');
  }

  /**
   * SÉLECTIONNER UNE TENDANCE
   */
  setTrend(trendId, customConfig = null) {
    return tracer.run('TrendManager.setTrend()', async () => {
      try {
        if (customConfig) {
          // Tendance personnalisée
          this.currentTrend = {
            id: trendId,
            name: customConfig.name || trendId,
            description: customConfig.description || 'Tendance personnalisée',
            config: customConfig.config,
            isCustom: true
          };

          logSh(`🎯 Tendance personnalisée appliquée: ${trendId}`, 'INFO');

        } else if (this.predefinedTrends[trendId]) {
          // Tendance prédéfinie
          this.currentTrend = {
            id: trendId,
            ...this.predefinedTrends[trendId],
            isCustom: false
          };

          logSh(`🎯 Tendance appliquée: ${this.currentTrend.name}`, 'INFO');

        } else if (this.customTrends.has(trendId)) {
          // Tendance personnalisée existante
          const customTrend = this.customTrends.get(trendId);
          this.currentTrend = {
            id: trendId,
            ...customTrend,
            isCustom: true
          };

          logSh(`🎯 Tendance personnalisée appliquée: ${this.currentTrend.name}`, 'INFO');

        } else {
          throw new Error(`Tendance inconnue: ${trendId}`);
        }

        await tracer.annotate({
          trendId,
          trendName: this.currentTrend.name,
          isCustom: this.currentTrend.isCustom
        });

        return this.currentTrend;

      } catch (error) {
        logSh(`❌ Erreur sélection tendance: ${error.message}`, 'ERROR');
        throw error;
      }
    });
  }

  /**
   * APPLIQUER TENDANCE À UNE CONFIGURATION DE COUCHE
   */
  applyTrendToLayerConfig(layerType, baseConfig = {}) {
    if (!this.currentTrend) {
      return baseConfig;
    }

    const trendConfig = this.currentTrend.config[layerType];
    if (!trendConfig) {
      return baseConfig;
    }

    // Fusionner configuration tendance avec configuration de base
    const enhancedConfig = {
      ...baseConfig,
      ...trendConfig,
      // Préserver les paramètres existants tout en ajoutant la tendance
      trendApplied: this.currentTrend.id,
      trendName: this.currentTrend.name
    };

    logSh(`🎨 Tendance "${this.currentTrend.name}" appliquée à ${layerType}`, 'DEBUG');

    return enhancedConfig;
  }

  /**
   * OBTENIR CONFIGURATION POUR UNE COUCHE SPÉCIFIQUE
   */
  getLayerConfig(layerType, baseConfig = {}) {
    const config = this.applyTrendToLayerConfig(layerType, baseConfig);

    return {
      ...config,
      _trend: this.currentTrend ? {
        id: this.currentTrend.id,
        name: this.currentTrend.name,
        appliedTo: layerType
      } : null
    };
  }

  /**
   * LISTER TOUTES LES TENDANCES DISPONIBLES
   */
  getAvailableTrends() {
    const trends = Object.keys(this.predefinedTrends).map(id => ({
      id,
      name: this.predefinedTrends[id].name,
      description: this.predefinedTrends[id].description,
      category: this.getTrendCategory(id),
      isCustom: false
    }));

    // Ajouter tendances personnalisées
    for (const [id, trend] of this.customTrends) {
      trends.push({
        id,
        name: trend.name,
        description: trend.description,
        category: 'custom',
        isCustom: true
      });
    }

    return trends;
  }

  /**
   * OBTENIR CATÉGORIE D'UNE TENDANCE
   */
  getTrendCategory(trendId) {
    if (trendId.includes('generation')) return 'générationnelle';
    if (trendId.includes('eco') || trendId.includes('tech') || trendId.includes('artisanal')) return 'sectorielle';
    if (trendId.includes('automne') || trendId.includes('printemps')) return 'saisonnière';
    return 'autre';
  }

  /**
   * CRÉER UNE TENDANCE PERSONNALISÉE
   */
  createCustomTrend(id, config) {
    this.customTrends.set(id, config);
    logSh(`✨ Tendance personnalisée créée: ${id}`, 'INFO');
    return config;
  }

  /**
   * RÉINITIALISER (AUCUNE TENDANCE)
   */
  clearTrend() {
    this.currentTrend = null;
    logSh('🔄 Aucune tendance appliquée', 'DEBUG');
  }

  /**
   * OBTENIR TENDANCE ACTUELLE
   */
  getCurrentTrend() {
    return this.currentTrend;
  }

  /**
   * OBTENIR STATUT
   */
  getStatus() {
    return {
      activeTrend: this.currentTrend ? {
        id: this.currentTrend.id,
        name: this.currentTrend.name,
        description: this.currentTrend.description,
        isCustom: this.currentTrend.isCustom
      } : null,
      availableTrends: this.getAvailableTrends().length,
      customTrends: this.customTrends.size
    };
  }
}

// ============= EXPORTS =============
module.exports = { TrendManager };