// assets/app.js - Funções globais do sistema

// ============================================================
//  GEOLOCALIZAÇÃO
// ============================================================

async function buscarEnderecoPorCEP(cep, callback) {
    cep = cep.replace(/\D/g, '');
    if (cep.length !== 8) return;
    
    try {
        const response = await fetch(`https://viacep.com.br/ws/${cep}/json/`);
        const data = await response.json();
        
        if (!data.erro) {
            const endereco = {
                logradouro: data.logradouro,
                bairro: data.bairro,
                cidade: data.localidade,
                uf: data.uf
            };
            
            if (callback) callback(endereco);
            return endereco;
        }
    } catch (error) {
        console.error('Erro ao buscar CEP:', error);
        showToast('Erro ao buscar CEP', 'error');
    }
}

async function geocodificarEndereco(enderecoCompleto, callback) {
    try {
        const response = await fetch(`ajax/geo.php?endereco=${encodeURIComponent(enderecoCompleto)}`);
        const data = await response.json();
        
        if (data.lat && data.lng) {
            if (callback) callback(data.lat, data.lng);
            return { lat: data.lat, lng: data.lng };
        }
    } catch (error) {
        console.error('Erro na geocodificação:', error);
    }
    return null;
}

// ============================================================
//  MÁSCARAS DE INPUT
// ============================================================

function mascaraTelefone(input) {
    let value = input.value.replace(/\D/g, '');
    if (value.length > 11) value = value.slice(0, 11);
    
    if (value.length > 10) {
        value = value.replace(/^(\d{2})(\d{5})(\d{4})/, '($1) $2-$3');
    } else if (value.length > 6) {
        value = value.replace(/^(\d{2})(\d{4})(\d{0,4})/, '($1) $2-$3');
    } else if (value.length > 2) {
        value = value.replace(/^(\d{2})(\d{0,5})/, '($1) $2');
    }
    
    input.value = value;
}

function mascaraCPF(input) {
    let value = input.value.replace(/\D/g, '');
    if (value.length > 11) value = value.slice(0, 11);
    
    if (value.length > 9) {
        value = value.replace(/^(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4');
    } else if (value.length > 6) {
        value = value.replace(/^(\d{3})(\d{3})(\d{0,3})/, '$1.$2.$3');
    } else if (value.length > 3) {
        value = value.replace(/^(\d{3})(\d{0,3})/, '$1.$2');
    }
    
    input.value = value;
}

function mascaraCNPJ(input) {
    let value = input.value.replace(/\D/g, '');
    if (value.length > 14) value = value.slice(0, 14);
    
    if (value.length > 12) {
        value = value.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, '$1.$2.$3/$4-$5');
    } else if (value.length > 8) {
        value = value.replace(/^(\d{2})(\d{3})(\d{3})(\d{0,4})/, '$1.$2.$3/$4');
    } else if (value.length > 5) {
        value = value.replace(/^(\d{2})(\d{3})(\d{0,3})/, '$1.$2.$3');
    } else if (value.length > 2) {
        value = value.replace(/^(\d{2})(\d{0,3})/, '$1.$2');
    }
    
    input.value = value;
}

function mascaraCEP(input) {
    let value = input.value.replace(/\D/g, '');
    if (value.length > 8) value = value.slice(0, 8);
    
    if (value.length > 5) {
        value = value.replace(/^(\d{5})(\d{3})/, '$1-$2');
    }
    
    input.value = value;
}

// ============================================================
//  VALIDAÇÕES
// ============================================================

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

function validarEmail(email) {
    const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return re.test(email);
}

// ============================================================
//  MODAL FUNCTIONS
// ============================================================

function abrirModal(conteudo, titulo = null) {
    const modal = document.getElementById('modal-overlay');
    const inner = document.getElementById('modal-inner');
    
    if (titulo) {
        inner.innerHTML = `
            <div class="modal-header">
                <div>
                    <div class="modal-title">${escapeHtml(titulo)}</div>
                </div>
                <button class="modal-close" onclick="fecharModal()">×</button>
            </div>
            <div class="modal-body">${conteudo}</div>
        `;
    } else {
        inner.innerHTML = conteudo;
    }
    
    modal.classList.add('open');
    document.body.style.overflow = 'hidden';
}

function fecharModal() {
    const modal = document.getElementById('modal-overlay');
    modal.classList.remove('open');
    document.body.style.overflow = '';
}

// ============================================================
//  INICIALIZAÇÃO AUTOMÁTICA
// ============================================================

document.addEventListener('DOMContentLoaded', function() {
    // Máscaras automáticas
    document.querySelectorAll('[data-mask="telefone"]').forEach(el => {
        el.addEventListener('input', () => mascaraTelefone(el));
    });
    
    document.querySelectorAll('[data-mask="cpf"]').forEach(el => {
        el.addEventListener('input', () => mascaraCPF(el));
    });
    
    document.querySelectorAll('[data-mask="cnpj"]').forEach(el => {
        el.addEventListener('input', () => mascaraCNPJ(el));
    });
    
    document.querySelectorAll('[data-mask="cep"]').forEach(el => {
        el.addEventListener('input', () => mascaraCEP(el));
    });
    
    // Busca automática de CEP
    document.querySelectorAll('[data-busca-cep]').forEach(el => {
        el.addEventListener('blur', async function() {
            const cep = this.value;
            if (cep.length >= 8) {
                const endereco = await buscarEnderecoPorCEP(cep);
                if (endereco) {
                    const form = this.closest('form');
                    if (form) {
                        const logradouro = form.querySelector('[data-campo="logradouro"]');
                        const bairro = form.querySelector('[data-campo="bairro"]');
                        const cidade = form.querySelector('[data-campo="cidade"]');
                        const uf = form.querySelector('[data-campo="uf"]');
                        
                        if (logradouro) logradouro.value = endereco.logradouro;
                        if (bairro) bairro.value = endereco.bairro;
                        if (cidade) cidade.value = endereco.cidade;
                        if (uf) uf.value = endereco.uf;
                        
                        showToast('Endereço preenchido automaticamente', 'success');
                    }
                }
            }
        });
    });
    
    // Confirmação para ações destrutivas
    document.querySelectorAll('[data-confirm]').forEach(el => {
        el.addEventListener('click', (e) => {
            const message = el.getAttribute('data-confirm') || 'Tem certeza?';
            if (!confirm(message)) {
                e.preventDefault();
                return false;
            }
        });
    });
});
