// source --> https://fast-growth.fr/wp-content/themes/kadence-child/js/fga-quiz.js?ver=2.2.0 
/**
 * FGA Quiz v2 — Messaging Health Check
 * Flow : identité → questions → pitch → email → analyse IA → résultat
 *
 * @version 2.0.0
 * @package FGA
 */
(function () {
    'use strict';

    // ── CONFIG ──
    var PERSONAL_DOMAINS = ['gmail.com','googlemail.com','yahoo.com','yahoo.fr','hotmail.com','hotmail.fr','outlook.com','outlook.fr','live.com','live.fr','aol.com','icloud.com','me.com','protonmail.com','proton.me','free.fr','orange.fr','sfr.fr','laposte.net','wanadoo.fr'];
    var RATE_LIMIT_KEY = 'fga_quiz_domains';
    var MAX_TESTS_PER_DOMAIN_PER_DAY = 1; // Ajuster si besoin
    var TOTAL_QUESTIONS = 6;

    document.addEventListener('DOMContentLoaded', init);

    function init() {
        var quizEl = document.querySelector('.fga-quiz[data-type="messaging"]');
        if (!quizEl) return;

        // Rate limit check
        if (isRateLimited()) {
            showRateLimitMessage(quizEl);
            return;
        }

        var state = {
            firstname: '',
            lastname: '',
            company: '',
            email: '',
            url: '',
            pitch: '',
            score: 0,
            answers: [],
            currentQ: 0,
            aiResult: null,
            gapLevel: ''
        };

        // External elements (page template)
        var externalIntro = document.getElementById('fga-quiz-intro');
        var externalWrap  = document.getElementById('fga-quiz-wrap');
        var externalStart = document.getElementById('fga-quiz-start-btn');
        var externalFooter = document.getElementById('fga-quiz-footer');

        // Steps
        var steps = {
            identity:  quizEl.querySelector('[data-step="identity"]'),
            questions: quizEl.querySelector('[data-step="questions"]'),
            pitch:     quizEl.querySelector('[data-step="pitch"]'),
            email:     quizEl.querySelector('[data-step="email"]'),
            analysis:  quizEl.querySelector('[data-step="analysis"]'),
            results:   quizEl.querySelector('[data-step="results"]')
        };

        // Elements
        var els = {
            firstname:    quizEl.querySelector('#fga-quiz-firstname'),
            lastname:     quizEl.querySelector('#fga-quiz-lastname'),
            company:      quizEl.querySelector('#fga-quiz-company'),
            pitchArea:    quizEl.querySelector('#fga-quiz-pitch'),
            pitchCount:   quizEl.querySelector('#fga-quiz-pitch-count'),
            emailInput:   quizEl.querySelector('#fga-quiz-email'),
            progressBar:  quizEl.querySelector('.fga-quiz__progress-bar'),
            progressNum:  quizEl.querySelector('.fga-quiz__current'),
            questionEls:  quizEl.querySelectorAll('.fga-quiz__question'),
            loaderStatus: quizEl.querySelector('#fga-quiz-loader-status'),
            loaderFill:   quizEl.querySelector('#fga-quiz-loader-fill'),
            scoreBadge:   quizEl.querySelector('#fga-quiz-score-badge'),
            scoreValue:   quizEl.querySelector('#fga-quiz-score-value'),
            scoreLabel:   quizEl.querySelector('#fga-quiz-score-label'),
            gapTitle:     quizEl.querySelector('#fga-quiz-gap-title'),
            gapText:      quizEl.querySelector('#fga-quiz-gap-text'),
            emailTeaser:  quizEl.querySelector('#fga-quiz-email-teaser'),
            nameInserts:  quizEl.querySelectorAll('.fga-quiz__name-insert'),
            companyInserts: quizEl.querySelectorAll('.fga-quiz__company-insert')
        };

        var nextBtns = quizEl.querySelectorAll('.fga-quiz__next-btn');

        // ── EVENTS ──

        // External start button
        if (externalStart) {
            externalStart.addEventListener('click', function () {
                if (externalIntro) externalIntro.hidden = true;
                if (externalWrap) externalWrap.hidden = false;
                quizEl.scrollIntoView({ behavior: 'smooth', block: 'start' });
                trackEvent('quiz_start', 'messaging');
            });
        }

        // Identity fields → enable button
        [els.firstname, els.lastname, els.company].forEach(function (input) {
            input.addEventListener('input', function () {
                var btn = steps.identity.querySelector('.fga-quiz__next-btn');
                btn.disabled = !(els.firstname.value.trim() && els.lastname.value.trim() && els.company.value.trim());
            });
        });

        // Pitch textarea → char count + enable button
        els.pitchArea.addEventListener('input', function () {
            var len = els.pitchArea.value.length;
            els.pitchCount.textContent = len;
            var btn = steps.pitch.querySelector('.fga-quiz__next-btn');
            btn.disabled = len < 30;
            var hint = document.getElementById('fga-quiz-pitch-hint');
            if (hint) {
                hint.style.opacity = len >= 30 ? '0' : '1';
            }
        });

        // Email field → reject personal domains
        els.emailInput.addEventListener('input', validateEmailStep);
        
        // Consent checkbox
        var consentCheck = quizEl.querySelector('#fga-quiz-consent');
        if (consentCheck) {
            consentCheck.addEventListener('change', validateEmailStep);
        }
        
        function validateEmailStep() {
            var email = els.emailInput.value.trim();
            var btn = steps.email.querySelector('.fga-quiz__next-btn');
            var errorEl = quizEl.querySelector('#fga-quiz-email-error');
            var isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
            var isConsented = consentCheck ? consentCheck.checked : true;
            
            if (isValid) {
                var domain = email.split('@')[1].toLowerCase();
                var isPersonal = PERSONAL_DOMAINS.indexOf(domain) !== -1;
                
                if (isPersonal) {
                    btn.disabled = true;
                    errorEl.hidden = false;
                    errorEl.textContent = 'Email pro uniquement. Pas de Gmail, Outlook ou Yahoo.';
                    els.emailInput.style.borderColor = '#E85D5D';
                } else if (isDomainLimited(email)) {
                    btn.disabled = true;
                    errorEl.hidden = false;
                    errorEl.textContent = 'Ce domaine a d\u00e9j\u00e0 \u00e9t\u00e9 test\u00e9 aujourd\'hui. Reviens demain.';
                    els.emailInput.style.borderColor = '#E8A94D';
                } else {
                    btn.disabled = !isConsented;
                    errorEl.hidden = true;
                    els.emailInput.style.borderColor = '';
                }
            } else {
                btn.disabled = true;
                errorEl.hidden = true;
                els.emailInput.style.borderColor = '';
            }
        }

        // Next buttons
        nextBtns.forEach(function (btn) {
            btn.addEventListener('click', function () {
                if (btn.disabled) return;
                var nextStep = btn.getAttribute('data-next');
                handleStepTransition(nextStep);
            });
        });

        // Answer buttons (delegation)
        steps.questions.addEventListener('click', function (e) {
            var btn = e.target.closest('.fga-quiz__answer');
            if (!btn) return;
            handleAnswer(btn);
        });


        // ── STEP TRANSITIONS ──

        function handleStepTransition(nextStep) {
            if (nextStep === 'questions') {
                // Save identity
                state.firstname = els.firstname.value.trim();
                state.lastname = els.lastname.value.trim();
                state.company = els.company.value.trim();

                // Inject name/company into all placeholders
                els.nameInserts.forEach(function (el) { el.textContent = state.firstname; });
                els.companyInserts.forEach(function (el) { el.textContent = state.company; });

                showStep('questions');
                updateProgress();
                showQuestion(0);
            }
            else if (nextStep === 'email') {
                state.pitch = els.pitchArea.value.trim();
                showStep('email');
            }
            else if (nextStep === 'analysis') {
                state.email = els.emailInput.value.trim();
                state.url = 'https://' + state.email.split('@')[1].toLowerCase();

                showStep('analysis');
                runAnalysis();
            }
        }

        function showStep(stepName) {
            Object.keys(steps).forEach(function (key) {
                steps[key].hidden = (key !== stepName);
            });
            quizEl.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }

        // ── QUESTIONS ──

        function handleAnswer(btn) {
            var value = parseInt(btn.getAttribute('data-value'), 10);
            state.answers[state.currentQ] = value;
            state.score = state.answers.reduce(function (a, b) { return a + b; }, 0);

            btn.classList.add('is-selected');
            var siblings = btn.parentElement.querySelectorAll('.fga-quiz__answer');
            siblings.forEach(function (s) {
                if (s !== btn) s.style.opacity = '0.4';
                s.style.pointerEvents = 'none';
            });

            setTimeout(function () {
                state.currentQ++;
                if (state.currentQ < TOTAL_QUESTIONS) {
                    showQuestion(state.currentQ);
                    updateProgress();
                } else {
                    // After last question → pitch step
                    showStep('pitch');
                }
            }, 400);
        }

        function showQuestion(index) {
            els.questionEls.forEach(function (q, i) {
                q.hidden = (i !== index);
                if (i === index) {
                    q.querySelectorAll('.fga-quiz__answer').forEach(function (b) {
                        b.classList.remove('is-selected');
                        b.style.opacity = '';
                        b.style.pointerEvents = '';
                    });
                }
            });
        }

        function updateProgress() {
            var pct = ((state.currentQ + 1) / TOTAL_QUESTIONS) * 100;
            els.progressBar.style.setProperty('--quiz-progress', pct + '%');
            els.progressNum.textContent = state.currentQ + 1;
        }

        // ── ANALYSIS ──

        function runAnalysis() {
            var statusEl = els.loaderStatus;
            var fillEl = els.loaderFill;

            // Fake progress messages
            var messages = [
                'Analyse du messaging en cours...',
                'Vérification de la cohérence...',
                'Comparaison avec ton pitch...',
                'Préparation du diagnostic...'
            ];
            var msgIndex = 0;
            fillEl.style.width = '10%';

            var msgInterval = setInterval(function () {
                msgIndex++;
                if (msgIndex < messages.length) {
                    statusEl.textContent = messages[msgIndex];
                    fillEl.style.width = (10 + msgIndex * 18) + '%';
                }
            }, 2200);

            // Real analysis: fetch homepage + call Claude
            fetchAndAnalyze(state.url, state.pitch, state.company)
                .then(function (result) {
                    clearInterval(msgInterval);
                    fillEl.style.width = '100%';
                    statusEl.textContent = 'Diagnostic prêt.';

                    state.aiResult = result;
                    state.gapLevel = result.gapLevel;

                    // Send to WP backend
                    submitToBackend();

                    // Show results after a beat
                    setTimeout(function () {
                        showResults();
                    }, 800);
                })
                .catch(function (err) {
                    console.error('FGA Quiz analysis error:', err);
                    clearInterval(msgInterval);
                    
                    // Fallback: show results without AI analysis
                    state.aiResult = { gapLevel: 'unknown', teaser: '', detail: 'Analyse indisponible — notre équipe te contactera avec le diagnostic détaillé.', missing: '', siteQui: '', siteQuoi: '', siteDiff: '', siteValeur: '', pitchQui: '', pitchQuoi: '', pitchDiff: '', pitchValeur: '' };
                    state.gapLevel = 'unknown';
                    fillEl.style.width = '100%';

                    submitToBackend();
                    setTimeout(showResults, 800);
                });
        }

        async function fetchAndAnalyze(url, pitch, company) {
            // Tout passe par le proxy PHP (fetch homepage + appel Claude)
            var formData = new FormData();
            formData.append('action', 'fga_quiz_analyze');
            formData.append('nonce', fgaQuiz.nonce);
            formData.append('url', url);
            formData.append('pitch', pitch);
            formData.append('company', company);

            var resp = await fetch(fgaQuiz.ajaxUrl, {
                method: 'POST',
                body: formData
            });
            var json = await resp.json();

            if (!json.success || !json.data) {
                throw new Error(json.data || 'Analyse échouée');
            }

            return json.data;
        }

        // ── RESULTS ──

        function showResults() {
            showStep('results');

            // Score display
            var range = getRange(state.score);
            els.scoreValue.textContent = state.score;
            els.scoreBadge.className = 'fga-quiz__score-badge fga-quiz__score-badge--' + range;
            
            var labels = {
                critical: 'Messaging critique — ' + state.company,
                fragile:  'Messaging fragile — ' + state.company,
                solid:    'Messaging solide — ' + state.company
            };
            els.scoreLabel.textContent = labels[range] || '';

            // Gap reveal + meter
            var gapPositions = { none: '5%', small: '25%', medium: '60%', big: '90%', unknown: '50%' };
            var indicator = quizEl.querySelector('#fga-quiz-gap-indicator');
            indicator.style.left = gapPositions[state.gapLevel] || '50%';

            if (state.gapLevel === 'none' || state.gapLevel === 'small') {
                els.gapTitle.textContent = state.firstname + ', ton site et ton pitch sont plutôt cohérents.';
                els.gapText.textContent = 'On a quand même trouvé des points à muscler. Le détail arrive dans ta boîte.';
            } else {
                els.gapTitle.textContent = state.aiResult.teaser || (state.firstname + ', gros gap entre ton message et celui de ton site.');
                els.gapText.textContent = 'On a analysé ce que tu dis vs ce que ton site dit. Il y a des écarts. Le rapport complet arrive par email.';
            }

            // Email teaser
            els.emailTeaser.textContent = 'Tu vas recevoir par email une explication détaillée de notre audit rapide.';

            // Show footer
            if (externalFooter) externalFooter.style.display = '';

            // Set rate limit
            setRateLimit();

            trackEvent('quiz_complete', 'messaging', state.gapLevel, state.score);
        }

        function getRange(score) {
            if (score <= 2) return 'critical';
            if (score <= 4) return 'fragile';
            return 'solid';
        }

        // ── BACKEND ──

        function submitToBackend() {
            var formData = new FormData();
            formData.append('action', 'fga_quiz_submit');
            formData.append('nonce', fgaQuiz.nonce);
            formData.append('firstname', state.firstname);
            formData.append('lastname', state.lastname);
            formData.append('company', state.company);
            formData.append('email', state.email);
            formData.append('url', state.url);
            formData.append('score', state.score);
            formData.append('answers', JSON.stringify(state.answers));
            formData.append('pitch', state.pitch);
            formData.append('ai_result', JSON.stringify(state.aiResult));
            formData.append('gap_level', state.gapLevel);

            fetch(fgaQuiz.ajaxUrl, {
                method: 'POST',
                body: formData
            }).catch(function (err) {
                console.error('FGA Quiz submit error:', err);
            });
        }

        // ── RATE LIMIT (par domaine) ──

        function isRateLimited() {
            // On vérifie après la saisie de l'email, pas au chargement
            return false;
        }

        function isDomainLimited(email) {
            try {
                var domain = email.split('@')[1].toLowerCase();
                var data = JSON.parse(localStorage.getItem(RATE_LIMIT_KEY) || '{}');
                var entry = data[domain];
                if (!entry) return false;
                var diff = Date.now() - entry.ts;
                var isToday = diff < 24 * 60 * 60 * 1000;
                return isToday && entry.count >= MAX_TESTS_PER_DOMAIN_PER_DAY;
            } catch (e) { return false; }
        }

        function setRateLimit() {
            try {
                var domain = state.email.split('@')[1].toLowerCase();
                var data = JSON.parse(localStorage.getItem(RATE_LIMIT_KEY) || '{}');
                var entry = data[domain];
                var now = Date.now();

                if (entry && (now - entry.ts) < 24 * 60 * 60 * 1000) {
                    entry.count++;
                    entry.ts = now;
                } else {
                    data[domain] = { count: 1, ts: now };
                }
                localStorage.setItem(RATE_LIMIT_KEY, JSON.stringify(data));
            } catch (e) { /* silent */ }
        }

        function showRateLimitMessage(quizEl) {
            var step = quizEl.querySelector('[data-step="identity"]');
            if (step) {
                step.innerHTML = '<div class="fga-quiz__step-inner" style="text-align:center;">' +
                    '<span class="fga-label">DIAGNOSTIC COMPLÉTÉ</span>' +
                    '<h3 class="fga-quiz__step-title">Tu as déjà passé le diagnostic aujourd\'hui.</h3>' +
                    '<p class="fga-quiz__step-desc">Reviens demain pour un nouvel essai, ou réserve directement un diagnostic approfondi avec notre équipe.</p>' +
                    '<a href="/contact/" class="fga-btn-primary">Réserver un diagnostic →</a>' +
                    '</div>';
            }
        }



        // ── TRACKING ──

        function trackEvent(action, quizType, label, value) {
            if (typeof window.dataLayer !== 'undefined') {
                window.dataLayer.push({
                    event: 'fga_quiz',
                    quiz_action: action,
                    quiz_type: quizType,
                    quiz_label: label || '',
                    quiz_value: value || 0
                });
            }
        }
    }
})();