document.addEventListener('DOMContentLoaded', function() {
    var inputChanged = false

    function openModalUpdate(selectedSubmenu, numParcours) {
        const elem = document.getElementById('modalUpdate');
        const instance = M.Modal.getInstance(elem);

        document.getElementById('update-OK').addEventListener("click", function () {
            instance.close()
            loadForm(selectedSubmenu, numParcours); 
            inputChanged = false
        })
        instance.open();
    }

    // Fonction pour charger le contenu du formulaire
    function loadForm(submenu, numParcours) {
        const navLinks = document.querySelectorAll('#navParcoursSelect li a');
        const formContainer = document.querySelector('#formContainer');

        // Supprimer la classe 'active' de tous les liens
        navLinks.forEach(navLink => navLink.parentNode.classList.remove('active'));

        // Ajouter la classe 'active' au lien sélectionné
        const activeLink = document.querySelector(`#navParcoursSelect li a[href="${submenu}"]`);

        if (activeLink) {
            activeLink.parentNode.classList.add('active');
        }

        const parcours = JSON.parse(sessionStorage.getItem('parcours'));
        const contrat = JSON.parse(sessionStorage.getItem('contrat'));
        let produit = parcours["@expand"].contrat.produit

        const produitObj = contrat?.["@expand"]?.enCours || null;
        const tarif = produitObj?.["@expand"]?.tarif || null;
        const projet = produitObj?.["@expand"]?.projet || null;

        let scriptSrc;
        // let newScriptModuloSrc;

        // Mettre à jour l'URL sans recharger la page
        const newUrl = `/navParcours?numParcours=${numParcours}&submenu=${submenu}`;
        history.pushState({numParcours: numParcours, submenu: submenu}, '', newUrl);

        if (submenu === "projet") {
            fetchUrl = `/navParcours/${submenu}${produit}?numParcours=${numParcours}`;
            scriptSrc = `/js/projet-form-${produit}.js`;
        } else if (submenu === "tarif") {
            fetchUrl = `/navParcours/${submenu}${produit}?numParcours=${numParcours}`;
            scriptSrc = `/js/tarif-form-${produit}.js`;
        } else {
            fetchUrl = `/navParcours/${submenu}?numParcours=${numParcours}`;
            scriptSrc = `/js/${submenu}-form.js`;
        }

        const etapes = {
            "client": contrat?.client || null,
            "intermediaire": contrat?.intermediaire || null,
            "tarif": contrat?.["@expand"]?.enCours?.["@expand"]?.tarif?.id || null,
            "projet": contrat?.["@expand"]?.enCours?.["@expand"]?.projet?.id || null,
            "contrat": null
        }

        for (const [key, value] of Object.entries(etapes)) {
            document.getElementById('step-' + key).classList = (value) ? 'stepper-item line' : 'stepper-item'

            if(key == submenu){
                document.getElementById('step-' + key).classList.add('active')
            } else {
                if (value){
                    document.getElementById('step-' + key).classList.add('completed')
                } else if (key == "client" || key == "intermediaire") {
                    document.getElementById('step-' + key).classList.add('empty')
                }
            }

            if (key == "tarif" && etapes['projet']){
                document.getElementById('step-' + key).classList.add('line')
            }
        }

        // Charger le formulaire associé
        fetch(fetchUrl)
        .then(response => response.text())
        .then(html => {
            formContainer.innerHTML = html;

            // Suppression de tout script précédemment chargé
            const oldScript = document.querySelector('script.dynamic-script');

            if (oldScript) {
                oldScript.remove();
            }

            // Création et ajout du nouveau script correspondant au sous-menu
            const script = document.createElement('script');
            script.src = scriptSrc
            script.className = 'dynamic-script';
            document.body.appendChild(script);

            if (submenu === "tarif" || submenu == "projet") {
                //RELOAD PARCOURS & CONTRAT
                loadParcours(numParcours);
                const parcours = JSON.parse(sessionStorage.getItem('parcours'));
                if (parcours) {
                    const contratId = parcours?.["@expand"]?.contrat?.id || null;
                    loadContrat(contratId);
                }
            }

            script.onload = function() {
                if (typeof window.initSubmenuForm === 'function') {
                    window.initSubmenuForm();
                }
            };

            document.querySelectorAll('input').forEach((input) => {
                input.addEventListener('input', function () {
                    inputChanged =  true
                })
            })
        })
        .catch(error => console.error('Error:', error));

        // Gestion des boutons de génération pour tous les produits
        const hasClient = parcours["@expand"]?.contrat?.client != '';
        const hasIntermediaire = parcours["@expand"]?.contrat?.intermediaire != '';
        const hasProduit = produitObj != undefined;
        
        // Bouton génération déclinaison tarifaire
        if (hasClient && hasIntermediaire && hasProduit && tarif != null) {
            document.getElementById('generateDeclinaison').disabled = false;
        } else {
            document.getElementById('generateDeclinaison').disabled = true;
        }
        
        // Bouton génération projet
        if (hasClient && hasIntermediaire && hasProduit && projet != null) {
            document.getElementById('generateProject').disabled = false;
        } else {
            document.getElementById('generateProject').disabled = true;
        }
    }

    // Gestionnaire d'événements 'popstate'
    window.addEventListener('popstate', function (event) {
        const numParcours = event.state?.numParcours || getNumParcoursFromURL();
        const submenu = event.state?.submenu || getSubmenuFromURL();

        if (numParcours && submenu) {
            loadForm(submenu, numParcours);
        }
    });

    document.getElementById('recueilClauses').addEventListener('click', function() {
        const parcours = JSON.parse(sessionStorage.getItem('parcours'));
        var produit = parcours["@expand"].contrat.produit

        var fileName
        switch (produit.toLowerCase()) {
            case 'fac':
                fileName = "CLAUSES_RECUEIL_FAC_VALIDE_AU_22_11_2022.docx";
                break;
            case 'rc' :
                fileName = 'CLAUSES_RECUEIL_RC_TRANSPORT_VALIDE_AU_02_04_2025.docx';
                break;
            case 'tppc':
                fileName = "CLAUSES_RECUEIL_TPPC_VALIDE_AU_01_2022.docx";
                break;
        }

        const url = `/download/${fileName}`;

        fetch(url)
            .then(response => response.blob())
            .then(blob => {
                const link = document.createElement('a');
                link.href = URL.createObjectURL(blob);
                link.download = fileName;
                link.click();
            })
            .catch(error => console.error('Error downloading file:', error));
    });

    // Fonction de génération de projet
    document.getElementById('generateProject').addEventListener('click', async function() {
        const numParcours = getNumParcoursFromURL();
        let filename;
        const parcours = JSON.parse(sessionStorage.getItem('parcours'));
        let produit = parcours["@expand"].contrat.produit

        // Sauvegarder les données du projet avant de générer le document (si RC)
        if (produit.toLowerCase() === 'rc' && typeof window.saveProjetRC === 'function') {
            console.log('Sauvegarde des données projet RC avant génération...');
            const saveResult = await window.saveProjetRC();
            if (!saveResult || !saveResult.valid) {
                console.error('Échec de la sauvegarde du projet RC');
                M.toast({html: 'Erreur lors de la sauvegarde du projet. Veuillez réessayer.'});
                return;
            }
        }

        // Envoi de la requête POST au serveur pour générer le projet
        fetch(`/generate/${produit}/projet/${numParcours}`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
        })
            .then(response => {
                if (!response.ok) {
                    throw new Error('Erreur réseau ou serveur');
                }

                const disposition = response.headers.get('content-disposition');
                filename = disposition.split(';')[1].trim().split('=')[1];

                return response.blob(); // On attend une réponse sous forme de blob pour un fichier
            })
            .then(blob => {
                // Crée un URL pour le blob
                const url = window.URL.createObjectURL(blob);
                // Crée un élément a temporaire pour simuler un clic pour téléchargement
                const a = document.createElement('a');
                a.href = url;
                a.download = filename; // Nomme le fichier téléchargé
                document.body.appendChild(a); // Ajoute l'élément au document
                a.click(); // Simule un clic sur l'élément pour déclencher le téléchargement
                window.URL.revokeObjectURL(url); // Nettoie l'URL objet
                a.remove(); // Supprime l'élément a du document
            })
            .catch(error => console.error('Erreur lors de la génération du projet:', error));
    });


    document.getElementById('generateDeclinaison').addEventListener('click', async function() {
            const numParcours = getNumParcoursFromURL();
            let filename;
            const parcours = JSON.parse(sessionStorage.getItem('parcours'));
            let produit = parcours["@expand"].contrat.produit

            // Envoi de la requête POST au serveur pour générer la déclinaison tarifaire
            fetch(`/generate/${produit}/tarif/${numParcours}`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },

            })
                .then(response => {
                    if (!response.ok) {
                        throw new Error('Erreur réseau ou serveur');
                    }

                    const disposition = response.headers.get('content-disposition');
                    filename = disposition.split(';')[1].trim().split('=')[1];

                    return response.blob(); // On attend une réponse sous forme de blob pour un fichier
                })
                .then(blob => {
                    // Crée un URL pour le blob
                    const url = window.URL.createObjectURL(blob);
                    // Crée un élément a temporaire pour simuler un clic pour téléchargement
                    const a = document.createElement('a');
                    a.href = url;
                    a.download = filename; // Nomme le fichier téléchargé
                    document.body.appendChild(a); // Ajoute l'élément au document
                    a.click(); // Simule un clic sur l'élément pour déclencher le téléchargement
                    window.URL.revokeObjectURL(url); // Nettoie l'URL objet
                    a.remove(); // Supprime l'élément a du document
                })
                .catch(error => console.error('Erreur lors de la génération du projet:', error));
    });

    // Fonction d'initialisation
    async function init() {
        const numParcours = getNumParcoursFromURL();
        const submenu = getSubmenuFromURL();

        await loadParcours(numParcours);

        // Accéder aux informations stockées du parcours
        const parcours = JSON.parse(sessionStorage.getItem('parcours'));

        if (parcours) {
            // Mise à jour de l'interface avec les informations du parcours
            document.getElementById("displayedNumParcours").innerText = parcours.numParcours;

            await loadContrat(parcours["@expand"].contrat.id);
            // Accéder aux informations stockées du contrat
            const contrat = JSON.parse(sessionStorage.getItem('contrat'));

            const client = contrat?.["@expand"]?.client || null;
            document.getElementById("displayedClient").innerText = client?.nom ?? "Information non disponible";

            // Attacher les écouteurs de clic aux liens de sous-menu
            document.querySelectorAll('#navParcoursSelect li a').forEach(link => {
                link.addEventListener('click', function(event) {
                    event.preventDefault();
                    const selectedSubmenu = this.getAttribute('href');
                    if (inputChanged) {
                        openModalUpdate(selectedSubmenu, numParcours)
                    } else {
                        loadForm(selectedSubmenu, numParcours);
                    }
                });
            });

            // Charger le sous-menu spécifié dans l'URL s'il existe
            if (submenu) {
                loadForm(submenu, numParcours);
            }
        }
    }

    // Exécutez init et gérez les erreurs potentielles
    init().catch(error => console.error('Error initializing the form:', error));
});