// Variáveis globais para o reCAPTCHA específico desta página
let isDownloadRecaptchaApiReady = false;
let downloadRecaptchaWidgetId = null;
let downloadRecaptchaRendered = false; // Para evitar renderizar múltiplas vezes

/**
 * Renderiza o widget reCAPTCHA na página de download, se as condições forem cumpridas.
 */
function renderDownloadRecaptchaWidget() {
    const recaptchaDiv = document.getElementById('imz-download-recaptcha'); // ID que adicionamos no PHP
    const messagesDiv = document.getElementById('imz-download-messages');
    // Obtém a site key passada via wp_localize_script (adicionada na função imz_enqueue_assets)
    const recaptchaSiteKey = (typeof imz_download_ajax_data !== 'undefined' && imz_download_ajax_data.recaptcha_site_key) ? imz_download_ajax_data.recaptcha_site_key : null;

    // Verifica se a API está pronta, se o DIV existe, se a chave existe E AINDA não foi renderizado
    if (isDownloadRecaptchaApiReady && !downloadRecaptchaRendered && recaptchaDiv && recaptchaSiteKey) {
         try {
             downloadRecaptchaWidgetId = grecaptcha.render(recaptchaDiv.id, {
                 'sitekey': recaptchaSiteKey
                 // Poderia adicionar callbacks aqui se necessário para a lógica do formulário
                 // 'callback': function() { /* Lógica quando o user completa */ },
                 // 'expired-callback': function() { /* Lógica quando expira */ }
             });
             downloadRecaptchaRendered = true;
             if (messagesDiv) messagesDiv.innerHTML = ''; // Limpa mensagens de erro de carregamento
         } catch (e) {
            console.error("Erro ao renderizar reCAPTCHA (Download):", e);
             if (messagesDiv) {
                 messagesDiv.innerHTML = '<p class="imz-processing-message error">Erro ao carregar a verificação de segurança. Tente recarregar a página.</p>';
             }
         }
    } else if (isDownloadRecaptchaApiReady && !recaptchaSiteKey && messagesDiv && recaptchaDiv) {
         // Avisa se a API carregou mas não há chave
         if (messagesDiv) messagesDiv.innerHTML = '<p class="imz-processing-message error">reCAPTCHA não configurado corretamente.</p>';
    }
}

/**
 * Função de callback chamada pela API do Google reCAPTCHA QUANDO carregada na página de download.
 */
function imzDownloadRecaptchaReady() {
    isDownloadRecaptchaApiReady = true;
    renderDownloadRecaptchaWidget(); // Tenta renderizar imediatamente
}

// Torna a função de callback acessível globalmente para a API do Google
window.imzDownloadRecaptchaReady = imzDownloadRecaptchaReady;


document.addEventListener('DOMContentLoaded', function () {
    const steps = document.querySelectorAll('.imz-proc-step');
    if (!steps.length) return;

    const stepVerifying = document.getElementById('imz-step-verifying');
    const stepWait = document.getElementById('imz-step-wait');
    const stepTerms = document.getElementById('imz-step-terms');
    const stepCaptcha = document.getElementById('imz-step-captcha');
    const stepDownload = document.getElementById('imz-step-download');

    const progressBar = document.getElementById('imz-progress-bar');
    const progressText = document.getElementById('imz-progress-text');
    const termsCheckbox = document.getElementById('imz-terms-checkbox');
    const termsContinueBtn = document.getElementById('imz-terms-continue-btn');
    const captchaForm = document.getElementById('imz-captcha-form');
    const downloadMessages = document.getElementById('imz-download-messages');

    const ajax_url = imz_download_ajax_data.ajax_url;
    const nonce = imz_download_ajax_data.nonce;
    const stepDots = document.querySelectorAll('.imz-proc-step-dot');

    let currentStepIndex = 0;

    if (typeof grecaptcha !== 'undefined' && grecaptcha && grecaptcha.render) {
        isDownloadRecaptchaApiReady = true;
        renderDownloadRecaptchaWidget();
    }

    function updateDots(stepNum) {
        stepDots.forEach(function(dot, i) {
            dot.classList.remove('active', 'done');
            if (i < stepNum) dot.classList.add('done');
            else if (i === stepNum) dot.classList.add('active');
        });
    }

    function goToStep(currentStep, nextStep) {
        if (currentStep) {
            currentStep.classList.remove('active');
            setTimeout(function() {
                currentStep.style.display = 'none';
                if (nextStep) {
                    nextStep.style.display = 'block';
                    setTimeout(function() { nextStep.classList.add('active'); }, 50);
                }
            }, 300);
        } else if (nextStep) {
            nextStep.style.display = 'block';
            setTimeout(function() { nextStep.classList.add('active'); }, 50);
        }
        currentStepIndex++;
        updateDots(currentStepIndex);
    }

    // STEP 1: Progress bar verification
    function runVerificationProcess() {
        var progress = 0;
        var messages = { 10: 'A conectar ao servidor...', 35: 'A validar o token de segurança...', 60: 'A verificar restrições...', 85: 'A preparar o ficheiro...', 100: 'Verificação concluída!' };

        var interval = setInterval(function() {
            progress += 1;
            if (progressBar) progressBar.style.width = progress + '%';
            if (progressText && messages[progress]) progressText.textContent = messages[progress];

            if (progress >= 100) {
                clearInterval(interval);
                setTimeout(function() { goToStep(stepVerifying, stepWait); startCountdown(); }, 600);
            }
        }, 35);
    }

    // STEP 2: Countdown wait
    function startCountdown() {
        var seconds = (typeof imzWaitSeconds !== 'undefined') ? imzWaitSeconds : 10;
        var countdownEl = document.getElementById('imz-countdown-number');
        if (!countdownEl) { afterCountdown(); return; }

        countdownEl.textContent = seconds;
        var countInterval = setInterval(function() {
            seconds--;
            countdownEl.textContent = seconds;
            if (seconds <= 0) {
                clearInterval(countInterval);
                afterCountdown();
            }
        }, 1000);
    }

    function afterCountdown() {
        var nextStep = stepTerms || stepCaptcha || stepDownload;
        goToStep(stepWait, nextStep);
        if (nextStep === stepCaptcha) renderDownloadRecaptchaWidget();
    }

    if (stepVerifying) runVerificationProcess();

    // STEP 3: Terms
    if (termsCheckbox && termsContinueBtn) {
        termsCheckbox.addEventListener('change', function() {
            termsContinueBtn.disabled = !this.checked;
        });
        termsContinueBtn.addEventListener('click', function() {
            if (termsCheckbox.checked) {
                var nextStep = stepCaptcha || stepDownload;
                if (nextStep === stepCaptcha) renderDownloadRecaptchaWidget();
                goToStep(stepTerms, nextStep);
            }
        });
    }

    // STEP 4: reCAPTCHA
    if (captchaForm) {
        captchaForm.addEventListener('submit', function(e) {
            e.preventDefault();
            var submitButton = captchaForm.querySelector('button[type="submit"]');

            if (typeof grecaptcha === 'undefined' || !grecaptcha) {
                downloadMessages.innerHTML = '<p class="imz-processing-message error">Erro ao carregar reCAPTCHA. Recarregue a página.</p>';
                return;
            }

            downloadMessages.innerHTML = '<p class="imz-processing-message warning">A verificar...</p>';
            submitButton.disabled = true;

            var formData = new FormData(captchaForm);
            formData.append('action', 'imz_verify_download_recaptcha');
            formData.append('nonce', nonce);

            var recaptchaResponse = grecaptcha.getResponse(downloadRecaptchaWidgetId);
            if (!recaptchaResponse) {
                downloadMessages.innerHTML = '<p class="imz-processing-message error">Complete a verificação "Não sou um robô".</p>';
                submitButton.disabled = false;
                return;
            }
            formData.append('g-recaptcha-response', recaptchaResponse);

            fetch(ajax_url, { method: 'POST', body: new URLSearchParams(formData) })
                .then(function(res) { return res.json(); })
                .then(function(data) {
                    downloadMessages.innerHTML = '';
                    if (data.success) {
                        goToStep(stepCaptcha, stepDownload);
                    } else {
                        if (downloadRecaptchaWidgetId !== null) { try { grecaptcha.reset(downloadRecaptchaWidgetId); } catch(e){} }
                        throw new Error(data.data.message || 'Erro.');
                    }
                })
                .catch(function(error) {
                    if (downloadRecaptchaWidgetId !== null) { try { grecaptcha.reset(downloadRecaptchaWidgetId); } catch(e){} }
                    downloadMessages.innerHTML = '<p class="imz-processing-message error">' + error.message + '</p>';
                    submitButton.disabled = false;
                });
        });
    }
}); // Fim do DOMContentLoaded