// Funções para manipulação de cookies
function setCookie(name, value, minutes) {
    const d = new Date();
    d.setTime(d.getTime() + (minutes * 60 * 1000)); // Expira em 'minutes' minutos
    const expires = "expires=" + d.toUTCString();
    document.cookie = name + "=" + value + ";" + expires + ";path=/";
}

function getCookie(name) {
    const cname = name + "=";
    const decodedCookie = decodeURIComponent(document.cookie);
    const ca = decodedCookie.split(';');
    for (let i = 0; i < ca.length; i++) {
        let c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(cname) == 0) {
            return c.substring(cname.length, c.length);
        }
    }
    return "";
}

// Função para limpar o erro de um campo
function limparErro(campo) {
    document.getElementById(`error-${campo}`).innerText = '';
    document.getElementById(campo).classList.remove('input-error');
}

// Função para mostrar o erro de um campo
function mostrarErro(campo, mensagem) {
    document.getElementById(`error-${campo}`).innerText = mensagem;
    document.getElementById(campo).classList.add('input-error');
}

// Função para evitar que o evento do Facebook seja disparado mais de uma vez
function trackFacebookEventOnce(eventName, eventParams) {
    const eventKey = `fb_event_${eventName}`;
    if (!getCookie(eventKey)) {
        fbq('track', eventName, eventParams);
        setCookie(eventKey, 'true', 30); // Evita que o evento seja disparado novamente nos próximos 30 minutos
    }
}

// Função para obter o IP do usuário
function obterIPUsuario() {
    return fetch('/backend/get_ip.php')
        .then(response => {
            if (!response.ok) {
                throw new Error('Erro ao obter o IP do usuário.');
            }
            return response.json();
        })
        .then(data => data.ip)
        .catch(error => {
            console.error(error);
            return null;
        });
}

document.addEventListener("DOMContentLoaded", async function() {
    // Inicializar o input de telefone com intl-tel-input
    var inputPhone = document.querySelector("#phone");
    var iti = window.intlTelInput(inputPhone, {
        initialCountry: "br",
        separateDialCode: true,
        utilsScript: "https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.8/js/utils.js"
    });

    // Variáveis de controle para evitar duplicação de eventos
    let isAddToCartTracked = false;

    function validarTelefone() {
        if (iti.isValidNumber()) {
            limparErro('phone');
            return true;
        } else {
            mostrarErro('phone', 'Por favor, insira um número de telefone válido.');
            return false;
        }
    }

    VMasker(inputPhone).maskPattern("(99) 99999-9999");
    VMasker(document.querySelector("#cpf")).maskPattern("999.999.999-99");

    function validarCPF(cpf) {
        cpf = cpf.replace(/[^\d]+/g, '');
        if (cpf.length !== 11 || /^(\d)\1{10}$/.test(cpf)) return false;
        let soma = 0, resto;
        for (let i = 1; i <= 9; i++) soma += parseInt(cpf.substring(i-1, i)) * (11 - i);
        resto = (soma * 10) % 11;
        if ((resto === 10) || (resto === 11)) resto = 0;
        if (resto !== parseInt(cpf.substring(9, 10))) return false;
        soma = 0;
        for (let i = 1; i <= 10; i++) soma += parseInt(cpf.substring(i-1, i)) * (12 - i);
        resto = (soma * 10) % 11;
        if ((resto === 10) || (resto === 11)) resto = 0;
        return resto === parseInt(cpf.substring(10, 11));
    }

    // Captura produto_id e afiliado_id dos campos hidden (garantia de persistência)
    const hiddenProdutoId = document.getElementById('hidden_produto_id');
    const hiddenAfiliadoId = document.getElementById('hidden_afiliado_id');
    
    // Fallback: Se não existir hidden, tenta pegar da URL
    const produtoId = hiddenProdutoId ? hiddenProdutoId.value : new URLSearchParams(window.location.search).get('produto_id');
    const afiliadoId = hiddenAfiliadoId ? hiddenAfiliadoId.value : (new URLSearchParams(window.location.search).get('af') || new URLSearchParams(window.location.search).get('ref'));

    fetch(`/config/config_produto.php?produto_id=${produtoId}`)
      .then(response => response.json())
      .then(data => {
        document.getElementById("titulo-produto").innerText = data.title;
        document.getElementById("descricao-produto").innerText = data.description;
        document.getElementById("imagem-produto").src = data.imagem;
        document.getElementById("product-price").innerText = `por R$ ${data.unit_price.toFixed(2)}`;
        document.getElementById("preco-original").innerText = data.preco_original.toFixed(2);

        // Disparar evento de "Adicionar ao Carrinho" (AddToCart) ao carregar os dados do produto
        trackFacebookEventOnce('AddToCart', {
            content_name: data.title,
            content_ids: [produtoId],
            content_type: 'product',
            value: data.unit_price,
            currency: 'BRL'
        });
      })
      .catch(error => console.error("Erro ao buscar os dados do produto: ", error));

    document.getElementById('cpf').addEventListener('paste', function(event) {
        setTimeout(() => {
            let cpf = this.value.replace(/[^\d]/g, '');
            VMasker(this).unMask();
            VMasker(this).maskPattern("999.999.999-99");
            this.value = cpf;
        }, 0);
    });

    document.getElementById('phone').addEventListener('paste', function(event) {
        setTimeout(() => {
            let phone = this.value.replace(/[^\d]/g, '');
            VMasker(this).unMask();
            VMasker(this).maskPattern("(99) 99999-9999");
            this.value = phone;
        }, 0);
    });

    document.getElementById('full-name').addEventListener('paste', function(event) {
        setTimeout(() => {
            this.value = this.value.replace(/\s+/g, ' ').trim();
        }, 0);
    });

    const savedFullName = getCookie('full-name');
    const savedEmail = getCookie('email');
    const savedCPF = getCookie('cpf');
    const savedPhone = getCookie('celular');

    if (savedFullName) document.getElementById('full-name').value = savedFullName;
    if (savedEmail) document.getElementById('email').value = savedEmail;
    if (savedCPF) document.getElementById('cpf').value = savedCPF;
    if (savedPhone) {
        iti.setNumber(savedPhone);
    }

    let deviceIP = await obterIPUsuario();
    if (deviceIP) {
        console.log("IP do Usuário:", deviceIP);
    } else {
        console.warn("IP do usuário não encontrado. Continuando sem o IP.");
        deviceIP = ""; // Define um valor padrão vazio para evitar erros no redirecionamento
    }

    document.getElementById('dados-pessoais-form').addEventListener('submit', function(event) {
        event.preventDefault();

        const fullName = document.getElementById('full-name').value;
        const email = document.getElementById('email').value;
        const cpf = document.getElementById('cpf').value;
        const celular = iti.getNumber();

        // Validações de email, CPF, telefone e nome completo
        const emailValido = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
        const cpfValido = validarCPF(cpf);
        const telefoneValido = validarTelefone();

        let formValido = true;

        const nomePartes = fullName.trim().split(" ");
        if (nomePartes.length < 2) {
            mostrarErro('full-name', 'Por favor, insira seu nome completo, incluindo sobrenome.');
            formValido = false;
        } else {
            limparErro('full-name');
        }

        if (!emailValido) {
            mostrarErro('email', 'Por favor, insira um email válido.');
            formValido = false;
        } else {
            limparErro('email');
        }

        if (!cpfValido) {
            mostrarErro('cpf', 'Por favor, insira um CPF válido.');
            formValido = false;
        } else {
            limparErro('cpf');
        }

        if (!telefoneValido) {
            mostrarErro('phone', 'Por favor, insira um telefone válido.');
            formValido = false;
        } else {
            limparErro('phone');
        }

        // Se todos os campos forem válidos, dispara o evento InitiateCheckout
        if (formValido) {
            fbq('track', 'InitiateCheckout', {
                content_name: document.getElementById("titulo-produto").innerText,
                content_ids: [produtoId],
                content_type: 'product',
                value: parseFloat(document.getElementById("product-price").innerText.replace('por R$ ', '').replace('.', '').replace(',', '.')),
                currency: 'BRL'
            });

            // Salvar cookies e redirecionar
            setCookie('full-name', fullName, 30);
            setCookie('email', email, 30);
            setCookie('cpf', cpf, 30);
            setCookie('celular', celular, 30);
            setCookie('device-ip', deviceIP, 30);

            // Construção robusta da URL de redirecionamento
            let urlDestino = `/views/checkout.php?produto_id=${produtoId}&ip=${encodeURIComponent(deviceIP)}`;
            
            // Se tiver afiliado, anexa na URL para garantir o rastreamento da comissão
            if (afiliadoId && afiliadoId !== '0' && afiliadoId !== '' && afiliadoId !== 'null' && afiliadoId !== null) {
                urlDestino += `&ref=${afiliadoId}`;
            }
            
            // Redireciona
            window.location.href = urlDestino;
        }
    });
});
