/**
 * Cyber-Assistant - Configuration et constantes
 * Ce fichier contient les constantes partagées par l'application.
 * Il est chargé AVANT bundle.js pour permettre l'extraction progressive.
 */
(function() {
  'use strict';

  // Mapping domaines ISO27002 par préfixe de numéro
  window.DOMAIN_BY_PREFIX = {
    '5': 'Organisationnel',
    '6': 'Humain',
    '7': 'Physique',
    '8': 'Technologique'
  };

  // Normalisation des clés de capacité
  window.normalizeCapabilityKey = function(value) {
    return value
      .normalize('NFD')
      .replace(/[\u0300-\u036f]/g, '')
      .toLowerCase()
      .replace(/[\s'']+/g, "_")
      .replace(/_+/g, "_");
  };

  // Capacités opérationnelles ISO27002
  const CAPABILITY_LABELS = [
    "Gouvernance",
    "Gestion_des_actifs",
    "Protection_des_informations",
    "Sécurité_des_ressources_humaines",
    "Sécurité_physique",
    "Sécurité_système_et_réseau",
    "Sécurité_des_applications",
    "Configuration_sécurisée",
    "Gestion_des_identités_et_des_accès",
    "Gestion_des_menaces_et_des_vulnérabilités",
    "Continuité",
    "Sécurité_des_relations_fournisseurs",
    "Réglementation_et_conformité",
    "Gestion_des_événements_de_sécurité_de_l'information",
    "Assurance_de_sécurité_de_l'information"
  ];

  window.OPERATIONAL_CAPABILITIES = CAPABILITY_LABELS.map(function(label) {
    return {
      key: window.normalizeCapabilityKey(label),
      label: label.replace(/_/g, " ")
    };
  });

  // ---- CyFun / NIS2 categories (dynamic, rebuilt on level change) ----
  // CYFUN_CATEGORIES is the authoritative list, rebuilt by setCyfunAssuranceLevel()
  // NIS2_CATEGORIES is a legacy alias for backward compatibility
  window.CYFUN_CATEGORIES = [];
  window.NIS2_CATEGORIES = window.CYFUN_CATEGORIES; // legacy alias

  // CyFun assurance levels
  window.CYFUN_ASSURANCE_LEVELS = [
    { id: 'basic', label: 'BASIC', order: 1, requirementCount: 34, keyMeasureCount: 13 },
    { id: 'important', label: 'IMPORTANT', order: 2, requirementCount: 133, keyMeasureCount: 22 },
    { id: 'essential', label: 'ESSENTIAL', order: 3, requirementCount: 218, keyMeasureCount: 29 }
  ];

  // CyFun functions (NIST CSF 2.0)
  window.CYFUN_FUNCTIONS = [
    { id: 'GV', label: 'Gouverner', labelEn: 'Govern', order: 1, icon: 'fa-landmark', color: '#7c3aed' },
    { id: 'ID', label: 'Identifier', labelEn: 'Identify', order: 2, icon: 'fa-magnifying-glass', color: '#2563eb' },
    { id: 'PR', label: 'Protéger', labelEn: 'Protect', order: 3, icon: 'fa-shield-halved', color: '#059669' },
    { id: 'DE', label: 'Détecter', labelEn: 'Detect', order: 4, icon: 'fa-radar', color: '#d97706' },
    { id: 'RS', label: 'Répondre', labelEn: 'Respond', order: 5, icon: 'fa-bolt', color: '#dc2626' },
    { id: 'RC', label: 'Rétablir', labelEn: 'Recover', order: 6, icon: 'fa-rotate-right', color: '#0891b2' }
  ];

  // CyFun maturity levels (Documentation + Implementation)
  window.CYFUN_MATURITY_LEVELS = [
    { value: 1, label: 'Initial', labelEn: 'Initial' },
    { value: 2, label: 'Répétable', labelEn: 'Repeatable' },
    { value: 3, label: 'Défini', labelEn: 'Defined' },
    { value: 4, label: 'Géré', labelEn: 'Managed' },
    { value: 5, label: 'Optimisé', labelEn: 'Optimizing' }
  ];

  // Build CYFUN_CATEGORIES from the framework data (called after cyfun2025.js loads)
  window.rebuildCyfunCategories = function(level) {
    level = level || 'basic';
    var fw = (window._csiFrameworks || {})['cyfun2025'];
    if (!fw || !fw.meta || !fw.meta.categories) return;
    var levelOrder = { basic: 1, important: 2, essential: 3 };
    var maxOrder = levelOrder[level] || 1;
    var filtered = fw.meta.categories.filter(function(cat) {
      return cat.levels.some(function(l) { return (levelOrder[l] || 99) <= maxOrder; });
    });
    // Replace array contents in-place so NIS2_CATEGORIES alias stays valid
    window.CYFUN_CATEGORIES.length = 0;
    filtered.forEach(function(cat) { window.CYFUN_CATEGORIES.push(cat.id); });
  };

  // ---- ReCyF (Référentiel Cyber France / ANSSI) — NIS2 « France » ----
  // Référentiel indépendant de CyFun. Modèle d'évaluation = conformité (pas de maturité 1-5).

  // Degrés ReCyF (cumulatif : essentielle = surensemble de importante)
  window.RECYF_LEVELS = [
    { id: 'importante', label: 'Entité Importante', short: 'EI', order: 1, objectivesRange: '1-15' },
    { id: 'essentielle', label: 'Entité Essentielle', short: 'EE', order: 2, objectivesRange: '1-20' }
  ];

  // Statuts de conformité ReCyF (moyens acceptables de conformité ANSSI)
  // 'alternatif' = mesure alternative au moyen acceptable (autorisée par l'ANSSI, à justifier)
  window.RECYF_CONFORMITY_OPTIONS = [
    { value: 'non_evalue',     label: 'Non évalué',              labelEn: 'Not assessed',        color: '#9ca3af', weight: null },
    { value: 'conforme',       label: 'Conforme',                labelEn: 'Compliant',           color: '#059669', weight: 1 },
    { value: 'partiel',        label: 'Partiellement conforme',  labelEn: 'Partially compliant', color: '#d97706', weight: 0.5 },
    { value: 'non_conforme',   label: 'Non conforme',            labelEn: 'Non-compliant',       color: '#dc2626', weight: 0 },
    { value: 'alternatif',     label: 'Mesure alternative',      labelEn: 'Alternative measure', color: '#2563eb', weight: 1 },
    { value: 'non_applicable', label: 'Non applicable',          labelEn: 'Not applicable',      color: '#6b7280', weight: null }
  ];

  // RECYF_THEMES : liste active des identifiants de thématiques pour le degré courant
  // (reconstruite par rebuildRecyfThemes, à l'image de CYFUN_CATEGORIES)
  window.RECYF_THEMES = [];
  window.RECYF_OBJECTIVES_ACTIVE = [];

  // Reconstruit RECYF_THEMES / RECYF_OBJECTIVES_ACTIVE depuis les données recyf2025
  window.rebuildRecyfThemes = function(level) {
    level = level || 'importante';
    var fw = (window._csiFrameworks || {})['recyf2025'];
    if (!fw || !fw.meta) return;
    var levelOrder = { importante: 1, essentielle: 2 };
    var maxOrder = levelOrder[level] || 1;
    window.RECYF_THEMES.length = 0;
    (fw.meta.themes || []).forEach(function(th) {
      var visible = (th.levels || []).some(function(l) { return (levelOrder[l] || 99) <= maxOrder; });
      if (visible) window.RECYF_THEMES.push(th.id);
    });
    window.RECYF_OBJECTIVES_ACTIVE.length = 0;
    (fw.meta.objectives || []).forEach(function(o) {
      var visible = (o.levels || []).some(function(l) { return (levelOrder[l] || 99) <= maxOrder; });
      if (visible) window.RECYF_OBJECTIVES_ACTIVE.push(o.id);
    });
  };

  // Configuration des thèmes
  window.THEME_OPTIONS = [
    { value: "light", label: "Clair" },
    { value: "dark", label: "Sombre" },
    { value: "poudre", label: "Poudre" },
    { value: "bleu", label: "Bleu" }
  ];
  window.DEFAULT_THEME = "poudre";
  window.THEME_STORAGE_KEY = "smsi_theme";

  // Statuts des contrôles (kept for ISO 27002 controls)
  window.CONTROL_STATUS_OPTIONS = [
    { value: "non_implemente", label: "Non implémenté" },
    { value: "en_cours", label: "En cours" },
    { value: "implemente", label: "Implémenté" },
    { value: "verifie", label: "Vérifié" }
  ];

  // Niveaux CMM (legacy, kept for ISO 27002 controls)
  window.CMM_LEVEL_OPTIONS = [
    { value: "Initial", label: "Initial" },
    { value: "Répétable", label: "Répétable" },
    { value: "Défini", label: "Défini" },
    { value: "Géré", label: "Géré" },
    { value: "Optimisé", label: "Optimisé" }
  ];

  // Domaines ISO27002
  window.DOMAIN_OPTIONS = ["Organisationnel", "Humain", "Physique", "Technologique", "Non classé"];

  // Types de relation pour le mapping transversal
  window.MAPPING_RELATIONSHIP_TYPES = [
    { value: 'equivalent', label: 'Équivalent', icon: 'fa-equals', color: '#3b82f6' },
    { value: 'covers', label: 'Couvre', icon: 'fa-arrow-right', color: '#10b981' },
    { value: 'covered_by', label: 'Couvert par', icon: 'fa-arrow-left', color: '#f59e0b' },
    { value: 'related', label: 'Lié', icon: 'fa-link', color: '#6b7280' }
  ];

  // Configuration par défaut du framework mapper
  // Uses a getter to resolve the active controls framework at read time
  // (constants.js loads before framework data, so we can't hardcode the ID)
  window.FRAMEWORK_MAPPER_DEFAULTS = {
    get enabledFrameworks() {
      var fws = window._csiFrameworks || {};
      var ctrlId = fws['iso27002'] ? 'iso27002' : (fws['open-security-controls'] ? 'open-security-controls' : 'iso27002');
      return [ctrlId, 'nis2'];
    },
    customMappings: [],
    userNotes: {}
  };

  // Maturité NIS2 par défaut (dynamic, rebuilt by rebuildCyfunCategories)
  window.DEFAULT_NIS2_MATURITY = {};

  // Log de chargement
  if (typeof console !== 'undefined' && console.log) {
    void 0;
  }

})();
