/**
 * Orchestrateur de synchro RC entre les écrans Tarif et Projet.
 */

(function(window) {
    'use strict';

    // Attendre que les dépendances soient chargées
    if (!window.RCSync || !window.RCDataManager) {
        console.error('Dependances RC Sync manquantes');
        return;
    }

    const { isFieldImpactingTarif, showReturnToTarifModal } = window.RCSync;
    const { collectAllTarifData, prefillTarifFromProjet } = window.RCDataManager;

    // ═══════════════════════════════════════════════════════════════════════
    // CONFIGURATION
    // ═══════════════════════════════════════════════════════════════════════

    const SESSION_STORAGE_KEYS = {
        TARIF_DATA: 'rc_tarif_validated_data',
        PROJET_DATA: 'rc_projet_data',
        TARIF_ORIGINAL: 'rc_tarif_original_for_comparison'
    };

    // ═══════════════════════════════════════════════════════════════════════
    // DÉTECTION DE LA PAGE ACTIVE
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Détecte si on est sur la page tarif ou projet.
     */
    function detectActivePage() {
        const params = new URLSearchParams(window.location.search);
        const submenu = params.get('submenu');
        
        if (submenu === 'tarif' || submenu === 'tarifrc') {
            return 'tarif';
        } else if (submenu === 'projet' || submenu === 'projetrc') {
            return 'projet';
        }
        
        return null;
    }

    /**
     * Détecte le produit courant à partir de la session.
     *
     * @returns {string|null} Code produit en minuscule
     */
    function detectCurrentProduct() {
        try {
            const contrat = JSON.parse(sessionStorage.getItem('contrat') || 'null');
            const fromContrat = contrat?.produit;
            if (fromContrat) return String(fromContrat).toLowerCase();

            const parcours = JSON.parse(sessionStorage.getItem('parcours') || 'null');
            const fromParcours = parcours?.["@expand"]?.contrat?.produit;
            return fromParcours ? String(fromParcours).toLowerCase() : null;
        } catch (error) {
            console.warn('Impossible de lire le produit courant:', error);
            return null;
        }
    }

    // ═══════════════════════════════════════════════════════════════════════
    // GESTION SESSIONSTORAGE
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Sauvegarde le snapshot du tarif validé en sessionStorage.
     */
    function saveTarifDataToSession(tarifData) {
        try {
            sessionStorage.setItem(SESSION_STORAGE_KEYS.TARIF_DATA, JSON.stringify(tarifData));
            sessionStorage.setItem(SESSION_STORAGE_KEYS.TARIF_ORIGINAL, JSON.stringify(tarifData));
            console.log('Donnees tarif sauvegardees en session');
        } catch (error) {
            console.error('Erreur sauvegarde session:', error);
        }
    }

    /**
     * Lit les données tarif sauvegardées en sessionStorage.
     */
    function getTarifDataFromSession() {
        try {
            const data = sessionStorage.getItem(SESSION_STORAGE_KEYS.TARIF_DATA);
            return data ? JSON.parse(data) : null;
        } catch (error) {
            console.error('Erreur lecture session:', error);
            return null;
        }
    }

    // ═══════════════════════════════════════════════════════════════════════
    // HOOK: APRÈS VALIDATION TARIF
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Hook appelé après validation tarif pour garder l'état en session.
     */
    function onTarifValidated() {
        console.log('Hook tarif valide: collecte des donnees');
        
        try {
            // Collecter toutes les données du tarif
            const tarifData = collectAllTarifData();
            
            // Sauvegarder en session pour le pré-remplissage projet
            saveTarifDataToSession(tarifData);
            
            console.log('Donnees tarif pretes pour le projet');
        } catch (error) {
            console.error('Erreur hook tarif valide:', error);
        }
    }

    // ═══════════════════════════════════════════════════════════════════════
    // INITIALISATION PAGE PROJET
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Initialisation côté projet.
     * Le pré-remplissage reste géré dans projet-form-rc.js.
     */
    function initProjetPage() {
        console.log('Initialisation RC Orchestrator pour la page Projet');

        const currentProduct = detectCurrentProduct();
        if (currentProduct === 'rc') {
            console.log('Projet RC detecte: la gestion modal est deja faite dans projet-form-rc.js');
            return;
        }
        
        // Les données rc/tarif/projet sont DÉJÀ chargées depuis la base
        // par le code existant dans projet-form-RC.js
        // On configure juste la détection des changements
        
        setTimeout(() => {
            setupProjetChangeDetection();
        }, 1000); // Attendre que prefillFromTarif() ait fini
    }

    /**
     * Fallback générique de détection d'impact sur la page projet.
     */
    function setupProjetChangeDetection() {
        // Les données originales sont dans les variables globales window.tarif et window.rc
        // définies par projet-form-RC.js
        const tarifOriginal = window.tarif;
        const rcOriginal = window.rc;
        
        if (!tarifOriginal && !rcOriginal) {
            console.log('Pas de tarif/rc, pas de detection');
            return;
        }

        console.log('Configuration de la detection des changements');
        console.log('Donnees originales:', { tarif: tarifOriginal, rc: rcOriginal });

        // Liste COMPLÈTE des éléments à surveiller (tous les champs impactants)
        const elementsToWatch = [
            // CA et infos générales
            'CA', 'chiffreAffaire', 'nombreVehicules', 'nbrVehicule',
            
            // Zones géographiques
            'zone1', 'zone2', 'zone3', 'zone4', 'zone5', 'zone6',
            
            // Protection Juridique
            'switchPJ', 'checkPJ',
            
            // RCE
            'choixRCE', 'checkRCE',
            
            // TPPC
            'checkTPPC', 'capitalTPPC', 'vehiculesTPPC',
            
            // Engagements complémentaires
            'checkDomImmat', 'checkContConf', 'checkDiffInv',
            
            // Garanties additionnelles
            'checkStationLavage', 'checkGarageInterne', 'checkCSE',
            
            // Sinistralité
            'nbSinistres3ans', 'montantSinistres3ans',
            
            // Autres
            'programmeInternationale', 'participationResultat'
        ];

        // Ajouter des listeners sur tous les éléments surveillés
        elementsToWatch.forEach(elementId => {
            const element = document.getElementById(elementId);
            if (!element) return;

            const eventType = element.type === 'checkbox' ? 'change' : 'blur';
            
            element.addEventListener(eventType, function(e) {
                const fieldName = this.id;
                const newValue = this.type === 'checkbox' ? this.checked : this.value;
                
                console.log(`Changement detecte: ${fieldName} = ${newValue}`);
                
                // Vérifier si c'est un champ impactant
                if (isFieldImpactingTarif(fieldName)) {
                    console.warn(`"${fieldName}" impacte le tarif`);
                    showReturnToTarifModal(fieldName);
                } else {
                    console.log(`"${fieldName}" n'impacte pas le tarif`);
                }
            });
        });

        // Surveiller les radio buttons (type de cotisation)
        const radioTypeCot = document.querySelectorAll('input[name="typeCot"]');
        radioTypeCot.forEach(radio => {
            radio.addEventListener('change', function() {
                console.log(`Changement type cotisation: ${this.value}`);
                console.warn('Type de cotisation impacte le tarif');
                showReturnToTarifModal('Type de cotisation');
            });
        });

        // Surveiller le select activités
        const activitySelector = document.getElementById('activity-selector');
        if (activitySelector) {
            activitySelector.addEventListener('change', function() {
                const selectedValues = Array.from(this.selectedOptions).map(opt => opt.value);
                console.log('Changement activites:', selectedValues);
                console.warn('Activites impactent le tarif');
                showReturnToTarifModal('Activités');
            });
        }

        // Surveiller le select marchandises
        const marchandiseSelector = document.getElementById('marchandise-selector');
        if (marchandiseSelector) {
            marchandiseSelector.addEventListener('change', function() {
                const selectedValues = Array.from(this.selectedOptions).map(opt => opt.value);
                console.log('Changement marchandises:', selectedValues);
                console.warn('Marchandises impactent le tarif');
                showReturnToTarifModal('Marchandises');
            });
        }

        // Surveiller les boutons d'action sur les zones (Monde entier / Reset)
        ['btnMondeEntier', 'btnReset'].forEach(btnId => {
            const btn = document.getElementById(btnId);
            if (!btn) return;
            btn.addEventListener('click', () => {
                console.log(`Changement zones via ${btnId}`);
                console.warn('Zones geographiques impactent le tarif');
                showReturnToTarifModal('Zones géographiques');
            });
        });

        console.log('Detection des changements configuree');
    }

    // ═══════════════════════════════════════════════════════════════════════
    // INITIALISATION PAGE TARIF
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Initialise le formulaire tarif au chargement.
     * Pré-remplit depuis le projet si l'utilisateur vient du projet.
     */
    function initTarifPage() {
        console.log('Initialisation page Tarif');
        
        // Vérifier si on vient du projet
        const projetData = JSON.parse(sessionStorage.getItem(SESSION_STORAGE_KEYS.PROJET_DATA) || 'null');
        
        if (projetData && !getTarifDataFromSession()) {
            // On a des données projet mais pas de tarif validé
            // = L'utilisateur a commencé par le projet
            console.log('Pre-remplissage depuis projet');
            
            setTimeout(() => {
                prefillTarifFromProjet(projetData);
            }, 500);
        }
    }

    // ═══════════════════════════════════════════════════════════════════════
    // INTERCEPTION DES FONCTIONS EXISTANTES
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Intercepte la fonction de validation du tarif commercial existante.
     * Ajoute notre hook avant la redirection.
     */
    function interceptTarifValidation() {
        // Attendre que la fonction window.saveTarifRC soit disponible
        const checkInterval = setInterval(() => {
            if (window.saveTarifRC) {
                clearInterval(checkInterval);
                
                // Sauvegarder la fonction originale
                const originalSaveTarifRC = window.saveTarifRC;
                
                // Remplacer par notre version wrappée
                window.saveTarifRC = async function(...args) {
                    console.log('Interception de saveTarifRC');
                    
                    // Appeler la fonction originale
                    const result = await originalSaveTarifRC.apply(this, args);
                    
                    // Si succès, appeler notre hook
                    if (result && result.valid) {
                        onTarifValidated();
                    }
                    
                    return result;
                };
                
                console.log('saveTarifRC intercepte');
            }
        }, 100);
        
        // Timeout après 5 secondes
        setTimeout(() => clearInterval(checkInterval), 5000);
    }

    // ═══════════════════════════════════════════════════════════════════════
    // DÉMARRAGE AUTOMATIQUE
    // ═══════════════════════════════════════════════════════════════════════

    /**
     * Initialise l'orchestrateur au chargement de la page.
     */
    function init() {
        console.log('RC Sync Orchestrator: demarrage');
        
        const activePage = detectActivePage();
        console.log(`Page active detectee: ${activePage || 'aucune'}`);
        
        if (activePage === 'tarif') {
            interceptTarifValidation();
            
            // Attendre que le formulaire soit initialisé
            setTimeout(() => {
                initTarifPage();
            }, 1000);
            
        } else if (activePage === 'projet') {
            // Attendre que le formulaire soit initialisé
            setTimeout(() => {
                initProjetPage();
            }, 1000);
        }
    }

    // Démarrage au chargement du DOM
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

    // ═══════════════════════════════════════════════════════════════════════
    // EXPORT PUBLIC
    // ═══════════════════════════════════════════════════════════════════════

    window.RCOrchestrator = {
        onTarifValidated,
        initProjetPage,
        initTarifPage,
        saveTarifDataToSession,
        getTarifDataFromSession
    };

    console.log('RC Sync Orchestrator loaded');

})(window);
