// ARQUIVO: gestao_ponto/logic_admin.js
// VERSÃO: Calendário Power (Feriados BR, Navegação e Nomes) + Correção Falta Parcial

let currentUser = null;
let listaFuncionarios = [];
let funcionarioSelecionado = null;
let historicoGlobal = [];
let mesGestao = new Date().getMonth() + 1;
let anoGestao = new Date().getFullYear();

// Variáveis de Navegação do Calendário
let anoCalendario = new Date().getFullYear();
let mesCalendario = new Date().getMonth() + 1; // 1 a 12

document.addEventListener('DOMContentLoaded', async () => {
    // 1. Recupera o usuário básico (ID e Nome) do cache
    const authUser = localStorage.getItem('ponto_auth_user');
    if (authUser) {
        sessionStorage.setItem('currentUser', authUser);
        currentUser = JSON.parse(authUser);
    } else {
        const sessionUser = sessionStorage.getItem('currentUser');
        if (sessionUser) currentUser = JSON.parse(sessionUser);
    }

    if (!currentUser) {
        Swal.fire({ icon: 'error', title: 'Sessão Inválida', showConfirmButton: false });
        window.location.href = '../index.html';
        return;
    }

    // 2. [CORREÇÃO] VERIFICA PERMISSÃO NO BANCO (Não confia no cache)
    try {
        const resp = await fetch('api.php', {
            method: 'POST',
            body: JSON.stringify({ acao: 'checar_permissao', usuario_id: currentUser.id })
        });
        const json = await resp.json();
        
        // Se o banco disser que NÃO é admin, expulsa!
        if (!json.nivel || json.nivel !== 'admin') {
            Swal.fire({ 
                icon: 'error', 
                title: 'Acesso Negado', 
                text: 'Seu perfil atual não é de Administrador.',
                showConfirmButton: false,
                timer: 2000,
                allowOutsideClick: false
            }).then(() => {
                window.location.href = '../index.html';
            });
            return; // Para tudo aqui
        }

        // Se chegou aqui, é ADMIN confirmado!
        
    } catch(e) {
        console.error("Erro ao verificar permissão:", e);
        // Por segurança, se der erro na API, bloqueia
        window.location.href = '../index.html';
        return;
    }

    // 3. UI (Carrega o restante da tela)
    const nomeExibicao = currentUser.name || currentUser.nome || 'Admin';
    const cargoExibicao = currentUser.funcao || currentUser.cargo || 'Gestor';
    const iniciais = nomeExibicao.substring(0, 2).toUpperCase();

    const elRole = document.getElementById('header-role');
    const elInitials = document.getElementById('header-initials');
    
    if(elRole) elRole.textContent = cargoExibicao;
    if(elInitials) elInitials.textContent = iniciais;

    // --- [NOVO] MONITOR DE STATUS EM TEMPO REAL ---
    // A cada 15 segundos, repinta a tabela para ver se alguém ficou "Atrasado"
    setInterval(() => {
        // Só roda se a tabela de lista estiver visível na tela
        const viewLista = document.getElementById('view-lista');
        if (viewLista && !viewLista.classList.contains('hidden')) {
            renderizarTabela(); 
        }
    }, 15000);
    // ----------------------------------------------

    setupNavigation();
    await carregarDadosRH();
    navegarPara('view-lista');
});

// --- NAVEGAÇÃO UI ---
function setupNavigation() {
    const buttons = document.querySelectorAll('aside nav button');
    buttons.forEach(btn => {
        btn.onclick = function() {
            buttons.forEach(b => b.className = "w-full text-left px-6 py-4 text-slate-600 hover:bg-slate-200 hover:text-indigo-800 transition-colors flex items-center font-medium border-l-4 border-transparent");
            this.className = "w-full text-left px-6 py-4 bg-indigo-900 text-white border-l-4 border-emerald-400 flex items-center font-bold shadow-md";
            const match = this.getAttribute('onclick').match(/'([^']+)'/);
            if(match) navegarPara(match[1]);
        }
    });
}

window.navegarPara = function(viewId) {
    document.querySelectorAll('.view-section').forEach(el => el.classList.add('hidden'));
    const target = document.getElementById(viewId);
    if(target) {
        target.classList.remove('hidden');
        if(viewId === 'view-relatorios') renderizarRelatoriosGerais();
        if(viewId === 'view-calendario') renderizarCalendarioGeral(); // Usa as variáveis globais de mês/ano
        if(viewId === 'view-configuracoes') carregarConfiguracoes();
    }
}

window.sairDoSistema = () => window.close();

// --- DADOS RH ---
async function carregarDadosRH() {
    try {
        const resp = await fetch('api.php', { 
            method: 'POST', 
            body: JSON.stringify({ acao: 'listar_usuarios_rh' }) 
        });
        const json = await resp.json();

        if (json.status === 'sucesso') {
            listaFuncionarios = json.data;
            
            // Renderiza sem calcular nada
            const viewRel = document.getElementById('view-relatorios');
            if (viewRel && !viewRel.classList.contains('hidden')) {
                if(typeof renderizarRelatoriosGerais === 'function') renderizarRelatoriosGerais();
            } else {
                if(typeof renderizarTabela === 'function') renderizarTabela();
            }
        }
    } catch(e) { console.error(e); }
}

function renderizarTabela() {
    const tbody = document.getElementById('lista-funcionarios');
    if(!tbody) return;
    tbody.innerHTML = '';

    const horaLimite = localStorage.getItem('cfg_limite_alerta') || "07:10";
    const msgPadrao = localStorage.getItem('cfg_msg_cobranca') || "Olá, notamos que seu ponto ainda não foi registrado.";
    
    const agora = new Date();
    const horaAtual = String(agora.getHours()).padStart(2, '0') + ":" + String(agora.getMinutes()).padStart(2, '0');
    const estaAtrasado = horaAtual > horaLimite;

    listaFuncionarios.forEach(func => {
        const saldo = parseInt(func.banco || 0);
        const cor = saldo >= 0 ? 'text-emerald-600' : 'text-rose-600';
        const iniciais = func.nome ? func.nome.substring(0,2).toUpperCase() : '??';
        const bateuPontoHoje = parseInt(func.presente_hoje) > 0;

        // --- BOTÕES DE AÇÃO RÁPIDA (Telefone + Aniversário) ---
        let botoesTopo = '';

        // 1. TELEFONE
        if (func.telefone && func.telefone.length > 8) {
            botoesTopo += `
                <button onclick="cadastrarTelefone(${func.id})" class="ml-2 text-emerald-500 hover:text-emerald-700 transition-colors" title="Telefone OK (Clique para editar)">
                    <i class="fab fa-whatsapp"></i>
                </button>`;
        } else {
            botoesTopo += `
                <button onclick="cadastrarTelefone(${func.id})" class="ml-2 text-slate-300 hover:text-indigo-500 transition-colors" title="Adicionar Telefone">
                    <i class="fas fa-plus-circle"></i>
                </button>`;
        }

        // 2. ANIVERSÁRIO (NOVO)
        // Se tiver data (ex: 20/01), fica rosa. Se não, fica cinza.
        if (func.aniversario && func.aniversario.length >= 3) {
            botoesTopo += `
                <button onclick="cadastrarAniversario(${func.id}, '${func.aniversario}')" class="ml-2 text-pink-500 hover:text-pink-700 transition-colors" title="Niver: ${func.aniversario}">
                    <i class="fas fa-birthday-cake"></i>
                </button>`;
        } else {
            botoesTopo += `
                <button onclick="cadastrarAniversario(${func.id}, '')" class="ml-2 text-slate-300 hover:text-pink-400 transition-colors" title="Adicionar Aniversário">
                    <i class="fas fa-birthday-cake"></i>
                </button>`;
        }
        // --------------------------------------------------------

        let statusBadge = '';
        let acaoExtra = '';

        if (bateuPontoHoje) {
            statusBadge = `<span class="px-2 py-1 rounded text-[10px] font-bold bg-green-100 text-green-700"><i class="fas fa-check"></i> PRESENTE</span>`;
        } else {
            if (estaAtrasado) {
                statusBadge = `<span class="px-2 py-1 rounded text-[10px] font-bold bg-red-100 text-red-700 animate-pulse"><i class="fas fa-clock"></i> ATRASADO</span>`;
                
                if(func.telefone) {
                    const tel = func.telefone.replace(/[^0-9]/g, '');
                    const linkZap = `https://wa.me/55${tel}?text=${encodeURIComponent(msgPadrao)}`;
                    acaoExtra = `
                        <a href="${linkZap}" target="_blank" class="bg-red-50 text-red-600 hover:bg-red-100 border border-red-200 px-2 py-1 rounded text-xs font-bold mr-2 flex items-center gap-1" title="Cobrar Ponto">
                            <i class="fab fa-whatsapp"></i> Cobrar
                        </a>`;
                }
            } else {
                statusBadge = `<span class="px-2 py-1 rounded text-[10px] font-bold bg-slate-100 text-slate-500">AGUARDANDO</span>`;
            }
        }

        const btnPagar = saldo > 0 
            ? `<button onclick="realizarPagamentoHoras(${func.id}, '${func.nome}', ${saldo})" class="bg-emerald-100 text-emerald-700 hover:bg-emerald-200 px-3 py-1 rounded text-xs font-bold border border-emerald-200 mr-2 flex items-center gap-1"><i class="fas fa-dollar-sign"></i> Pagar</button>`
            : '';

        tbody.innerHTML += `
            <tr class="hover:bg-slate-50 border-b border-slate-100 transition-colors">
                <td class="px-6 py-4 flex items-center gap-3">
                    <div class="w-8 h-8 rounded-full bg-indigo-100 text-indigo-600 flex items-center justify-center font-bold text-xs shadow-sm">${iniciais}</div>
                    <div>
                        <div class="font-bold text-slate-700 flex items-center">
                            ${func.nome} 
                            ${botoesTopo}
                        </div>
                        <div class="text-xs text-slate-400">${func.cargo || 'Func'}</div>
                    </div>
                </td>
                <td class="px-6 py-4">${statusBadge}</td>
                <td class="px-6 py-4 font-mono font-bold ${cor}">${minsToTime(saldo)}</td>
                <td class="px-6 py-4 text-right flex justify-end items-center">
                    ${acaoExtra}
                    ${btnPagar}
                    <button onclick="abrirGestaoCompleta(${func.id}, '${func.nome}')" class="bg-white border border-indigo-200 text-indigo-700 hover:bg-indigo-50 px-3 py-1 rounded shadow-sm font-bold text-xs transition-colors">Gerir</button>
                </td>
            </tr>
        `;
    });
}

// --- CALENDÁRIO COM FERIADOS E NOMES ---

// Função para mudar o mês (Anterior/Próximo)
window.mudarMes = function(delta) {
    mesCalendario += delta;
    if (mesCalendario > 12) { mesCalendario = 1; anoCalendario++; }
    if (mesCalendario < 1) { mesCalendario = 12; anoCalendario--; }
    renderizarCalendarioGeral(); // Recarrega com os novos dados
}

window.renderizarCalendarioGeral = async function() {
    const container = document.getElementById('container-calendario');
    if(!container) return;
    
    // Mostra loading enquanto troca de mês
    container.innerHTML = '<div class="text-center py-12"><i class="fas fa-spinner fa-spin text-2xl text-indigo-600"></i><p>Carregando dados...</p></div>';

    const resp = await fetch('api.php', {
        method: 'POST',
        body: JSON.stringify({ 
            acao: 'dados_dashboard_completo',
            mes: String(mesCalendario).padStart(2, '0'),
            ano: anoCalendario
        })
    });
    const json = await resp.json();
    const dadosBanco = json.calendario || []; // Dados com nomes e contagens

    // Estrutura do Calendário
    const primeiroDiaSemana = new Date(anoCalendario, mesCalendario - 1, 1).getDay();
    const totalDiasMes = new Date(anoCalendario, mesCalendario, 0).getDate();
    const feriados = getFeriadosNacionais(anoCalendario);
    
    // Nome do mês por extenso
    const nomeMes = new Date(anoCalendario, mesCalendario - 1).toLocaleString('pt-BR', { month: 'long', year: 'numeric' });

    let htmlDias = '';
    
    // Espaços vazios
    for(let i=0; i<primeiroDiaSemana; i++) htmlDias += `<div class="h-28 bg-slate-50 border border-slate-100"></div>`;

    // Dias reais
    for(let dia=1; dia<=totalDiasMes; dia++) {
        const dataAtual = `${anoCalendario}-${String(mesCalendario).padStart(2,'0')}-${String(dia).padStart(2,'0')}`;
        const registro = dadosBanco.find(p => p.data_registro === dataAtual);
        // --- NOVO: ENCONTRA ANIVERSARIANTES DO DIA ---
        // Filtra a lista global de funcionários
        const aniversariantesDoDia = listaFuncionarios.filter(func => {
            if (!func.aniversario) return false;
            // Limpa tudo que não é número da data do funcionário (Ex: "20/01" -> "2001")
            const niverNumeros = func.aniversario.replace(/[^0-9]/g, '');
            // Formata o dia do loop (Ex: dia 5 e mes 2 -> "0502")
            const diaLoopNumeros = String(dia).padStart(2, '0') + String(mesCalendario).padStart(2, '0');
            
            // Compara os 4 primeiros dígitos (Dia e Mês)
            return niverNumeros.substring(0, 4) === diaLoopNumeros;
        });
        
        // Dados do dia
        const qtdPres = registro ? parseInt(registro.qtd_presentes) : 0;
        const nomesPres = registro ? registro.nomes_presentes : '';
        const qtdFerias = registro ? parseInt(registro.qtd_ferias) : 0;
        const nomesFerias = registro ? registro.nomes_ferias : '';
        
        // Verifica Feriado
        const feriadoNome = feriados[dataAtual];
        const isFeriado = !!feriadoNome;
        const isFimDeSemana = (new Date(anoCalendario, mesCalendario-1, dia).getDay() % 6 === 0);

        // Estilos
        let classeDia = "bg-white";
        if (isFeriado) classeDia = "bg-red-50";
        else if (isFimDeSemana) classeDia = "bg-slate-50";

        let badges = '';
        if (isFeriado) badges += `<span class="mb-1 block text-[10px] bg-red-100 text-red-700 px-1 py-0.5 rounded font-bold border border-red-200 truncate" title="${feriadoNome}">🎉 ${feriadoNome}</span>`;
        // --- DESENHA O BOLO NO CALENDÁRIO ---
        aniversariantesDoDia.forEach(aniv => {
            // Pega só o primeiro nome para caber
            const pNome = aniv.nome.split(' ')[0];
            badges += `<span class="mb-1 block text-[10px] bg-pink-100 text-pink-700 px-1 py-0.5 rounded font-bold border border-pink-200 truncate" title="Aniversário de ${aniv.nome}">🎂 ${pNome}</span>`;
        });
        if (qtdPres > 0) badges += `<span class="mb-1 block text-[10px] bg-green-100 text-green-700 px-1 py-0.5 rounded font-bold border border-green-200">✅ ${qtdPres} Trab.</span>`;
        if (qtdFerias > 0) badges += `<span class="mb-1 block text-[10px] bg-blue-100 text-blue-700 px-1 py-0.5 rounded font-bold border border-blue-200">🏖️ ${qtdFerias} Férias</span>`;

        // Prepara dados para o clique (Codificados para evitar erro de aspas)
        const listaNomesNiver = aniversariantesDoDia.map(u => u.nome).join(', ');
        const safeNomesNiver = listaNomesNiver ? encodeURIComponent(listaNomesNiver) : '';

        // Prepara dados para o clique (Codificados)
        const safeNomesPres = nomesPres ? encodeURIComponent(nomesPres) : '';
        const safeNomesFerias = nomesFerias ? encodeURIComponent(nomesFerias) : '';

        // ATENÇÃO: Adicionei o safeNomesNiver como último parâmetro aqui em baixo vvv
        htmlDias += `
            <div onclick="verDetalhesDia('${dataAtual}', '${safeNomesPres}', '${safeNomesFerias}', '${feriadoNome || ''}', '${safeNomesNiver}')" 
                 class="h-28 ${classeDia} border border-slate-200 p-1 hover:border-indigo-400 cursor-pointer relative flex flex-col transition-all group">
                <span class="font-bold text-slate-700 mb-1 ml-1 ${isFeriado ? 'text-red-600' : ''}">${dia}</span>
                <div class="flex-1 overflow-y-auto no-scrollbar">${badges}</div>
                <div class="absolute top-1 right-1 opacity-0 group-hover:opacity-100 text-indigo-400"><i class="fas fa-search-plus"></i></div>
            </div>
        `;
    }

    // Renderiza
    container.innerHTML = `
        <div class="bg-white rounded-xl shadow-sm border border-slate-200 overflow-hidden">
            <div class="bg-indigo-900 text-white p-4 flex justify-between items-center">
                <button onclick="mudarMes(-1)" class="hover:bg-indigo-700 p-2 rounded text-white"><i class="fas fa-chevron-left"></i> Anterior</button>
                <span class="font-bold text-lg uppercase tracking-widest">${nomeMes}</span>
                <button onclick="mudarMes(1)" class="hover:bg-indigo-700 p-2 rounded text-white">Próximo <i class="fas fa-chevron-right"></i></button>
            </div>
            <div class="grid grid-cols-7 text-center bg-slate-100 py-2 text-xs font-bold text-slate-500 uppercase">
                <div>Dom</div><div>Seg</div><div>Ter</div><div>Qua</div><div>Qui</div><div>Sex</div><div>Sáb</div>
            </div>
            <div class="grid grid-cols-7 bg-slate-200 gap-px border-t border-slate-200">
                ${htmlDias}
            </div>
        </div>
        <div class="mt-4 flex gap-4 text-xs text-gray-500 font-medium">
            <div class="flex items-center gap-1"><div class="w-3 h-3 bg-red-100 border border-red-200 rounded"></div> Feriado</div>
            <div class="flex items-center gap-1"><div class="w-3 h-3 bg-green-100 border border-green-200 rounded"></div> Dia Trabalhado</div>
            <div class="flex items-center gap-1"><div class="w-3 h-3 bg-blue-100 border border-blue-200 rounded"></div> Férias</div>
        </div>
    `;
}

// Modal que mostra QUEM trabalhou ou está de férias
window.verDetalhesDia = function(data, nomesP, nomesF, feriado, nomesN) {
    const nPres = decodeURIComponent(nomesP);
    const nFer = decodeURIComponent(nomesF);
    const nNiver = nomesN ? decodeURIComponent(nomesN) : ''; // <--- NOVO
    
    // Converte YYYY-MM-DD para DD/MM/YYYY
    const dataFmt = data.split('-').reverse().join('/');
    
    let html = '';
    
    if (feriado) {
        html += `<div class="bg-red-50 p-3 rounded border border-red-200 mb-3 text-red-700 font-bold text-center">🎉 ${feriado}</div>`;
    }

    // --- SEÇÃO DE ANIVERSÁRIO (NOVA) ---
    if (nNiver) {
        html += `
            <div class="mb-4 text-left">
                <h4 class="text-pink-600 font-bold mb-1 border-b border-pink-100 pb-1">🎂 Aniversariantes:</h4>
                <ul class="list-disc list-inside text-sm text-slate-700 bg-pink-50 p-2 rounded">
                    ${nNiver.split(', ').map(n => `<li>${n}</li>`).join('')}
                </ul>
            </div>`;
    }
    // -----------------------------------

    if (nFer) {
        html += `
            <div class="mb-4 text-left">
                <h4 class="text-blue-600 font-bold mb-1 border-b border-blue-100 pb-1">🏖️ Em Férias:</h4>
                <ul class="list-disc list-inside text-sm text-slate-700 bg-blue-50 p-2 rounded">
                    ${nFer.split(', ').map(n => `<li>${n}</li>`).join('')}
                </ul>
            </div>`;
    }

    if (nPres) {
        html += `
            <div class="text-left">
                <h4 class="text-green-600 font-bold mb-1 border-b border-green-100 pb-1">✅ Trabalharam:</h4>
                <ul class="list-disc list-inside text-sm text-slate-700 bg-green-50 p-2 rounded">
                    ${nPres.split(', ').map(n => `<li>${n}</li>`).join('')}
                </ul>
            </div>`;
    }

    if (!html) html = '<p class="text-gray-500 italic">Nenhum registro para este dia.</p>';

    Swal.fire({
        title: `Detalhes: ${dataFmt}`,
        html: html,
        showCloseButton: true,
        showConfirmButton: false
    });
}

// --- CALCULA FERIADOS BRASIL (FIXOS + MÓVEIS) ---
function getFeriadosNacionais(ano) {
    const f = { 
        [`${ano}-01-01`]: 'Confraternização Universal', 
        [`${ano}-04-21`]: 'Tiradentes', 
        [`${ano}-05-01`]: 'Dia do Trabalho', 
        [`${ano}-09-07`]: 'Independência do Brasil', 
        [`${ano}-10-12`]: 'Nossa Senhora Aparecida', 
        [`${ano}-11-02`]: 'Finados', 
        [`${ano}-11-15`]: 'Proclamação da República', 
        [`${ano}-11-20`]: 'Dia da Consciência Negra', 
        [`${ano}-12-25`]: 'Natal' 
    };
    
    // --- FERIADOS MUNICIPAIS (Santa Rita do Sapucaí - MG) ---
    f[`${ano}-05-22`] = 'Dia de Santa Rita de Cássia (Padroeira)';
    f[`${ano}-05-24`] = 'Emancipação Política';

    // --- CÁLCULO DE DATAS MÓVEIS (Páscoa) ---
    const a=ano%19, b=Math.floor(ano/100), c=ano%100, d=Math.floor(b/4), e=b%4, fl=Math.floor((b+8)/25), g=Math.floor((b-fl+1)/3), h=(19*a+b-d-g+15)%30, i=Math.floor(c/4), k=c%4, l=(32+2*e+2*i-h-k)%7, m=Math.floor((a+11*h+22*l)/451), mes=Math.floor((h+l-7*m+114)/31), dia=((h+l-7*m+114)%31)+1;
    const dtPascoa = new Date(ano, mes-1, dia);
    const addDias = (dt, dias) => { const d = new Date(dt); d.setDate(dt.getDate() + dias); return d.toISOString().split('T')[0]; };
    
    // --- PONTOS FACULTATIVOS E MÓVEIS ---
    f[addDias(dtPascoa, -48)] = 'Carnaval (Segunda-feira)';
    f[addDias(dtPascoa, -47)] = 'Carnaval (Terça-feira)';
    f[addDias(dtPascoa, -46)] = 'Quarta-feira de Cinzas (Facultativo)';
    f[addDias(dtPascoa, -2)]  = 'Paixão de Cristo (Sexta-feira Santa)';
    f[addDias(dtPascoa, 60)]  = 'Corpus Christi';

    return f;
}

// --- DEMAIS FUNÇÕES (Relatórios, Gerir, etc - Mantidas) ---
window.renderizarRelatoriosGerais = async function() {
    const container = document.getElementById('container-relatorios');
    if(!container) return;
    
    container.innerHTML = '<div class="text-center py-10"><i class="fas fa-spinner fa-spin text-indigo-600 text-3xl"></i><p class="mt-2 text-slate-500">Gerando análise...</p></div>';

    try {
        await carregarDadosRH(); // Garante que os dados estão frescos e CALCULADOS

        // 1. Calcula os Totais usando a listaFuncionarios (que já tem a regra do almoço aplicada)
        const totalFunc = listaFuncionarios.length;
        let totalPositivo = 0;
        let totalNegativo = 0;

        listaFuncionarios.forEach(f => {
            const saldo = parseInt(f.banco);
            if (saldo > 0) totalPositivo += saldo;
            if (saldo < 0) totalNegativo += Math.abs(saldo); // Soma positivo para exibir
        });

        // 2. Prepara os Top 5
        const listaOrdenada = [...listaFuncionarios].sort((a, b) => parseInt(b.banco) - parseInt(a.banco));
        const topPositivos = listaOrdenada.filter(f => parseInt(f.banco) > 0).slice(0, 5);
        const topNegativos = [...listaOrdenada].reverse().filter(f => parseInt(f.banco) < 0).slice(0, 5);
        const topNeutros   = listaOrdenada.filter(f => parseInt(f.banco) === 0).slice(0, 5);

        // Função auxiliar HTML (igual a antes)
        const htmlMiniLista = (lista, corTexto) => {
            if (lista.length === 0) return '<p class="text-xs text-slate-400 italic py-2">Ninguém nesta categoria.</p>';
            return lista.map(f => `
                <div class="flex justify-between items-center py-2 border-b border-slate-50 last:border-0 hover:bg-slate-50 transition-colors px-2 rounded">
                    <div class="flex items-center gap-2">
                        <div class="w-6 h-6 rounded-full bg-slate-100 text-slate-500 text-[10px] flex items-center justify-center font-bold">
                            ${f.nome.substring(0,2).toUpperCase()}
                        </div>
                        <span class="text-xs font-bold text-slate-700 truncate max-w-[120px]">${f.nome}</span>
                    </div>
                    <span class="text-xs font-mono font-bold ${corTexto}">
                        ${parseInt(f.banco) > 0 ? '+' : ''}${minsToTime(parseInt(f.banco))}
                    </span>
                </div>
            `).join('');
        };

        // 3. Renderiza o HTML
        container.innerHTML = `
            <div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
                <div class="bg-gradient-to-br from-indigo-500 to-purple-600 rounded-2xl p-6 text-white shadow-lg relative overflow-hidden">
                    <div class="relative z-10">
                        <p class="text-indigo-100 text-xs font-bold uppercase tracking-wider mb-1">Total Funcionários</p>
                        <h3 class="text-4xl font-extrabold">${totalFunc}</h3>
                        <p class="text-xs text-indigo-100 mt-2 flex items-center gap-1"><i class="fas fa-check-circle"></i> Ativos no sistema</p>
                    </div>
                    <i class="fas fa-users absolute -bottom-4 -right-4 text-8xl text-white opacity-10"></i>
                </div>

                <div class="bg-white rounded-2xl p-6 shadow-sm border border-slate-200 relative overflow-hidden group hover:shadow-md transition-all">
                    <div class="flex justify-between items-start">
                        <div>
                            <p class="text-slate-400 text-xs font-bold uppercase tracking-wider mb-1">Banco Positivo</p>
                            <h3 class="text-3xl font-extrabold text-emerald-600">+${minsToTime(totalPositivo)}</h3>
                        </div>
                        <div class="bg-emerald-100 text-emerald-600 p-2 rounded-lg"><i class="fas fa-arrow-up"></i></div>
                    </div>
                    <div class="mt-4 h-1.5 w-full bg-slate-100 rounded-full overflow-hidden">
                        <div class="h-full bg-emerald-500 w-[70%]"></div>
                    </div>
                </div>

                <div class="bg-white rounded-2xl p-6 shadow-sm border border-slate-200 relative overflow-hidden group hover:shadow-md transition-all">
                    <div class="flex justify-between items-start">
                        <div>
                            <p class="text-slate-400 text-xs font-bold uppercase tracking-wider mb-1">Banco Negativo</p>
                            <h3 class="text-3xl font-extrabold text-rose-600">-${minsToTime(totalNegativo)}</h3>
                        </div>
                        <div class="bg-rose-100 text-rose-600 p-2 rounded-lg"><i class="fas fa-arrow-down"></i></div>
                    </div>
                    <div class="mt-4 h-1.5 w-full bg-slate-100 rounded-full overflow-hidden">
                        <div class="h-full bg-rose-500 w-[40%]"></div>
                    </div>
                </div>
            </div>

            <div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
                <div class="bg-white rounded-xl shadow-sm border border-slate-200 p-5">
                    <h4 class="text-xs font-bold text-emerald-600 uppercase tracking-wide mb-4 border-b border-emerald-100 pb-2 flex items-center gap-2">
                        <i class="fas fa-trophy"></i> Top 5 Créditos (Extras)
                    </h4>
                    <div class="space-y-1">${htmlMiniLista(topPositivos, 'text-emerald-600')}</div>
                </div>

                <div class="bg-white rounded-xl shadow-sm border border-slate-200 p-5">
                    <h4 class="text-xs font-bold text-rose-600 uppercase tracking-wide mb-4 border-b border-rose-100 pb-2 flex items-center gap-2">
                        <i class="fas fa-stopwatch"></i> Top 5 Débitos
                    </h4>
                    <div class="space-y-1">${htmlMiniLista(topNegativos, 'text-rose-600')}</div>
                </div>

                <div class="bg-white rounded-xl shadow-sm border border-slate-200 p-5">
                    <h4 class="text-xs font-bold text-slate-500 uppercase tracking-wide mb-4 border-b border-slate-100 pb-2 flex items-center gap-2">
                        <i class="fas fa-balance-scale"></i> Top 5 Zerados
                    </h4>
                    <div class="space-y-1">${htmlMiniLista(topNeutros, 'text-slate-400')}</div>
                </div>
            </div>

            <div class="bg-white rounded-xl shadow-sm border border-slate-200 p-6">
                <h3 class="font-bold text-slate-700 mb-4 text-sm uppercase tracking-wide border-b pb-2">Detalhamento de Saldos</h3>
                <div class="overflow-x-auto">
                    <table class="w-full text-sm text-left">
                        <thead class="bg-slate-50 text-slate-500 font-bold text-xs uppercase">
                            <tr>
                                <th class="p-3 rounded-l-lg">Colaborador</th>
                                <th class="p-3">Cargo</th>
                                <th class="p-3 text-center">Saldo Banco</th>
                                <th class="p-3 text-right rounded-r-lg">Ação</th>
                            </tr>
                        </thead>
                        <tbody class="divide-y divide-slate-100 text-slate-600">
                            ${listaOrdenada.map(f => {
                                const s = parseInt(f.banco);
                                const cor = s >= 0 ? 'text-emerald-600 bg-emerald-50 border-emerald-100' : 'text-rose-600 bg-rose-50 border-rose-100';
                                const btnPagar = s > 0 
                                    ? `<button onclick="realizarPagamentoHoras(${f.id}, '${f.nome}', ${s})" class="text-emerald-600 hover:text-emerald-800 font-bold text-xs flex items-center justify-end gap-1 ml-auto transition-colors"><i class="fas fa-hand-holding-usd"></i> Pagar</button>`
                                    : `<span class="text-[10px] text-slate-300 italic text-right block">Sem saldo</span>`;

                                return `
                                    <tr class="hover:bg-slate-50 transition-colors">
                                        <td class="p-3 font-bold text-slate-700">${f.nome}</td>
                                        <td class="p-3 text-xs">${f.cargo || '-'}</td>
                                        <td class="p-3 text-center">
                                            <span class="${cor} px-2 py-1 rounded border font-mono font-bold text-xs">
                                                ${s > 0 ? '+' : ''}${minsToTime(s)}
                                            </span>
                                        </td>
                                        <td class="p-3 text-right">${btnPagar}</td>
                                    </tr>`;
                            }).join('')}
                        </tbody>
                    </table>
                </div>
            </div>
        `;
    } catch (e) {
        container.innerHTML = `<div class="bg-red-50 p-4 rounded border border-red-200 text-red-700">Erro ao carregar dashboard.</div>`;
    }
}

window.abrirGestaoCompleta = async function(id, nome) {
    const funcObj = listaFuncionarios.find(u => u.id == id);
    
    // --- CORREÇÃO: SALVAR O CARGO DO HORISTA ---
    funcionarioSelecionado = { id, nome, nivel_acesso: funcObj ? funcObj.nivel_acesso : '' };

    Swal.fire({ title: 'Carregando...', didOpen: () => Swal.showLoading() });

    try {
        const resp = await fetch('api.php', { method: 'POST', body: JSON.stringify({ acao: 'ler_pontos_usuario', usuario_id: id }) });
        const json = await resp.json();
        if (json.status === 'sucesso') { historicoGlobal = json.dados || []; }
    } catch (e) { console.error(e); }

    const historicoFunc = historicoGlobal.filter(h => h.usuario_id == id);
    const dtHoje = new Date();
    dtHoje.setHours(0,0,0,0); 

    const saldoTotal = historicoFunc.reduce((acc, curr) => {
        let h = []; try { h = JSON.parse(curr.horarios); } catch(e){}
        if (!Array.isArray(h)) h = ['', '', '', '', '', '', '', ''];
        
        const partesData = curr.data_registro.split('-');
        const dtReg = new Date(partesData[0], partesData[1]-1, partesData[2]);
        const isFuturo = dtReg > dtHoje;
        const isHoje = dtReg.getTime() === dtHoje.getTime();
        const obs = curr.observacao || '';

        const textoEvento = (h[0] || '').toUpperCase();
        const ehImune = textoEvento.includes('FÉRIAS') || textoEvento.includes('FERIAS') || 
                        textoEvento.includes('ATESTADO') || textoEvento.includes('FOLGA') || 
                        textoEvento.includes('LICENÇA');
        
        const ehPagamento = textoEvento.includes('PAGAMENTO');

        // --- CORREÇÃO: LÓGICA DE FALTA PARCIAL E HORISTA ---
        const temRegraS = obs.includes('[Regra: S]');
        const temRegraF = obs.includes('[Regra: F]');
        const nivel = funcObj && funcObj.nivel_acesso ? funcObj.nivel_acesso.toLowerCase() : '';
        const ehHorista = (nivel === 'horista' || nivel.includes('estagi'));
        const feriados = getFeriadosNacionais(partesData[0]);
        
        const temFalta = h.some(val => val && val.toUpperCase() === 'FALTA');
        let considerarFeriado = false;
        if (!temFalta) {
            const ehFeriadoCal = !!feriados[curr.data_registro];
            considerarFeriado = (ehFeriadoCal || temRegraF);
        }

        let meta = 480;
        if (ehImune || ehHorista) {
            meta = 0;
        } else if (temFalta) {
            const ehFeriadoOriginal = !!feriados[curr.data_registro] || temRegraF || temRegraS || dtReg.getDay() === 0;
            if (ehFeriadoOriginal) {
                let faltaM = h.slice(0, 2).some(v => v && (v.toUpperCase() === 'FALTA' || v.toUpperCase() === 'MANHÃ' || v.toUpperCase() === 'MANHA'));
                let faltaT = h.slice(2, 4).some(v => v && (v.toUpperCase() === 'FALTA' || v.toUpperCase() === 'TARDE'));
                meta = 0;
                if (faltaM) meta += 240;
                if (faltaT) meta += 240;
                if (!faltaM && !faltaT) meta = 480;
            } else if (dtReg.getDay() === 6) {
                meta = 240;
            } else {
                meta = 480;
            }
        } else {
            if (considerarFeriado || temRegraS) meta = 0;
            else if (dtReg.getDay() === 6) meta = 240;
            else if (dtReg.getDay() === 0) meta = 0;
        }
        // ----------------------------------------------------

        const saldoCalc = recalcularSaldoReal(h, meta, considerarFeriado);
        let valorFinal = (saldoCalc !== null ? saldoCalc : parseInt(curr.saldo_minutos));

        if (!ehPagamento && obs.match(/(?:PG:|Pagamento:)\s*(\d+:\d+)/i)) {
            const match = obs.match(/(?:PG:|Pagamento:)\s*(\d+:\d+)/i);
            if (match && match[1]) {
                const [ph, pm] = match[1].split(':').map(Number);
                valorFinal = valorFinal - ((ph * 60) + pm);
            }
        }

        // A CORREÇÃO: PASSE LIVRE PARA PAGAMENTOS
        if (isFuturo && valorFinal < 0 && !ehPagamento) return acc;
        const diaFechado = (h && h[3] && h[3].length >= 5);
        if (isHoje && valorFinal < 0 && !diaFechado && !ehHorista && !ehPagamento) return acc;

        return acc + valorFinal;
    }, 0);

    // Mágica do Espelho Automático para garantir que a tela e o banco estejam iguais
    fetch('api.php', {
        method: 'POST',
        body: JSON.stringify({ acao: 'atualizar_saldo_banco', usuario_id: id, novo_saldo: saldoTotal })
    }).catch(()=>{});

    const corSaldo = saldoTotal >= 0 ? 'text-emerald-600 bg-emerald-50 border-emerald-200' : 'text-rose-600 bg-rose-50 border-rose-200';
    const textoSaldo = minsToTime(saldoTotal); 

    // --- HTML DO MODAL ---
    Swal.fire({
        title: '',
        padding: 0,
        html: `
            <style>
                .swal2-html-container { margin: 0 !important; padding: 0 !important; overflow: hidden !important; height: 100%; }
                .swal2-popup { padding: 0 !important; border-radius: 12px !important; overflow: hidden !important; }
                .swal2-close { z-index: 50; top: 10px; right: 10px; position: absolute; }
            </style>

            <div class="flex flex-col h-full bg-white font-jakarta">
                <div class="flex flex-col md:flex-row justify-between items-center p-4 border-b border-slate-200 bg-white shadow-sm z-20 relative">
                    <div class="flex items-center gap-3 w-full md:w-auto">
                        <div class="w-10 h-10 bg-indigo-600 text-white rounded-lg flex items-center justify-center text-lg font-bold shadow-md shadow-indigo-200 shrink-0">
                            ${nome.charAt(0).toUpperCase()}
                        </div>
                        <div class="text-left leading-tight">
                            <h2 class="text-lg font-bold text-slate-800">${nome}</h2>
                            <div class="flex items-center gap-2 mt-0.5">
                                <span class="text-[10px] font-bold text-slate-400 uppercase">Banco Total:</span>
                                <span id="header-saldo-total" class="${corSaldo} px-2 py-0.5 rounded text-[10px] font-mono font-bold border">
                                    ${textoSaldo} </span>
                            </div>
                        </div>
                    </div>

                    <div class="flex flex-wrap gap-2 justify-end w-full md:w-auto mt-2 md:mt-0 pr-8">
                        <button onclick="lancarAjuste(${id})" class="h-8 px-3 rounded-md bg-indigo-600 text-white shadow-md shadow-indigo-200 hover:bg-indigo-700 text-xs font-bold transition-all flex items-center gap-1"><i class="fas fa-plus"></i> Ajuste / Evento</button>
                        <button onclick="realizarPagamentoHoras(${id}, '${nome}', ${saldoTotal})" class="h-8 px-3 rounded-md bg-emerald-600 text-white shadow-md shadow-emerald-200 hover:bg-emerald-700 text-xs font-bold transition-all flex items-center gap-1"><i class="fas fa-hand-holding-usd"></i> Pagar</button>
                        <button onclick="imprimirRelatorioMensal('${nome}')" class="h-8 w-8 rounded-md bg-white text-slate-700 border border-slate-300 hover:bg-slate-50 flex items-center justify-center text-xs shadow-sm" title="Imprimir"><i class="fas fa-print"></i></button>
                        <button onclick="exportarExcel('${nome}')" class="h-8 px-3 rounded-md bg-green-600 text-white shadow-md shadow-green-200 hover:bg-green-700 text-xs font-bold transition-all flex items-center gap-1"><i class="fas fa-file-excel"></i> Excel</button>
                        <button onclick="sincronizarSaldosDoFuncionario('${nome}')" class="h-8 px-3 rounded-md bg-purple-600 text-white shadow-md shadow-purple-200 hover:bg-purple-700 text-xs font-bold transition-all flex items-center gap-1" title="Gravar este valor no banco"><i class="fas fa-sync-alt"></i> Sincronizar</button>
                        <button onclick="preencherMesAutomatico(${id}, '${nome}')" class="h-8 px-3 rounded-md bg-indigo-500 text-white shadow-md shadow-indigo-200 hover:bg-indigo-600 text-xs font-bold transition-all flex items-center gap-1" title="Transformar dias vazios em presença padrão"><i class="fas fa-magic"></i> Preencher Padrão</button>
                        <button onclick="listarEventosParaExclusao(${id}, '${nome}')" class="h-8 px-3 rounded-md bg-rose-600 text-white shadow-md shadow-rose-200 hover:bg-rose-700 text-xs font-bold transition-all flex items-center gap-1"><i class="fas fa-trash-alt"></i> Excluir Eventos</button>
                    </div>
                </div>

                <div class="bg-indigo-900 text-white px-3 py-1.5 flex flex-col md:flex-row justify-between items-center shadow-md z-10 gap-2 shrink-0">
                    <div class="flex items-center gap-3 order-2 md:order-1 w-full md:w-auto justify-between md:justify-start">
                        <button onclick="mudarMesGestao(-1)" class="hover:bg-white/10 p-1 rounded transition-colors text-[10px] font-bold uppercase flex items-center gap-1"><i class="fas fa-chevron-left"></i> Ant</button>
                        <span id="titulo-mes-gestao" class="font-bold text-sm uppercase tracking-wider min-w-[120px] text-center">...</span>
                        <button onclick="mudarMesGestao(1)" class="hover:bg-white/10 p-1 rounded transition-colors text-[10px] font-bold uppercase flex items-center gap-1">Prox <i class="fas fa-chevron-right"></i></button>
                    </div>
                    <div class="flex gap-3 order-1 md:order-2 text-[10px] font-medium w-full md:w-auto justify-center bg-indigo-800/50 md:bg-transparent p-1 rounded">
                        <div class="flex items-center gap-1"><span class="text-emerald-300 font-bold">Cred:</span> <span id="kpi-credito">--</span></div>
                        <div class="h-3 w-px bg-indigo-700"></div>
                        <div class="flex items-center gap-1"><span class="text-rose-300 font-bold">Deb:</span> <span id="kpi-debito">--</span></div>
                    </div>
                </div>

                <div class="flex-grow overflow-hidden relative bg-slate-100 h-full">
                    <div class="absolute inset-0 overflow-y-auto custom-scroll">
                        <table class="w-full text-sm border-collapse table-fixed" id="print-table">
                            <thead class="bg-slate-50 text-[10px] font-bold text-slate-500 uppercase sticky top-0 z-20 shadow-sm border-b border-slate-200">
                                <tr>
                                    <th class="py-2 pl-4 text-left w-24 bg-slate-50">Data</th>
                                    <th class="py-2 text-center bg-slate-50">Ent 1</th>
                                    <th class="py-2 text-center bg-slate-50">Sai 1</th>
                                    <th class="py-2 text-center bg-slate-50">Ent 2</th>
                                    <th class="py-2 text-center bg-slate-50">Sai 2</th>
                                    <th class="py-2 text-center w-20 bg-slate-50">Saldo</th>
                                    <th class="py-2 pr-4 text-right w-12 bg-slate-50"></th>
                                </tr>
                            </thead>
                            <tbody id="corpo-tabela-gestao" class="divide-y divide-slate-100 bg-white"></tbody>
                            <tfoot id="rodape-tabela-gestao" class="bg-slate-50 border-t-2 border-slate-200 font-bold text-slate-600 sticky bottom-0 z-20 shadow-[0_-4px_6px_-1px_rgba(0,0,0,0.1)]"></tfoot>
                        </table>
                    </div>
                </div>
            </div>
        `,
        width: '900px',
        showConfirmButton: false,
        showCloseButton: true,
        padding: 0,
        customClass: { popup: 'rounded-xl overflow-hidden h-[90vh] p-0', htmlContainer: 'h-full m-0 p-0' },
        didOpen: () => {
            renderizarTabelaGestao();
        }
    });
};
// --- FUNÇÃO DE NAVEGAÇÃO ---
window.mudarMesGestao = function(delta) {
    mesGestao += delta;
    if(mesGestao > 12) { mesGestao = 1; anoGestao++; }
    if(mesGestao < 1) { mesGestao = 12; anoGestao--; }
    renderizarTabelaGestao();
}
// --- FUNÇÃO QUE DESENHA A TABELA DO MÊS SELECIONADO ---
window.renderizarTabelaGestao = function() {
    if (!funcionarioSelecionado) return;

    const tbody = document.getElementById('corpo-tabela-gestao');
    const tfoot = document.getElementById('rodape-tabela-gestao');
    const titulo = document.getElementById('titulo-mes-gestao');
    const kpiCred = document.getElementById('kpi-credito');
    const kpiDeb = document.getElementById('kpi-debito');

    if(!tbody) return;

    const dtHoje = new Date();
    const hojeStr = dtHoje.toISOString().split('T')[0];

    // Filtros
    const historicoFunc = historicoGlobal.filter(h => h.usuario_id == funcionarioSelecionado.id);
    const filtroMes = `${anoGestao}-${String(mesGestao).padStart(2,'0')}`;
    const dataRef = new Date(anoGestao, mesGestao - 1, 1);
    titulo.innerText = dataRef.toLocaleString('pt-BR', { month: 'long', year: 'numeric' }).toUpperCase();

    // 1. SALDO ANTERIOR (Mantido igual)
    const dadosAnteriores = historicoFunc.filter(dia => dia.data_registro < `${filtroMes}-01`);
    let saldoAnterior = dadosAnteriores.reduce((acc, reg) => {
         let h = []; try { h = JSON.parse(reg.horarios); } catch(e){}
         const obs = reg.observacao || '';
         const temRegraS = obs.includes('[Regra: S]');
         const temRegraF = obs.includes('[Regra: F]');
         const funcObj = listaFuncionarios.find(u => u.id == funcionarioSelecionado.id);
         const nivel = funcObj ? funcObj.nivel_acesso.toLowerCase() : '';
         const ehHorista = (nivel === 'horista' || nivel.includes('estagi'));
         const feriados = getFeriadosNacionais(reg.data_registro.split('-')[0]);
         const ehFeriadoCal = !!feriados[reg.data_registro];
         const considerarFeriado = (ehFeriadoCal || temRegraF);
         let meta = parseInt(reg.meta_minutos);
         if (isNaN(meta)) meta = 480;
         if (ehHorista || considerarFeriado || temRegraS) { meta = 0; } 
         else { const diaSem = new Date(reg.data_registro + 'T00:00:00').getDay(); if (diaSem === 6) meta = 240; }
         const sc = recalcularSaldoReal(h, meta, considerarFeriado);
         let val = (sc !== null ? sc : parseInt(reg.saldo_minutos));
         if (obs.match(/(?:PG:|Pagamento:)\s*(\d+:\d+)/i)) {
            const match = obs.match(/(?:PG:|Pagamento:)\s*(\d+:\d+)/i);
            if (match && match[1]) { const [ph, pm] = match[1].split(':').map(Number); val = val - ((ph * 60) + pm); }
         }
         return acc + val;
    }, 0);

    const ultimoDiaDoMes = new Date(anoGestao, mesGestao, 0).getDate();
    let saldoMes = 0;
    let totalCreditoMes = 0;
    let totalDebitoMes = 0;
    let html = '';

    // --- LOOP DOS DIAS ---
    for (let dia = 1; dia <= ultimoDiaDoMes; dia++) {
        const dataLoopStr = `${filtroMes}-${String(dia).padStart(2, '0')}`;
        const isFuturo = (dataLoopStr > hojeStr);
        const registro = historicoFunc.find(r => r.data_registro === dataLoopStr);
        
        const dataObj = new Date(dataLoopStr + 'T00:00:00');
        const dataFmt = dataObj.toLocaleDateString('pt-BR');
        const diaSemana = dataObj.toLocaleDateString('pt-BR', { weekday: 'short' }).toUpperCase();
        const isFimDeSemana = (diaSemana === 'SÁB' || diaSemana === 'DOM');
        const isHoje = (dataLoopStr === hojeStr);

        let h = ['', '', '', ''];
        let saldo = 0;
        let obsBruta = '';
        let idRegistro = null;
        let corSaldo = 'text-slate-300';
        let bgLinha = isFimDeSemana ? 'bg-slate-50/50' : 'hover:bg-indigo-50/30';
        let textoData = isFimDeSemana ? 'text-slate-400' : 'text-slate-700';
        let temPagamento = false;
        
        // NOVO: Variável para controlar a cor do texto das horas
        let classeCorHorario = "text-slate-600 font-bold"; 

        if (registro) {
            // --- CENÁRIO 1: EXISTE REGISTRO NO BANCO ---
            try { h = JSON.parse(registro.horarios); } catch(e) {}
            if (!h || !Array.isArray(h)) h = ['', '', '', '']; 
            obsBruta = registro.observacao || '';
            idRegistro = registro.id;

            // --- CORREÇÃO: LÓGICA DE FALTA PARCIAL E HORISTA NA TABELA ---
            const temRegraS = obsBruta.includes('[Regra: S]');
            const temRegraF = obsBruta.includes('[Regra: F]');
            const nivel = funcionarioSelecionado.nivel_acesso ? funcionarioSelecionado.nivel_acesso.toLowerCase() : '';
            const ehHoristaVisual = (nivel === 'horista' || nivel.includes('estagi'));
            const feriados = getFeriadosNacionais(anoGestao);
            
            const temFalta = h.some(val => val && val.toUpperCase() === 'FALTA');
            let considerarFeriado = false;
            if (!temFalta) {
                const ehFeriadoCal = !!feriados[dataLoopStr];
                considerarFeriado = (ehFeriadoCal || temRegraF);
            }

            let meta = 480;
            if (ehHoristaVisual) { // Imune was removed from visual logic in original code, treating horista
                meta = 0;
            } else if (temFalta) {
                const ehFeriadoOriginal = !!feriados[dataLoopStr] || temRegraF || temRegraS || dataObj.getDay() === 0;
                if (ehFeriadoOriginal) {
                    let faltaM = h.slice(0, 2).some(v => v && (v.toUpperCase() === 'FALTA' || v.toUpperCase() === 'MANHÃ' || v.toUpperCase() === 'MANHA'));
                    let faltaT = h.slice(2, 4).some(v => v && (v.toUpperCase() === 'FALTA' || v.toUpperCase() === 'TARDE'));
                    meta = 0;
                    if (faltaM) meta += 240;
                    if (faltaT) meta += 240;
                    if (!faltaM && !faltaT) meta = 480;
                } else if (dataObj.getDay() === 6) {
                    meta = 240;
                } else {
                    meta = 480;
                }
            } else {
                if (considerarFeriado || temRegraS) meta = 0;
                else if (dataObj.getDay() === 6) meta = 240;
                else if (dataObj.getDay() === 0) meta = 0;
            }
            // ----------------------------------------------------

            const saldoCalculado = recalcularSaldoReal(h, meta, considerarFeriado);
            saldo = (saldoCalculado !== null) ? saldoCalculado : parseInt(registro.saldo_minutos);

            if (obsBruta.match(/(?:PG:|Pagamento:)\s*(\d+:\d+)/i)) {
                const match = obsBruta.match(/(?:PG:|Pagamento:)\s*(\d+:\d+)/i);
                if (match && match[1]) { const [ph, pm] = match[1].split(':').map(Number); saldo = saldo - ((ph * 60) + pm); }
            }
            if (h[0] === 'PAGAMENTO') { saldo = -Math.abs(saldo); }
            if (isFuturo && saldo < 0 && h[0] !== 'PAGAMENTO') { saldo = 0; }
            
            saldoMes += saldo;
            if (saldo > 0) totalCreditoMes += saldo;
            if (saldo < 0) totalDebitoMes += Math.abs(saldo);

            if (saldo === 0) corSaldo = 'text-slate-300';
            else corSaldo = saldo > 0 ? 'text-emerald-600 font-bold' : 'text-rose-600 font-bold';
            if (obsBruta.includes('Pagamento:') || obsBruta.includes('PG:')) temPagamento = true;

        } else {
            // --- CENÁRIO 2: NÃO EXISTE REGISTRO (PRÉ-PREENCHIMENTO VISUAL) ---
            const feriadosGeral = getFeriadosNacionais(anoGestao);
            const ehFeriadoVazio = !!feriadosGeral[dataLoopStr];

            if (!ehFeriadoVazio) {
                if (diaSemana === 'SÁB') {
                    h = ['08:00', '12:00', '', '', '', '', '', ''];
                    classeCorHorario = "text-slate-300 italic font-normal"; 
                } else if (diaSemana !== 'DOM') {
                    h = ['07:30', '11:30', '13:00', '17:00', '', '', '', ''];
                    classeCorHorario = "text-slate-300 italic font-normal"; 
                }
            }
        }

        let displaySaldo = minsToTime(saldo);
        if (isHoje && saldo < 0 && !h[3]) {
            displaySaldo = `<span class="text-[10px] uppercase font-bold text-blue-500 tracking-wide flex items-center gap-1"><i class="fas fa-hourglass-half"></i> ...</span>`;
            corSaldo = ""; 
        }

        // --- MONTAGEM HTML ---
        const htmlHora = (hora) => {
            if (!hora) return '<span class="text-slate-100">-</span>';
            return `<span class="${classeCorHorario}">${hora}</span>`;
        };

        const safeObs = obsBruta ? obsBruta.replace(/'/g, "\\'").replace(/"/g, '&quot;') : '';
        const iconeObs = (obsBruta && !temPagamento) ? `<button onclick="Swal.fire({title: '', text: '${safeObs}', icon: 'info'})" class="ml-1 text-indigo-300 hover:text-indigo-600" title="Ver Obs"><i class="fas fa-comment-dots"></i></button>` : '';

        let labelRegra = '';
        if (obsBruta.includes('[Regra: S]')) labelRegra = `<span class="ml-2 text-[9px] bg-emerald-100 text-emerald-700 px-1 rounded border border-emerald-200">EXTRA</span>`;
        if (obsBruta.includes('[Regra: F]')) labelRegra = `<span class="ml-2 text-[9px] bg-amber-100 text-amber-700 px-1 rounded border border-amber-200">FERIADO (2x)</span>`;

        let conteudoMeio = '';
        if (h[0] === 'PAGAMENTO') {
            conteudoMeio = `<td colspan="4" class="py-4 px-2 text-center"><span class="inline-flex items-center px-2.5 py-0.5 rounded text-xs font-bold bg-emerald-100 text-emerald-800 border border-emerald-200"><i class="fas fa-check-double mr-1.5"></i> PAGAMENTO REALIZADO</span></td>`;
            corSaldo = "text-emerald-600 font-bold bg-emerald-50 px-2 py-1 rounded border border-emerald-100";
            displaySaldo = minsToTime(saldo); 
        } 
        else if (['Falta', 'Atestado', 'Férias'].includes(h[0])) {
            let corBadge = h[0] === 'Falta' ? 'bg-rose-100 text-rose-700' : 'bg-blue-50 text-blue-700';
            conteudoMeio = `<td colspan="4" class="py-4 px-2 text-center"><span class="inline-block px-2 py-0.5 rounded text-xs font-bold uppercase ${corBadge} border">${h[0]}</span></td>`;
        } else {
            conteudoMeio = `
                <td class="py-4 text-center text-sm border-r border-slate-50 last:border-0 align-middle">${htmlHora(h[0])}</td>
                <td class="py-4 text-center text-sm border-r border-slate-50 last:border-0 align-middle">${htmlHora(h[1])}</td>
                <td class="py-4 text-center text-sm border-r border-slate-50 last:border-0 align-middle">${htmlHora(h[2])}</td>
                <td class="py-4 text-center text-sm align-middle">${htmlHora(h[3])}</td>
            `;
        }
        if (temPagamento && h[0] !== 'PAGAMENTO') corSaldo += " border-b-2 border-emerald-400"; 

        const paramId = idRegistro ? idRegistro : 'null';
        const paramData = `'${dataLoopStr}'`;

        html += `
            <tr class="${bgLinha} transition-colors group border-b border-slate-50">
                <td class="py-4 pl-6 whitespace-nowrap align-middle">
                    <div class="flex flex-col">
                        <span class="font-bold ${textoData} text-sm">${dataFmt}${labelRegra}</span>
                        <span class="text-[10px] text-slate-400 font-bold uppercase">${diaSemana}</span>
                    </div>
                </td>
                ${conteudoMeio}
                <td class="py-4 text-center whitespace-nowrap align-middle">
                    <div class="flex items-center justify-center gap-1 text-sm ${corSaldo}">
                        ${displaySaldo}${iconeObs}
                    </div>
                </td>
                <td class="py-4 pr-6 text-right align-middle">
                    <button onclick="editarRegistro(${paramId}, ${paramData}, ${funcionarioSelecionado.id})" 
                            class="text-slate-300 hover:text-indigo-600 p-2 rounded-full hover:bg-white hover:shadow-sm transition-all opacity-0 group-hover:opacity-100 focus:opacity-100"
                            title="Editar Dia">
                        <i class="fas fa-pen"></i>
                    </button>
                </td>
            </tr>`;
    }

    tbody.innerHTML = html;

    if (tfoot) {
        tfoot.innerHTML = `
            <tr class="bg-slate-50">
                <td colspan="5" class="py-3 pr-4 text-right text-xs font-bold text-slate-400 uppercase tracking-wider border-r border-slate-200">Saldo Anterior:</td>
                <td class="py-3 text-center font-mono font-bold text-slate-500 border-r border-slate-200">${minsToTime(saldoAnterior)}</td>
                <td></td>
            </tr>
            <tr class="bg-white">
                <td colspan="5" class="py-4 pr-4 text-right text-sm font-bold text-slate-700 border-r border-slate-100">Resultado deste Mês:</td>
                <td class="py-4 text-center font-mono text-lg font-bold ${saldoMes >= 0 ? 'text-emerald-600' : 'text-rose-600'} border-r border-slate-100">
                    ${minsToTime(saldoMes)}
                </td>
                <td></td>
            </tr>
        `;
    }
    if (kpiCred) kpiCred.innerText = minsToTime(totalCreditoMes);
    if (kpiDeb) kpiDeb.innerText = minsToTime(totalDebitoMes);
}

// --- FUNÇÃO PARA IMPRIMIR O MÊS ATUAL ---
window.imprimirRelatorioMensal = function(nomeFuncionario) {
    // 1. Cria um estilo CSS exclusivo para o momento da impressão
    const style = document.createElement('style');
    style.innerHTML = `
        @media print {
            @page { margin: 10mm; size: portrait; }
            
            /* Esconde tudo que não é o modal do SweetAlert */
            body > *:not(.swal2-container) { display: none !important; }
            
            /* Configura o fundo para branco e força cores exatas (Chrome/Edge) */
            body { background: white !important; -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }

            /* Ajusta o container principal do alerta */
            .swal2-container {
                position: absolute !important;
                top: 0 !important;
                left: 0 !important;
                width: 100% !important;
                height: auto !important;
                z-index: 99999 !important;
                background: white !important;
                overflow: visible !important;
            }
            
            .swal2-popup {
                width: 100% !important;
                max-width: 100% !important;
                height: auto !important;
                box-shadow: none !important;
                border: none !important;
                padding: 0 !important;
                margin: 0 !important;
                overflow: visible !important;
            }

            /* O SEGREDO: Desativa as barras de rolagem e estica a altura */
            .swal2-html-container,
            .swal2-html-container .flex-grow,
            .swal2-html-container .overflow-y-auto,
            .swal2-html-container .absolute,
            .swal2-html-container .h-full {
                position: static !important;
                height: auto !important;
                overflow: visible !important;
                display: block !important;
                max-height: none !important;
            }

            /* Esconde elementos desnecessários no papel */
            .swal2-close,                         /* Botão X */
            .swal2-html-container button,         /* Botões de Ação */
            .swal2-html-container .shadow-md,     /* Sombras */
            .swal2-html-container .bg-indigo-900, /* Barra de Navegação Azul Escuro */
            .swal2-html-container .bg-slate-800   /* Barra de Saldo Escura */
            {
                display: none !important;
            }

            /* Ajustes finos na tabela para leitura */
            table { width: 100% !important; border-collapse: collapse !important; font-size: 10pt !important; }
            th, td { border: 1px solid #ccc !important; padding: 4px 8px !important; color: #000 !important; }
            
            /* Força a cor dos badges de saldo e status */
            .bg-emerald-100 { background-color: #d1fae5 !important; }
            .bg-rose-100 { background-color: #ffe4e6 !important; }
            .text-emerald-600 { color: #059669 !important; }
            .text-rose-600 { color: #e11d48 !important; }
            
            /* Adiciona um cabeçalho simples de impressão */
            .print-header-only {
                display: block !important;
                text-align: center;
                margin-bottom: 20px;
                border-bottom: 2px solid #000;
                padding-bottom: 10px;
            }
        }
        
        /* Esconde o cabeçalho de impressão na tela normal */
        .print-header-only { display: none; }
    `;
    document.head.appendChild(style);

    // 2. Adiciona um título temporário para sair no papel
    const tituloImpresso = document.createElement('div');
    tituloImpresso.className = 'print-header-only';
    tituloImpresso.innerHTML = `
        <h1 style="font-size: 18pt; font-weight: bold; margin: 0;">Relatório de Ponto</h1>
        <h2 style="font-size: 14pt; margin: 5px 0;">Funcionário: ${nomeFuncionario}</h2>
        <p style="font-size: 10pt; color: #666;">Emitido em: ${new Date().toLocaleDateString('pt-BR')} às ${new Date().toLocaleTimeString('pt-BR')}</p>
    `;
    
    // Insere no topo do modal
    const modalBody = document.querySelector('.swal2-html-container');
    if(modalBody) modalBody.prepend(tituloImpresso);

    // 3. Aciona a impressão
    setTimeout(() => {
        window.print();
        
        // 4. Limpeza pós-impressão (para não estragar a tela)
        document.head.removeChild(style);
        if(tituloImpresso) tituloImpresso.remove();
    }, 100);
}

// --- 2. LANÇAR AJUSTE (Obs Opcional + Explicação do Banco) ---
window.lancarAjuste = async function(idUsuario) {
    const { value: formValues } = await Swal.fire({
        title: '<h3 class="text-xl font-bold text-slate-700">Lançar Ajuste / Evento</h3>',
        html: `
            <div class="space-y-4 text-left p-2">
                <div class="grid grid-cols-2 gap-4">
                    <div>
                        <label class="block text-xs font-bold text-slate-500 uppercase mb-1">Data Início</label>
                        <input id="ajuste-data" type="date" class="w-full border border-slate-300 rounded-lg p-2.5 bg-slate-50 outline-none">
                    </div>
                    <div>
                        <label class="block text-xs font-bold text-slate-500 uppercase mb-1">Tipo de Evento</label>
                        <select id="ajuste-tipo" class="w-full border border-slate-300 rounded-lg p-2.5 bg-white outline-none font-bold text-indigo-700">
                            <option value="Ajuste Manual">🛠️ Ajuste Manual (Horas)</option>
                            <option value="Falta Integral">❌ Falta Integral (8h)</option>
                            <option value="Falta Manha">🟠 Falta Manhã (4h)</option>
                            <option value="Falta Tarde">🟠 Falta Tarde (4h)</option>
                            <option value="Atestado">🏥 Atestado Médico</option>
                            <option value="Férias">🏖️ Férias</option>
                            <option value="Folga">📅 Folga / Compensação</option>
                        </select>
                    </div>
                </div>

                <div class="flex items-center gap-4 bg-yellow-50 p-3 rounded-lg border border-yellow-100">
                    <div class="flex-grow">
                        <label class="block text-xs font-bold text-yellow-700 uppercase mb-1">Qtd. Dias</label>
                    </div>
                    <input id="ajuste-dias" type="number" min="1" value="1" class="w-20 border border-yellow-300 rounded-lg p-2 text-center font-bold text-yellow-800">
                </div>

                <hr class="border-slate-100 my-2">

                <div class="bg-slate-50 p-4 rounded-xl border border-slate-200 shadow-sm relative overflow-hidden">
                    <div class="absolute top-0 left-0 w-1 h-full bg-indigo-500"></div>
                    <p class="text-xs font-bold text-indigo-700 mb-3 uppercase tracking-wider">Ajuste de Banco (Manual)</p>
                    <div class="grid grid-cols-2 gap-4">
                        <div>
                            <label class="block text-[10px] font-bold text-slate-400 uppercase mb-1">Operação</label>
                            <select id="ajuste-sinal" class="w-full border border-slate-300 rounded-lg p-2 bg-white text-sm font-bold">
                                <option value="1" class="text-emerald-600 font-bold">(+) CREDITAR</option>
                                <option value="-1" class="text-rose-600 font-bold">(-) DEBITAR</option>
                            </select>
                        </div>
                        <div>
                            <label class="block text-[10px] font-bold text-slate-400 uppercase mb-1">Qtd. Horas (HH:MM)</label>
                            <input id="ajuste-horas" type="text" class="w-full border border-slate-300 rounded-lg p-2 text-lg font-mono text-center font-bold" value="00:00" placeholder="00:00">
                        </div>
                    </div>
                </div>

                <div>
                    <label class="block text-xs font-bold text-slate-500 uppercase mb-1">Observação</label>
                    <textarea id="ajuste-obs" class="w-full border border-slate-300 rounded-lg p-3 text-sm h-20 outline-none resize-none"></textarea>
                </div>
            </div>
        `,
        width: '550px',
        showCancelButton: true,
        confirmButtonText: 'Confirmar',
        confirmButtonColor: '#4f46e5',
        preConfirm: () => {
            const data = document.getElementById('ajuste-data').value;
            const horasStr = document.getElementById('ajuste-horas').value;
            
            if (!data) return Swal.showValidationMessage('Selecione a data.');
            if (!horasStr.includes(':')) return Swal.showValidationMessage('Formato de hora inválido. Use HH:MM');

            return {
                data: data,
                tipo: document.getElementById('ajuste-tipo').value,
                dias: document.getElementById('ajuste-dias').value,
                hora: horasStr,
                sinal: document.getElementById('ajuste-sinal').value,
                obs: document.getElementById('ajuste-obs').value
            };
        }
    });

    if (formValues) {
        // 1. Pega as horas digitadas (Manual)
        const [h, m] = formValues.hora.split(':').map(Number);
        let minutos = (h * 60) + m;
        let tipoFinal = formValues.tipo;

        // 2. LÓGICA DE DECISÃO INTELIGENTE
        
        // CENÁRIO A: Usuário digitou horas manuais (Ex: 04:00) -> MODO MANUAL
        if (minutos > 0) {
            tipoFinal = 'Ajuste Manual';
            // Aplica o sinal selecionado (Crédito ou Débito)
            minutos = minutos * parseInt(formValues.sinal);
        } 
        
        // CENÁRIO B: Usuário deixou 00:00 -> MODO AUTOMÁTICO (PRESETS)
        else {
            // Aqui definimos os valores padrões em minutos para cada tipo
            if (tipoFinal === 'Falta Integral') {
                minutos = -480; // Desconta 8 horas
            } 
            else if (tipoFinal === 'Falta Manha' || tipoFinal === 'Falta Tarde') {
                minutos = -240; // Desconta 4 horas
            }
            else if (tipoFinal === 'Férias' || tipoFinal === 'Folga') {
                minutos = 0; // Apenas registro visual, não altera saldo (ou mude se desejar)
            }
            // Se for Atestado, geralmente abona (0) ou paga (+480). 
            // Vou deixar 0 para segurança, se quiser pagar use Ajuste Manual.
            else {
                minutos = 0; 
            }
        }

        Swal.showLoading();

        try {
            const resp = await fetch('api.php', {
                method: 'POST',
                body: JSON.stringify({
                    acao: 'lancar_ajuste', 
                    usuario_id: idUsuario, 
                    data: formValues.data,
                    qtde_dias: formValues.dias,
                    tipo: tipoFinal,
                    saldo_minutos: minutos, // Agora vai o valor correto (-480, -240 ou manual)
                    obs: formValues.obs
                })
            });
            
            const json = await resp.json();
            
            if(json.status === 'sucesso') {
                Swal.fire({ icon: 'success', title: 'Sucesso', timer: 1000, showConfirmButton: false });
                
                // FORÇA O RECÁLCULO TOTAL PARA GARANTIR QUE A "VISÃO GERAL" ATUALIZE
                await fetch('api.php', { 
                    method: 'POST', 
                    body: JSON.stringify({ acao: 'recalcular_toda_base_do_zero', usuario_id: idUsuario }) 
                });

                await carregarDadosRH();
                if(funcionarioSelecionado) abrirGestaoCompleta(funcionarioSelecionado.id, funcionarioSelecionado.nome);
            } else {
                Swal.fire('Erro', json.msg, 'error');
            }
        } catch(e) {
            Swal.fire('Erro', 'Falha na conexão', 'error');
        }
    }
}

// Função auxiliar para limpar o HTML principal
function gerarLinhasTabelaCompleta(historico) {
    if (historico.length === 0) return '<tr><td colspan="7" class="p-6 text-center text-gray-400">Nenhum registro encontrado no histórico.</td></tr>';

    return historico.map(dia => {
        const dataObj = new Date(dia.data_registro + 'T00:00:00');
        const diaSemana = dataObj.toLocaleDateString('pt-BR', { weekday: 'short' }).toUpperCase();
        const dataFmt = dataObj.toLocaleDateString('pt-BR');
        
        const h = dia.horarios_array;
        const saldo = dia.saldo;
        const corSaldo = saldo >= 0 ? 'text-emerald-600 bg-emerald-50' : 'text-rose-600 bg-rose-50';
        const sinal = saldo > 0 ? '+' : '';

        // Identifica eventos especiais para formatar a linha
        let classeLinha = 'hover:bg-slate-50 transition-colors';
        let conteudoHorarios = `
            <td class="p-3 text-center font-mono text-slate-600">${h[0] || '-'}</td>
            <td class="p-3 text-center font-mono text-slate-600">${h[1] || '-'}</td>
            <td class="p-3 text-center font-mono text-slate-600">${h[2] || '-'}</td>
            <td class="p-3 text-center font-mono text-slate-600">${h[3] || '-'}</td>
        `;

        // Se for ajuste manual (Falta, Atestado, Férias)
        if (['Falta', 'Atestado', 'Férias', 'Hora Extra'].includes(h[0])) {
            classeLinha = h[0] === 'Falta' ? 'bg-red-50' : 'bg-yellow-50';
            conteudoHorarios = `<td colspan="4" class="p-3 text-center font-bold text-slate-500 uppercase tracking-wider text-xs">${h[0]} - ${dia.observacao || 'Sem observação'}</td>`;
        }

        return `
            <tr class="${classeLinha}">
                <td class="p-3">
                    <div class="flex flex-col">
                        <span class="font-bold text-slate-700">${dataFmt}</span>
                        <span class="text-[10px] text-slate-400 font-bold">${diaSemana}</span>
                    </div>
                </td>
                ${conteudoHorarios}
                <td class="p-3 text-center">
                    <span class="${corSaldo} px-2 py-1 rounded text-xs font-bold font-mono border border-opacity-20">${sinal}${minsToTime(saldo)}</span>
                </td>
                <td class="p-3 text-right">
                    <button onclick="editarRegistro(${dia.id})" class="text-slate-400 hover:text-indigo-600 transition-colors p-2" title="Editar Dia">
                        <i class="fas fa-pen"></i>
                    </button>
                </td>
            </tr>
        `;
    }).join('');
}

window.imprimirEspelho = function() { window.print(); } // Simplificado

// --- [NOVO] CARREGA AS CONFIGURAÇÕES SALVAS NOS CAMPOS ---
function carregarConfiguracoes() {
    // Metas
    document.getElementById('cfg-meta-dia').value = localStorage.getItem('cfg_meta_dia') || 480;
    document.getElementById('cfg-meta-sab').value = localStorage.getItem('cfg_meta_sab') || 240;
    
    // Hora Limite (Lê da chave certa 'cfg_limite_alerta')
    document.getElementById('cfg-hora-limite').value = localStorage.getItem('cfg_limite_alerta') || '07:35';
    
    // Mensagem (Lê da chave certa 'cfg_msg_cobranca')
    document.getElementById('cfg-msg-zap').value = localStorage.getItem('cfg_msg_cobranca') || "Notamos a ausência do seu registro de ponto hoje. Aconteceu algo?";
    // [NOVO] Carrega a tolerância (Padrão 10 min se não tiver nada salvo)
    document.getElementById('cfg-tolerancia').value = localStorage.getItem('cfg_tolerancia_clt') || 10;
}
// Função para chamar o recálculo via Console ou Botão
window.recalcularTudoAgora = async function() {
    const confirm = await Swal.fire({
        title: 'Recalcular Geral?',
        text: 'Isso vai corrigir todos os saldos, aplicando meta zero para horistas/FDS e reprocessando o histórico completo.',
        icon: 'warning',
        showCancelButton: true,
        confirmButtonColor: '#d33',
        confirmButtonText: 'Sim, Recalcular Agora'
    });

    if (confirm.isConfirmed) {
        Swal.fire({ 
            title: 'Processando...', 
            html: 'Recalculando cada dia de cada funcionário.<br>Por favor, aguarde...',
            allowOutsideClick: false,
            didOpen: () => Swal.showLoading() 
        });
        
        try {
            // 1. Chama o PHP para fazer a matemática pesada
            const resp = await fetch('api.php', {
                method: 'POST',
                body: JSON.stringify({ acao: 'recalcular_toda_base_do_zero' })
            });
            const json = await resp.json();
            
            if (json.status === 'sucesso') {
                // 2. Sucesso! Mostra aviso e prepara atualização
                await Swal.fire({
                    icon: 'success', 
                    title: 'Recálculo Concluído!',
                    text: json.msg,
                    confirmButtonText: 'Atualizar Tela'
                });

                // 3. ATUALIZAÇÃO FORÇADA DA VISÃO GERAL
                // Limpa a lista local para obrigar o download
                listaFuncionarios = []; 
                document.getElementById('lista-funcionarios').innerHTML = ''; // Limpa visualmente
                
                // Recarrega os dados do servidor (agora corretos)
                if(typeof carregarDadosRH === 'function') {
                    await carregarDadosRH(); 
                } else {
                    // Fallback: Se a função não existir, recarrega a página
                    window.location.reload();
                }

            } else {
                Swal.fire('Erro', json.msg, 'error');
            }
        } catch(e) {
            Swal.fire('Erro', 'Falha na conexão com o servidor.', 'error');
        }
    }
}
function minsToTime(m) {
    const s = m < 0 ? "-" : "+"; m = Math.abs(m);
    const hh = Math.floor(m / 60); const mm = m % 60;
    return `${s}${String(hh).padStart(2,'0')}:${String(mm).padStart(2,'0')}`;
}

// --- FUNÇÃO DE EDIÇÃO ORIGINAL INTACTA ---
window.editarRegistro = async function(idRegistro, dataRef, uidExplicito) {
    
    // 1. SEGURANÇA MÁXIMA DO ID
    let idFinal = uidExplicito;
    if (!idFinal && funcionarioSelecionado) {
        idFinal = funcionarioSelecionado.id;
    }

    if (!idFinal) {
        Swal.fire('Erro', 'Não foi possível identificar o funcionário. Atualize a página.', 'error');
        return;
    }

    const dia = historicoGlobal.find(d => d.id == idRegistro);
    
    // Inicializa vazio
    let h = ['', '', '', '', '', '', '', ''];
    let obsAtual = ''; 
    let dataVisual = '';
    let dataParaSalvar = '';

    if (dia) {
        // --- CENÁRIO 1: EDITANDO REGISTRO EXISTENTE ---
        try { 
            const parsed = JSON.parse(dia.horarios);
            if(Array.isArray(parsed)) { 
                for(let i=0; i<8; i++) h[i] = parsed[i] || ''; 
            }
        } catch(e) { }
        obsAtual = dia.observacao ? dia.observacao.replace(/"/g, '&quot;') : '';
        dataVisual = dia.data_registro.split('-').reverse().join('/');
        dataParaSalvar = dia.data_registro;
    } else {
        // --- CENÁRIO 2: CRIANDO REGISTRO NOVO (AUTO-PREENCHER) ---
        if (!dataRef) return; 
        dataVisual = dataRef.split('-').reverse().join('/');
        dataParaSalvar = dataRef;

        // Lógica de Sugestão de Horário
        const partesData = dataRef.split('-'); // YYYY-MM-DD
        const dataObj = new Date(partesData[0], partesData[1] - 1, partesData[2]);
        const diaSemana = dataObj.getDay(); // 0=Dom, 6=Sab
        
        // Verifica se é feriado para NÃO preencher automático
        const feriados = getFeriadosNacionais(partesData[0]);
        const ehFeriado = !!feriados[dataRef];

        if (!ehFeriado) {
            if (diaSemana === 6) { 
                // Sábado: 08:00 - 12:00
                h[0] = '08:00'; h[1] = '12:00';
            } else if (diaSemana !== 0) { 
                // Seg a Sex: 07:30 - 17:00
                h[0] = '07:30'; h[1] = '11:30'; h[2] = '13:00'; h[3] = '17:00';
            }
        }
    }

    const htmlForm = `
        <div class="text-left font-sans px-1 select-none">
            
            <input type="hidden" id="swal-uid-blindado" value="${idFinal}">
            <input type="hidden" id="swal-tipo-dia" value="N">

            <div class="flex flex-col items-center justify-center mb-6 border-b border-slate-100 pb-4">
                <span class="bg-indigo-100 text-indigo-600 px-3 py-1 rounded-full text-[10px] font-black uppercase tracking-widest mb-2">Edição de Ponto</span>
                <div class="text-5xl font-black text-slate-800 tracking-tighter">
                    ${dataVisual.substring(0, 5)}<span class="text-2xl text-slate-300 font-bold">${dataVisual.substring(5)}</span>
                </div>
            </div>

            <div class="grid grid-cols-2 gap-4 mb-6">
                <div id="btn-tipo-s" onclick="selecionarTipoDia('S')" class="cursor-pointer bg-white border-2 border-slate-200 rounded-xl p-3 flex items-center gap-3 opacity-70 hover:opacity-100 transition-all shadow-sm">
                    <div id="icon-bg-s" class="w-10 h-10 rounded-lg bg-slate-100 text-slate-400 flex items-center justify-center"><i class="fas fa-stopwatch text-lg"></i></div>
                    <div><div class="text-[9px] font-bold text-slate-400 uppercase">Regra</div><div id="text-s" class="text-sm font-bold text-slate-600">Extra (Meta 0)</div></div>
                </div>
                <div id="btn-tipo-f" onclick="selecionarTipoDia('F')" class="cursor-pointer bg-white border-2 border-slate-200 rounded-xl p-3 flex items-center gap-3 opacity-70 hover:opacity-100 transition-all shadow-sm">
                    <div id="icon-bg-f" class="w-10 h-10 rounded-lg bg-slate-100 text-slate-400 flex items-center justify-center"><i class="fas fa-star text-lg"></i></div>
                    <div><div class="text-[9px] font-bold text-slate-400 uppercase">Regra</div><div id="text-f" class="text-sm font-bold text-slate-600">Feriado (2x)</div></div>
                </div>
            </div>

            <div class="bg-slate-50 p-3 rounded-lg border border-slate-200 mb-3 shadow-sm">
                <div class="flex items-center gap-2 mb-2 border-b border-slate-200 pb-1"><i class="fas fa-clock text-indigo-500 text-xs"></i><span class="text-xs font-bold text-slate-600 uppercase">Turno Padrão</span></div>
                <div class="grid grid-cols-4 gap-2">
                    <div><label class="text-[9px] block text-center mb-1 font-bold text-slate-400">Ent 1</label><input id="swal-e1" type="time" class="w-full text-center border rounded p-1.5 font-bold text-slate-700 outline-none" value="${h[0]}"></div>
                    <div><label class="text-[9px] block text-center mb-1 font-bold text-slate-400">Sai 1</label><input id="swal-s1" type="time" class="w-full text-center border rounded p-1.5 font-bold text-slate-700 outline-none" value="${h[1]}"></div>
                    <div><label class="text-[9px] block text-center mb-1 font-bold text-slate-400">Ent 2</label><input id="swal-e2" type="time" class="w-full text-center border rounded p-1.5 font-bold text-slate-700 outline-none" value="${h[2]}"></div>
                    <div><label class="text-[9px] block text-center mb-1 font-bold text-slate-400">Sai 2</label><input id="swal-s2" type="time" class="w-full text-center border rounded p-1.5 font-bold text-slate-700 outline-none" value="${h[3]}"></div>
                </div>
            </div>
            <div class="bg-orange-50 p-3 rounded-lg border border-orange-100 mb-4 shadow-sm">
                <div class="flex items-center gap-2 mb-2 border-b border-orange-200 pb-1"><i class="fas fa-plus-circle text-orange-500 text-xs"></i><span class="text-xs font-bold text-orange-700 uppercase">Extras / Adicional</span></div>
                <div class="grid grid-cols-4 gap-2">
                    <div><label class="text-[9px] block text-center mb-1 font-bold text-orange-400">Ext 1</label><input id="swal-e3" type="time" class="w-full text-center border border-orange-200 rounded p-1.5 font-bold text-slate-700 outline-none" value="${h[4]}"></div>
                    <div><label class="text-[9px] block text-center mb-1 font-bold text-orange-400">Ext 2</label><input id="swal-s3" type="time" class="w-full text-center border border-orange-200 rounded p-1.5 font-bold text-slate-700 outline-none" value="${h[5]}"></div>
                    <div><label class="text-[9px] block text-center mb-1 font-bold text-orange-400">Ext 3</label><input id="swal-e4" type="time" class="w-full text-center border border-orange-200 rounded p-1.5 font-bold text-slate-700 outline-none" value="${h[6]}"></div>
                    <div><label class="text-[9px] block text-center mb-1 font-bold text-orange-400">Ext 4</label><input id="swal-s4" type="time" class="w-full text-center border border-orange-200 rounded p-1.5 font-bold text-slate-700 outline-none" value="${h[7]}"></div>
                </div>
            </div>
            
            <div>
                <label class="text-[10px] font-bold text-slate-400 uppercase mb-1 block">Motivo</label>
                <textarea id="swal-obs" class="w-full border border-slate-300 rounded p-3 text-sm h-14 resize-none outline-none focus:border-indigo-500 shadow-sm">${obsAtual}</textarea>
            </div>
        </div>`;

    const { value: formValues, isDenied } = await Swal.fire({
        html: htmlForm, 
        width: '600px', 
        focusConfirm: false, 
        showCancelButton: true, 
        showDenyButton: true, 
        confirmButtonText: 'Salvar',
        denyButtonText: 'Apagar', 
        cancelButtonText: 'Cancelar',
        confirmButtonColor: '#4f46e5',
        
        didOpen: () => {
            window.selecionarTipoDia = (tipo) => {
                const input = document.getElementById('swal-tipo-dia');
                const btnS = document.getElementById('btn-tipo-s'); const btnF = document.getElementById('btn-tipo-f');
                const iconS = document.getElementById('icon-bg-s'); const iconF = document.getElementById('icon-bg-f');
                const textS = document.getElementById('text-s'); const textF = document.getElementById('text-f');

                const reset = (b,i,t,ic) => {
                    b.className="cursor-pointer bg-white border-2 border-slate-200 rounded-xl p-3 flex items-center gap-3 opacity-70 transition-all shadow-sm";
                    i.className="w-10 h-10 rounded-lg bg-slate-100 text-slate-400 flex items-center justify-center";
                    i.innerHTML=`<i class="fas ${ic} text-lg"></i>`;
                    t.className="text-sm font-bold text-slate-600";
                };
                const active = (b,i,t,c) => {
                    b.className=`cursor-pointer bg-white border-2 border-${c}-500 shadow-md shadow-${c}-100 rounded-xl p-3 flex items-center gap-3 opacity-100 transform scale-[1.02] transition-all`;
                    i.className=`w-10 h-10 rounded-lg bg-${c}-500 text-white flex items-center justify-center shadow-sm`;
                    i.innerHTML='<i class="fas fa-check text-lg"></i>';
                    t.className=`text-sm font-bold text-${c}-600`;
                };

                if (input.value === tipo) { input.value = 'N'; reset(btnS, iconS, textS, 'fa-stopwatch'); reset(btnF, iconF, textF, 'fa-star'); return; }
                input.value = tipo;
                if (tipo === 'S') { active(btnS, iconS, textS, 'emerald'); reset(btnF, iconF, textF, 'fa-star'); }
                else if (tipo === 'F') { active(btnF, iconF, textF, 'amber'); reset(btnS, iconS, textS, 'fa-stopwatch'); }
            };
            if (obsAtual.includes('[Regra: S]')) selecionarTipoDia('S');
            else if (obsAtual.includes('[Regra: F]')) selecionarTipoDia('F');
        },

        preConfirm: () => {
            const idRecuperado = document.getElementById('swal-uid-blindado').value;
            return {
                id_seguro: idRecuperado, 
                horarios: [
                    document.getElementById('swal-e1').value, document.getElementById('swal-s1').value, 
                    document.getElementById('swal-e2').value, document.getElementById('swal-s2').value, 
                    document.getElementById('swal-e3').value, document.getElementById('swal-s3').value, 
                    document.getElementById('swal-e4').value, document.getElementById('swal-s4').value
                ],
                obs: document.getElementById('swal-obs').value,
                tipo_dia: document.getElementById('swal-tipo-dia').value 
            }
        }
    });

    if (isDenied && dia) {
        const confirmDelete = await Swal.fire({ title: 'Apagar?', text: "Vai zerar este dia.", icon: 'warning', showCancelButton: true, confirmButtonColor: '#ef4444' });
        if (confirmDelete.isConfirmed) {
             try {
                await fetch('api.php', { method: 'POST', body: JSON.stringify({ acao: 'limpar_dia_gestor', id_registro: dia.id, usuario_id: idFinal }) });
                Swal.fire('Limpo', '', 'success');
                carregarDadosRH();
                abrirGestaoCompleta(idFinal, funcionarioSelecionado.nome);
             } catch(e){}
        }
    }
    else if (formValues) {
        await salvarEdicaoAdmin(
            formValues.id_seguro,  
            dataParaSalvar, 
            formValues.horarios, 
            formValues.obs, 
            formValues.tipo_dia 
        );
    }
};

window.salvarEdicaoAdmin = async function(uid, data, horarios, obs, tipoDia) {
    
    // Verificação Final
    if (!uid || uid == "undefined") {
        Swal.fire('Erro Crítico', 'ID perdido. Tente novamente.', 'error');
        return;
    }

    // Tratamento Visual da Observação (Tags [Regra: S] ou [Regra: F])
    let novaObs = obs || '';
    novaObs = novaObs.replace(' [Regra: S]', '').replace(' [Regra: F]', '');
    
    if (tipoDia === 'S') novaObs += ' [Regra: S]';
    if (tipoDia === 'F') novaObs += ' [Regra: F]';

    Swal.fire({ title: 'Processando Regra...', didOpen: () => Swal.showLoading() });

    try {
        const resp = await fetch('api.php', {
            method: 'POST',
            body: JSON.stringify({
                acao: 'salvar_ponto_admin',
                usuario_id: uid, // AGORA O ID VAI CERTO
                data: data,
                horarios: horarios,
                observacao: novaObs,
                tipo_especial: tipoDia
            })
        });

        const json = await resp.json();

        if (json.status === 'sucesso') {
            Swal.fire({ 
                icon: 'success', 
                title: 'Salvo!', 
                text: json.msg, // Mostra "Saldo do dia: X min"
                timer: 2000, 
                showConfirmButton: false 
            });
            
            // Atualiza tudo
            if(typeof carregarDadosRH === 'function') await carregarDadosRH();
            // Pega o nome do funcionário da lista para reabrir a janela
            const f = listaFuncionarios.find(u => u.id == uid);
            if(f) abrirGestaoCompleta(f.id, f.nome);
        } else {
            Swal.fire('Erro no Banco', json.msg, 'error');
        }
    } catch(e) {
        Swal.fire('Erro de Conexão', 'Verifique sua internet.', 'error');
    }
}

// 1. Salvar Configurações
window.salvarConfiguracoes = function() {
    // Pega os valores dos inputs (usando os IDs que estão no seu HTML)
    const metaDia = document.getElementById('cfg-meta-dia').value;
    const metaSab = document.getElementById('cfg-meta-sab').value;
    const horaLimite = document.getElementById('cfg-hora-limite').value;
    const msgZap = document.getElementById('cfg-msg-zap').value;
    // [NOVO] Pega o valor da tolerância
    const tolerancia = document.getElementById('cfg-tolerancia').value;

    // Salva nas chaves CERTAS que o renderizarTabela procura
    localStorage.setItem('cfg_meta_dia', metaDia);
    localStorage.setItem('cfg_meta_sab', metaSab);
    
    // CORREÇÃO AQUI: Mudamos de 'cfg_hora_limite' para 'cfg_limite_alerta'
    localStorage.setItem('cfg_limite_alerta', horaLimite); 
    
    // CORREÇÃO AQUI: Mudamos de 'cfg_msg_zap' para 'cfg_msg_cobranca'
    localStorage.setItem('cfg_msg_cobranca', msgZap);

    // [NOVO] Salva a tolerância
    localStorage.setItem('cfg_tolerancia_clt', tolerancia);

    Swal.fire({
        icon: 'success',
        title: 'Salvo', 
        text: 'Configurações atualizadas com sucesso.', 
        timer: 1500,
        showConfirmButton: false
    });

    // Força a lista a se atualizar imediatamente
    renderizarTabela();
}

// 2. Enviar WhatsApp
window.enviarWhatsApp = function(nome, telefone) {
    const msgPadrao = localStorage.getItem('cfg_msg_zap') || "Olá, notamos a ausência do seu registro de ponto hoje.";
    const saudacao = `Olá ${nome}, tudo bem?`;
    const textoFinal = encodeURIComponent(`${saudacao} ${msgPadrao}`);
    
    // Limpa telefone (deixa só números)
    const telLimpo = telefone.replace(/\D/g, '');
    
    // Abre WhatsApp Web
    window.open(`https://wa.me/55${telLimpo}?text=${textoFinal}`, '_blank');
}

// 3. Cadastrar Telefone (Rápido)
window.cadastrarTelefone = async function(idUsuario) {
    const { value: tel } = await Swal.fire({
        title: 'Cadastrar WhatsApp',
        input: 'text',
        inputLabel: 'Número com DDD (apenas números)',
        inputValue: '',
        showCancelButton: true,
        inputValidator: (value) => {
            if (!value) {
                return 'Você precisa digitar o número!';
            }
        }
    });

    if (tel) {
        Swal.showLoading();
        try {
            const resp = await fetch('api.php', {
                method: 'POST', 
                body: JSON.stringify({ 
                    acao: 'atualizar_telefone', 
                    usuario_id: idUsuario, 
                    telefone: tel 
                })
            });
            
            const json = await resp.json();

            if (json.status === 'sucesso') {
                Swal.fire({ icon: 'success', title: 'Salvo!', timer: 1000, showConfirmButton: false });
                
                // O SEGREDINHO: Atualiza a lista global e redesenha a tabela
                await carregarDadosRH(); 
                
            } else {
                Swal.fire('Erro', 'Não foi possível salvar.', 'error');
            }
        } catch(e) {
            Swal.fire('Erro', 'Erro de conexão.', 'error');
        }
    }
}

// --- FUNÇÃO PARA LANÇAR SALDO INICIAL / ANTERIOR ---
window.definirSaldoInicial = async function(idUsuario) {
    const { value: formValues } = await Swal.fire({
        title: 'Lançar/Corrigir Saldo',
        html: `
            <div class="text-left space-y-4">
                <p class="text-sm text-gray-500">Use para ajustar o banco ou trazer saldo de meses anteriores.</p>
                
                <div class="grid grid-cols-2 gap-4">
                    <div>
                        <label class="block text-xs font-bold text-gray-700 mb-1">Data de Referência</label>
                        <input id="init-data" type="date" class="w-full border rounded p-2 bg-slate-50" value="${new Date().toISOString().split('T')[0]}">
                    </div>
                    <div>
                        <label class="block text-xs font-bold text-gray-700 mb-1">Tipo</label>
                        <select id="init-tipo" class="w-full border rounded p-2 h-[38px] font-bold">
                            <option value="credito" class="text-emerald-600">Crédito (+)</option>
                            <option value="debito" class="text-rose-600">Débito (-)</option>
                        </select>
                    </div>
                </div>

                <div>
                    <label class="block text-xs font-bold text-gray-700 mb-1">Horas (HH:MM - Aceita > 24h)</label>
                    <input id="init-horas" type="text" class="w-full border rounded p-2 text-lg font-mono text-center font-bold" value="00:00" placeholder="Ex: 125:30" oninput="this.value = this.value.replace(/[^0-9:]/g, '')">
                </div>

                <div>
                    <label class="block text-xs font-bold text-slate-500 uppercase mb-1">Motivo / Origem (Obrigatório)</label>
                    <textarea id="init-obs" class="w-full border border-slate-300 rounded-lg p-3 text-sm h-20 outline-none resize-none" placeholder="Ex: Saldo acumulado 2025, Acordo, Erro de sistema..."></textarea>
                </div>
            </div>
        `,
        focusConfirm: false,
        showCancelButton: true,
        confirmButtonText: 'Salvar Ajuste',
        preConfirm: () => {
            const data = document.getElementById('init-data').value;
            const horas = document.getElementById('init-horas').value;
            const tipo = document.getElementById('init-tipo').value;
            const obs = document.getElementById('init-obs').value;
            
            if (!data || !horas || !horas.includes(':')) {
                Swal.showValidationMessage('Preencha as horas corretamente (HH:MM).');
                return false;
            }
            if (!obs || obs.trim() === "") {
                Swal.showValidationMessage('Por favor, descreva o motivo desse ajuste.');
                return false;
            }
            return { data, horas, tipo, obs };
        }
    });

    if (formValues) {
        const [h, m] = formValues.horas.split(':').map(Number);
        let minutos = (h * 60) + m;

        if (formValues.tipo === 'debito') minutos = minutos * -1;

        const obsFinal = `Ajuste de Saldo: ${formValues.obs}`;

        try {
            await fetch('api.php', {
                method: 'POST',
                body: JSON.stringify({
                    acao: 'lancar_ajuste', 
                    usuario_id: idUsuario, 
                    data: formValues.data,
                    tipo: 'Saldo Inicial', 
                    saldo_minutos: minutos, 
                    obs: obsFinal
                })
            });

            Swal.fire('Sucesso', 'Saldo ajustado e registrado!', 'success');
            
            if(typeof abrirGestaoCompleta === 'function' && funcionarioSelecionado) {
                abrirGestaoCompleta(funcionarioSelecionado.id, funcionarioSelecionado.nome);
            }
            if(typeof carregarDadosRH === 'function') carregarDadosRH();

        } catch (e) {
            Swal.fire('Erro', 'Não foi possível salvar.', 'error');
        }
    }
}

// --- 3. FUNÇÃO DE PAGAMENTO (RECARGA SEGURA) ---
window.realizarPagamentoHoras = async function(idUsuario, nomeUsuario, saldoAtualMinutos) {
    // Sugere o valor total se for positivo
    let sugestaoPagamento = "00:00";
    if (saldoAtualMinutos > 0) {
        const hh = Math.floor(saldoAtualMinutos / 60);
        const mm = saldoAtualMinutos % 60;
        sugestaoPagamento = `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`;
    }

    const { value: form } = await Swal.fire({
        title: `<h3 class="text-xl font-bold text-emerald-700">Pagar Horas: ${nomeUsuario}</h3>`,
        html: `
            <div class="text-left space-y-3 p-2">
                <div>
                    <label class="block text-xs font-bold text-slate-500 mb-1">Data do Pagamento</label>
                    <input id="pg-data" type="date" class="w-full border rounded p-2 bg-slate-50" value="${new Date().toISOString().split('T')[0]}">
                </div>
                <div>
                    <label class="block text-xs font-bold text-slate-500 mb-1">Qtd. Horas a Pagar</label>
                    <input id="pg-horas" type="text" class="w-full border-2 border-emerald-100 text-emerald-700 font-bold text-xl rounded p-2 text-center outline-none" 
                           value="${sugestaoPagamento}" placeholder="Ex: 10:00">
                </div>
                <div>
                    <label class="block text-xs font-bold text-slate-500 mb-1">Observação</label>
                    <textarea id="pg-obs" class="w-full border rounded p-2 text-sm h-16 resize-none" placeholder="Dinheiro, folga, acordo..."></textarea>
                </div>
            </div>`,
        showCancelButton: true,
        confirmButtonText: 'Confirmar Pagamento',
        confirmButtonColor: '#059669',
        preConfirm: () => {
            const data = document.getElementById('pg-data').value;
            const horas = document.getElementById('pg-horas').value;
            const obs = document.getElementById('pg-obs').value;
            
            if(!horas.includes(':')) { 
                Swal.showValidationMessage('Use o formato HH:MM (ex: 10:30)'); 
                return false; 
            }
            return { data, horas, obs };
        }
    });

    if (form) {
        Swal.fire({ title: 'Processando...', didOpen: () => Swal.showLoading() });

        try {
            const resp = await fetch('api.php', {
                method: 'POST',
                body: JSON.stringify({
                    acao: 'pagar_horas', // Chama a nova função do PHP
                    usuario_id: idUsuario,
                    data: form.data,
                    horas: form.horas,
                    obs: form.obs
                })
            });
            const json = await resp.json();

            if (json.status === 'sucesso') {
                Swal.fire({ 
                    icon: 'success', 
                    title: 'Pago!', 
                    text: 'O saldo foi debitado corretamente.',
                    timer: 2000,
                    showConfirmButton: false
                });
                
                // Atualiza a tabela imediatamente
                await carregarDadosRH();
                
                // Se o modal de gestão estiver aberto, atualiza ele também
                if (funcionarioSelecionado && funcionarioSelecionado.id === idUsuario) {
                    abrirGestaoCompleta(idUsuario, nomeUsuario);
                }
            } else {
                throw new Error(json.msg || "Erro ao processar pagamento");
            }
        } catch(e) {
            Swal.fire('Erro', e.message, 'error');
        }
    }
}

// --- FUNÇÃO DE CORREÇÃO MATEMÁTICA (Adicione no fim do arquivo) ---
function recalcularSaldoReal(horariosArray, meta, ehFeriado = false) {
    if(!horariosArray || !Array.isArray(horariosArray)) return 0;
    
    // Validação básica
    if(horariosArray[0] && horariosArray[0].length > 2 && isNaN(parseInt(horariosArray[0][0]))) return null; 

    const toMins = (t) => {
        if(!t || t.length < 5) return 0;
        const [h, m] = t.split(':').map(Number);
        return (h*60)+m;
    };

    // 1. SOMA JORNADA REALIZADA
    let minutosTrabalhados = 0;
    for(let i=0; i<8; i+=2) {
        if(horariosArray[i] && horariosArray[i+1]) {
            const mEnt = toMins(horariosArray[i]);
            const mSai = toMins(horariosArray[i+1]);
            if(mSai > mEnt) minutosTrabalhados += (mSai - mEnt);
        }
    }

    // 2. DEFINE O SALDO DA JORNADA
    let saldoJornada = 0;

    // --- CORREÇÃO DEFINITIVA AQUI ---
    // Antes estava: if (meta === 0) ... ISSO QUEBRAVA O HORISTA
    // Agora está: if (ehFeriado) ... SÓ DOBRA SE FOR MESMO FERIADO
    
    if (ehFeriado) {
        // É Feriado? Dobra (Súmula 146 TST)
        saldoJornada = minutosTrabalhados * 2;
    } else {
        // Dia Normal (Seja Horista ou Mensalista)
        // Se Horista: Meta é 0. Conta: Trab - 0 = Trab (Recebe normal)
        // Se Mensalista: Meta é 480. Conta: Trab - 480 = Extra/Falta
        saldoJornada = minutosTrabalhados - meta;
        
        // Aplica Tolerância APENAS em dias normais
        const tolerancia = parseInt(localStorage.getItem('cfg_tolerancia_clt')) || 10;
        if (Math.abs(saldoJornada) <= tolerancia) {
            saldoJornada = 0;
        }
    }

    // 3. INDENIZAÇÃO DE INTERVALO
    let saldoIndenizacao = 0;
    const INTERVALO_PADRAO = 90; // 01:30

    if (horariosArray[1] && horariosArray[2]) {
        const saidaAlmoco = toMins(horariosArray[1]);
        const voltaAlmoco = toMins(horariosArray[2]);
        const intervaloFeito = voltaAlmoco - saidaAlmoco;

        if (intervaloFeito < INTERVALO_PADRAO) {
            saldoIndenizacao = INTERVALO_PADRAO - intervaloFeito;
        }
    }

    return saldoJornada + saldoIndenizacao;
}
// --- FUNÇÃO EXPORTAR PARA EXCEL (CSV) ---
window.exportarExcel = function(nomeFuncionario) {
    if (!funcionarioSelecionado || !historicoGlobal) return;

    // 1. Filtra os dados do funcionário
    const dadosUser = historicoGlobal
        .filter(h => h.usuario_id == funcionarioSelecionado.id)
        .sort((a, b) => new Date(a.data_registro) - new Date(b.data_registro)); // Ordena por data

    if (dadosUser.length === 0) {
        Swal.fire('Atenção', 'Não há registros para exportar.', 'info');
        return;
    }

    // 2. Cabeçalho do CSV
    let csvContent = "Data;Dia da Semana;Entrada 1;Saída 1;Entrada 2;Saída 2;Saldo Calculado;Observação\n";

    // 3. Monta as linhas
    dadosUser.forEach(dia => {
        // Prepara Data
        const dataObj = new Date(dia.data_registro + 'T00:00:00');
        const dataFmt = dataObj.toLocaleDateString('pt-BR');
        const diaSemana = dataObj.toLocaleDateString('pt-BR', { weekday: 'long' });

        // Prepara Horários COM PROTEÇÃO
        let h = ['', '', '', ''];
        try { h = JSON.parse(dia.horarios); } catch(e) {}
        if (!h || !Array.isArray(h)) h = ['', '', '', '']; // <--- PROTEÇÃO

        // Prepara Saldo
        const meta = parseInt(dia.meta_minutos || 480);
        let saldoReal = recalcularSaldoReal(h, meta);
        
        // Correção de Pagamento no Excel
        if (dia.observacao && dia.observacao.includes('| PG:')) {
            const match = dia.observacao.match(/\|\s*PG:\s*(\d+:\d+)/);
            if (match && match[1]) {
                const [ph, pm] = match[1].split(':').map(Number);
                if (saldoReal !== null) saldoReal = saldoReal - ((ph * 60) + pm);
            }
        }

        const saldoFinal = (saldoReal !== null ? saldoReal : parseInt(dia.saldo_minutos));
        const saldoFmt = (saldoFinal > 0 ? '+' : '') + minsToTime(saldoFinal);

        let obs = dia.observacao ? dia.observacao.replace(/(\r\n|\n|\r)/gm, " ").replace(/;/g, ",") : "";

        let ent1 = h[0] || '';
        let sai1 = h[1] || '';
        let ent2 = h[2] || '';
        let sai2 = h[3] || '';

        csvContent += `${dataFmt};${diaSemana};${ent1};${sai1};${ent2};${sai2};${saldoFmt};${obs}\n`;
    });

    const blob = new Blob(["\uFEFF" + csvContent], { type: 'text/csv;charset=utf-8;' });
    const url = URL.createObjectURL(blob);
    const link = document.createElement("a");
    link.setAttribute("href", url);
    link.setAttribute("download", `Ponto_${nomeFuncionario.replace(/ /g, '_')}.csv`);
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}
// --- FUNÇÃO PARA GRAVAR O CÁLCULO INTELIGENTE NO BANCO ---
window.sincronizarSaldosDoFuncionario = async function(nome) {

    let idFinal = null;

    let saldoParaGravar = 0;



    // 1. Tenta achar o funcionário na lista CARREGADA NA TELA (que já tem o valor certo do banco)

    if (typeof listaFuncionarios !== 'undefined') {

        const achou = listaFuncionarios.find(f => f.nome === nome || f.usuario === nome);

        if (achou) {

            idFinal = achou.id;

            saldoParaGravar = parseInt(achou.banco); // Pega o valor exato que você editou no banco

        }

    }



    if (!idFinal && funcionarioSelecionado) {

        idFinal = funcionarioSelecionado.id;

        // Se não achou na lista, tenta pegar do cabeçalho do modal

        const elSaldo = document.getElementById('header-saldo-total');

        if (elSaldo) {

            // Converte texto "+10:00" de volta para minutos (apenas emergência)

            // Mas idealmente o 'listaFuncionarios' já resolveu.

        }

    }



    if (!idFinal) {

        Swal.fire({ title: 'Erro', text: 'Usuário não localizado na lista.', icon: 'error' });

        return;

    }



    // Pergunta de confirmação mais clara

    const confirm = await Swal.fire({

        title: 'Confirmar Valor',

        html: `O sistema vai definir para o funcionário o saldo exato que consta no banco de dados agora:<br>

               <b style="font-size: 1.5em; color: ${saldoParaGravar >= 0 ? '#10B981' : '#F43F5E'};">${minsToTime(saldoParaGravar)}</b>`,

        icon: 'info',

        showCancelButton: true,

        confirmButtonText: 'Confirmar e Sincronizar'

    });



    if (!confirm.isConfirmed) return;



    Swal.showLoading();



    try {

        // Envia o valor PARA A TABELA NOVA (Forçar Sincronia)

        const resp = await fetch('api.php', {

            method: 'POST',

            body: JSON.stringify({

                acao: 'forcar_sincronia_total',

                usuario_id: idFinal,

                saldo_calculado_admin: saldoParaGravar

            })

        });

        

        const json = await resp.json();

        

        if(json.status === 'sucesso') {

            Swal.fire('Sucesso', 'O funcionário agora vê exatamente este valor.', 'success');

            await carregarDadosRH();

        } else {

            Swal.fire('Erro', json.msg || 'Erro desconhecido', 'error');

        }

    } catch(e) {

        console.error(e);

        Swal.fire('Erro Crítico', e.message, 'error');

    }

}

async function sincronizarHoristasAdmin() {
    // Pergunta se tem certeza
    const result = await Swal.fire({
        title: 'Sincronizar Horistas?',
        text: "Isso vai recalcular o saldo de todos os horistas no banco de dados, removendo tolerâncias e ajustando para meta zero.",
        icon: 'warning',
        showCancelButton: true,
        confirmButtonColor: '#3085d6',
        cancelButtonColor: '#d33',
        confirmButtonText: 'Sim, Sincronizar'
    });

    if (!result.isConfirmed) return;

    // Mostra Loading
    Swal.fire({
        title: 'Processando...',
        text: 'Ajustando saldos no servidor...',
        allowOutsideClick: false,
        didOpen: () => Swal.showLoading()
    });

    try {
        // Chama o PHP que criamos
        const resp = await fetch('api.php', {
            method: 'POST',
            body: JSON.stringify({ 
                acao: 'admin_recalcular_horistas' 
            })
        });

        const json = await resp.json();

        if (json.status === 'sucesso') {
            Swal.fire(
                'Sucesso!',
                `${json.afetados} horistas foram sincronizados. O Admin agora vê o valor exato.`,
                'success'
            );
            
            // Se você tiver uma função que recarrega a tabela de usuários, chame ela aqui
            // Exemplo: carregarListaUsuarios(); 
        } else {
            Swal.fire('Erro', json.msg || 'Falha ao sincronizar', 'error');
        }

    } catch (e) {
        console.error(e);
        Swal.fire('Erro', 'Falha de conexão com o servidor.', 'error');
    }
}

// --- FUNÇÃO INTELIGENTE: LISTAR E EXCLUIR EVENTOS EM MASSA ---
window.listarEventosParaExclusao = async function(idUsuario, nomeUsuario) {
    if (!historicoGlobal || historicoGlobal.length === 0) {
        Swal.fire('Atenção', 'Não há histórico carregado para analisar.', 'info');
        return;
    }

    const dados = historicoGlobal
        .filter(h => h.usuario_id == idUsuario)
        .sort((a, b) => new Date(a.data_registro) - new Date(b.data_registro));

    let eventosAgrupados = [];
    let eventoAtual = null;

    dados.forEach(dia => {
        let h = []; try { h = JSON.parse(dia.horarios); } catch(e){}
        if (!h || !Array.isArray(h)) h = []; // <--- PROTEÇÃO

        const tipo = h[0]; 

        const ehEventoEspecial = ['Férias', 'Atestado', 'Falta', 'Folga', 'Licença'].includes(tipo);

        if (ehEventoEspecial) {
            let continuar = false;

            if (eventoAtual && eventoAtual.tipo === tipo) {
                const dtFim = new Date(eventoAtual.fim + 'T00:00:00');
                const dtAgora = new Date(dia.data_registro + 'T00:00:00');
                const diffTempo = Math.abs(dtAgora - dtFim);
                const diffDias = Math.ceil(diffTempo / (1000 * 60 * 60 * 24)); 

                if (diffDias <= 1) {
                    continuar = true;
                }
            }

            if (continuar) {
                eventoAtual.fim = dia.data_registro; 
                eventoAtual.dias++;
            } else {
                if (eventoAtual) eventosAgrupados.push(eventoAtual);
                eventoAtual = { 
                    tipo: tipo, 
                    inicio: dia.data_registro, 
                    fim: dia.data_registro, 
                    dias: 1 
                };
            }
        } else {
            if (eventoAtual) {
                eventosAgrupados.push(eventoAtual);
                eventoAtual = null;
            }
        }
    });
    if (eventoAtual) eventosAgrupados.push(eventoAtual);

    if (eventosAgrupados.length === 0) {
        Swal.fire('Limpo', 'Não foram encontrados eventos especiais (Férias, Atestados) para excluir.', 'info');
        return;
    }

    eventosAgrupados.reverse();

    let htmlLista = `
        <div class="text-left max-h-[400px] overflow-y-auto custom-scroll">
            <p class="text-sm text-gray-500 mb-3">Abaixo estão os períodos identificados. Clique na lixeira para excluir o período específico.</p>
            <table class="w-full text-sm border-collapse">
                <thead class="bg-slate-100 text-slate-600 font-bold sticky top-0">
                    <tr>
                        <th class="p-2 text-left border-b">Evento</th>
                        <th class="p-2 text-center border-b">Período</th>
                        <th class="p-2 text-center border-b">Duração</th>
                        <th class="p-2 text-right border-b">Ação</th>
                    </tr>
                </thead>
                <tbody>
    `;

    eventosAgrupados.forEach((ev, index) => {
        const dtIni = ev.inicio.split('-').reverse().join('/');
        const dtFim = ev.fim.split('-').reverse().join('/');
        
        let cor = 'text-slate-700'; let bg = 'bg-slate-50';
        if(ev.tipo === 'Férias') { cor = 'text-blue-600'; bg = 'bg-blue-50'; }
        if(ev.tipo === 'Falta') { cor = 'text-red-600'; bg = 'bg-red-50'; }
        if(ev.tipo === 'Atestado') { cor = 'text-orange-600'; bg = 'bg-orange-50'; }

        htmlLista += `
            <tr class="border-b hover:bg-slate-50 transition-colors">
                <td class="p-3 font-bold ${cor}">
                    <span class="${bg} px-2 py-1 rounded border border-opacity-20 uppercase text-xs">${ev.tipo}</span>
                </td>
                <td class="p-3 text-center text-slate-600 font-mono text-xs">
                    ${dtIni} até ${dtFim}
                </td>
                <td class="p-3 text-center font-bold text-slate-500">
                    ${ev.dias} dias
                </td>
                <td class="p-3 text-right">
                    <button onclick="confirmarExclusaoEmMassa(${idUsuario}, '${nomeUsuario}', '${ev.tipo}', '${ev.inicio}', '${ev.fim}')" 
                        class="bg-white border border-rose-200 text-rose-600 hover:bg-rose-600 hover:text-white transition-colors w-8 h-8 rounded flex items-center justify-center shadow-sm" title="Excluir Este Período">
                        <i class="fas fa-trash-alt"></i>
                    </button>
                </td>
            </tr>
        `;
    });

    htmlLista += `</tbody></table></div>`;

    Swal.fire({
        title: 'Gerenciar Eventos',
        html: htmlLista,
        width: '700px',
        showConfirmButton: false,
        showCloseButton: true
    });
}

// --- FUNÇÃO QUE EXECUTA A EXCLUSÃO ---
window.confirmarExclusaoEmMassa = async function(uid, nome, tipo, inicio, fim) {
    // ... (mesmo código do alerta) ...
    if (result.isConfirmed) {
        Swal.fire({ title: 'Excluindo...', didOpen: () => Swal.showLoading() });
        try {
            const resp = await fetch('api.php', {
                method: 'POST',
                body: JSON.stringify({
                    acao: 'excluir_evento_intervalo',
                    usuario_id: uid,
                    data_inicio: inicio,
                    data_fim: fim,
                    tipo_evento: tipo
                })
            });
            const json = await resp.json();

            if (json.status === 'sucesso') {
                // --- ADICIONE ESTE BLOCO AQUI VVV ---
                // Força recálculo para consertar o saldo do usuário imediatamente
                await fetch('api.php', { 
                    method: 'POST', 
                    body: JSON.stringify({ acao: 'recalcular_toda_base_do_zero', usuario_id: uid }) 
                });
                // ------------------------------------

                Swal.fire('Sucesso', 'Evento excluído e saldo recalculado.', 'success');
                carregarDadosRH(); // Atualiza a lista de trás
                abrirGestaoCompleta(uid, nome);
            } else {
                Swal.fire('Erro', json.msg, 'error');
            }
        } catch (e) {
            Swal.fire('Erro', 'Falha na conexão.', 'error');
        }
    }
}
// --- CADASTRAR ANIVERSÁRIO (NOVO) ---
window.cadastrarAniversario = async function(idUsuario, valorAtual) {
    const { value: dataNiver } = await Swal.fire({
        title: '🎂 Data de Aniversário',
        input: 'text',
        inputLabel: 'Digite apenas o Dia e Mês (Ex: 20/01)',
        inputValue: valorAtual || '',
        showCancelButton: true,
        confirmButtonText: 'Salvar',
        inputValidator: (value) => {
            if (!value) return 'Digite a data!';
            if (!value.includes('/') || value.length !== 5) return 'Use o formato DD/MM (Ex: 20/01)';
        }
    });

    if (dataNiver) {
        Swal.showLoading();
        try {
            const resp = await fetch('api.php', {
                method: 'POST', 
                body: JSON.stringify({ 
                    acao: 'atualizar_aniversario', 
                    usuario_id: idUsuario, 
                    niver: dataNiver 
                })
            });
            
            const json = await resp.json();

            if (json.status === 'sucesso') {
                Swal.fire({ icon: 'success', title: 'Salvo!', timer: 1000, showConfirmButton: false });
                await carregarDadosRH(); // Atualiza a tabela para o ícone ficar rosa
            } else {
                Swal.fire('Erro', 'Não foi possível salvar.', 'error');
            }
        } catch(e) {
            Swal.fire('Erro', 'Erro de conexão.', 'error');
        }
    }
}

// Função para abrir o seletor de Falta Parcial ou Integral
window.abrirOpcoesFalta = async function(idRegistro, dataString, idUsuario) {
    
    // Pergunta qual o tipo de falta
    const { value: tipoFalta } = await Swal.fire({
        title: 'Registrar Falta',
        text: 'Qual período o funcionário faltou?',
        icon: 'warning',
        showCancelButton: true,
        confirmButtonColor: '#d33',
        cancelButtonColor: '#3085d6',
        confirmButtonText: 'Confirmar',
        cancelButtonText: 'Cancelar',
        input: 'radio',
        inputOptions: {
            'integral': 'Falta Integral (Dia Todo)',
            'manha': 'Falta Parcial (Manhã)',
            'tarde': 'Falta Parcial (Tarde)'
        },
        inputValue: 'integral', // Padrão
        inputValidator: (value) => {
            if (!value) {
                return 'Você precisa escolher uma opção!'
            }
        }
    });

    if (tipoFalta) {
        // Busca os dados atuais do dia (para não apagar o que ele trabalhou)
        // Precisamos saber o que já está salvo para preservar a outra metade do dia
        let horariosAtuais = ['', '', '', ''];
        
        // Tenta pegar do histórico global se disponível
        const registro = historicoGlobal.find(h => h.id == idRegistro);
        if (registro) {
            try { horariosAtuais = JSON.parse(registro.horarios); } catch(e){}
        }

        let novosHorarios = [...horariosAtuais]; // Copia os atuais
        let observacao = '';

        if (tipoFalta === 'integral') {
            // Zera tudo e escreve FALTA
            novosHorarios = ['Falta', '', '', ''];
            observacao = 'Falta Integral registrada pelo Gestor.';
        } 
        else if (tipoFalta === 'manha') {
            // Limpa Entrada 1 e Saída 1
            novosHorarios[0] = '';
            novosHorarios[1] = '';
            // Mantém Entrada 2 e Saída 2 como estavam (ou deixa vazio se não tiver nada)
            observacao = 'Falta Parcial (Manhã).';
        } 
        else if (tipoFalta === 'tarde') {
            // Mantém Entrada 1 e Saída 1
            // Limpa Entrada 2 e Saída 2
            novosHorarios[2] = '';
            novosHorarios[3] = '';
            observacao = 'Falta Parcial (Tarde).';
        }

        // Envia para a API salvar
        salvarFaltaNoBanco(idUsuario, dataString, novosHorarios, observacao);
    }
};

// Função auxiliar para salvar (Cópia da lógica de salvar evento)
async function salvarFaltaNoBanco(idUsuario, data, horarios, obs) {
    Swal.fire({ title: 'Salvando...', didOpen: () => Swal.showLoading() });

    try {
        const resp = await fetch('api.php', {
            method: 'POST',
            body: JSON.stringify({
                acao: 'salvar_ponto_admin', // Ou a sua ação de salvar edição
                usuario_id: idUsuario,
                data: data,
                horarios: horarios,
                observacao: obs
            })
        });
        const json = await resp.json();

        if(json.status === 'sucesso') {
            Swal.fire('Sucesso!', 'Falta registrada corretamente.', 'success');
            // Recarrega a tela
            if(typeof carregarDadosRH === 'function') carregarDadosRH();
            if(typeof window.renderizarTabelaGestao === 'function') window.renderizarTabelaGestao();
        } else {
            Swal.fire('Erro', json.mensagem || 'Erro ao salvar', 'error');
        }
    } catch(e) {
        console.error(e);
        Swal.fire('Erro', 'Erro de conexão', 'error');
    }
}

// --- FUNÇÃO PARA GRAVAR O CÁLCULO DA TELA NO BANCO ---
window.sincronizarSaldosDoFuncionario = async function(nome) {
    // Pega o ID do funcionário selecionado
    if (!funcionarioSelecionado) return;
    
    // Pergunta de segurança
    const confirm = await Swal.fire({
        title: 'Forçar Sincronia?',
        text: 'Isso vai pegar o saldo correto que você está vendo AQUI (+13:17) e gravar à força no painel principal (Visão Geral), corrigindo qualquer erro do banco de dados.',
        icon: 'warning',
        showCancelButton: true,
        confirmButtonColor: '#9333ea',
        confirmButtonText: 'Sim, Sincronizar'
    });

    if (!confirm.isConfirmed) return;

    Swal.fire({ title: 'Sincronizando...', didOpen: () => Swal.showLoading() });

    try {
        // Recalcula aqui no JS para ter certeza do número exato em minutos
        // (Reutilizando a lógica que já exibe na tela)
        const historicoFunc = historicoGlobal.filter(h => h.usuario_id == funcionarioSelecionado.id);
        const saldoRealJS = historicoFunc.reduce((acc, curr) => {
            let h = []; try { h = JSON.parse(curr.horarios); } catch(e){}
            const meta = parseInt(curr.meta_minutos || 480);
            
            // Verifica reset (Importante: JS já faz isso visualmente?)
            // Se o JS da tela está certo, ele deve ter lógica de reset ou o usuário confia no saldo final calculado
            // Vamos confiar no recálculo do backend V10 que acabamos de fazer, mas se quiser FORÇAR O VALOR VISUAL:
            // Precisamos somar tudo de novo aqui ou confiar no backend.
            
            // Vamos chamar o RECALCULAR BASE DO ZERO apenas para este usuário específico
            return 0; // Dummy return, vamos usar a API
        }, 0);

        // Chama o PHP V10 apenas para este usuário (Isso vai aplicar a correção do Saldo Inicial que fizemos no Passo 1)
        const resp = await fetch('api.php', {
            method: 'POST',
            body: JSON.stringify({ 
                acao: 'recalcular_toda_base_do_zero', 
                usuario_id: funcionarioSelecionado.id 
            })
        });
        
        const json = await resp.json();
        
        if(json.status === 'sucesso') {
            Swal.fire('Sucesso', 'Saldo sincronizado com o banco!', 'success');
            // Recarrega o painel de trás
            if(typeof carregarDadosRH === 'function') await carregarDadosRH();
        } else {
            Swal.fire('Erro', json.msg, 'error');
        }

    } catch(e) {
        Swal.fire('Erro', 'Falha na conexão', 'error');
    }
}

// --- FUNÇÃO MÁGICA: PREENCHER DIAS VAZIOS COM PADRÃO ---
window.preencherMesAutomatico = async function(uid, nome) {
    
    // 1. Confirmação
    const confirm = await Swal.fire({
        title: 'Preencher Mês?',
        text: `O sistema vai procurar todos os dias de Seg-Sex (e Sábados) que estão SEM REGISTRO neste mês e gravar o horário padrão automaticamente.`,
        icon: 'question',
        showCancelButton: true,
        confirmButtonColor: '#6366f1',
        confirmButtonText: 'Sim, Preencher',
        cancelButtonText: 'Cancelar'
    });

    if (!confirm.isConfirmed) return;

    Swal.fire({
        title: 'Processando...',
        html: 'Analisando calendário e salvando dias...',
        allowOutsideClick: false,
        didOpen: () => Swal.showLoading()
    });

    // 2. Prepara as datas do mês atual da gestão
    const ultimoDia = new Date(anoGestao, mesGestao, 0).getDate();
    let diasParaSalvar = [];
    
    // Lista de feriados para não preencher errado
    const feriados = getFeriadosNacionais(anoGestao);

    // Loop de 1 até o fim do mês
    for (let d = 1; d <= ultimoDia; d++) {
        const dataStr = `${anoGestao}-${String(mesGestao).padStart(2,'0')}-${String(d).padStart(2,'0')}`;
        const dataObj = new Date(dataStr + 'T00:00:00');
        const diaSem = dataObj.getDay(); // 0=Dom, 6=Sab
        const hojeStr = new Date().toISOString().split('T')[0];

        // Regra 1: Não preencher futuro
        if (dataStr > hojeStr) continue;

        // Regra 2: Pular Domingos
        if (diaSem === 0) continue;

        // Regra 3: Pular Feriados
        if (feriados[dataStr]) continue;

        // Regra 4: Verificar se JÁ EXISTE registro no histórico
        const existe = historicoGlobal.find(r => r.data_registro === dataStr && r.usuario_id == uid);
        if (existe) continue; // Se já tem algo (mesmo que falta), não toca

        // Se chegou aqui, é um dia VAZIO que precisa de ponto.
        let horarios = [];
        if (diaSem === 6) {
            horarios = ["08:00", "12:00", "", "", "", "", "", ""]; // Sábado
        } else {
            horarios = ["07:30", "11:30", "13:00", "17:00", "", "", "", ""]; // Dia Útil
        }

        diasParaSalvar.push({
            usuario_id: uid,
            data: dataStr,
            horarios: horarios,
            observacao: 'Ponto Automático (Exceção)',
            tipo_especial: 'N'
        });
    }

    if (diasParaSalvar.length === 0) {
        Swal.fire('Tudo Certo', 'Não há dias vazios para preencher neste mês (até hoje).', 'info');
        return;
    }

    // 3. Envia um por um (ou em lote se o PHP suportasse, vamos um por um para garantir)
    let salvos = 0;
    for (const dia of diasParaSalvar) {
        try {
            await fetch('api.php', {
                method: 'POST',
                body: JSON.stringify({
                    acao: 'salvar_ponto_admin',
                    ...dia
                })
            });
            salvos++;
        } catch(e) {}
    }

    // 4. Finaliza
    await carregarDadosRH(); // Atualiza dados gerais
    await abrirGestaoCompleta(uid, nome); // Recarrega a tela
    
    Swal.fire({
        icon: 'success',
        title: 'Concluído!',
        text: `${salvos} dias foram preenchidos automaticamente.`
    });
};

// --- FUNÇÃO DE LIMPEZA GERAL: Recalcula e Sincroniza TODOS os Funcionários ---
window.recalcularTodosSaldos = async function() {
    const confirm = await Swal.fire({
        title: 'REPARAR BANCO DE DADOS',
        text: "O sistema vai verificar cada dia de cada funcionário. Se encontrar um Sábado ou Férias com meta errada (descontando), ele vai corrigir o registro no banco permanentemente.",
        icon: 'warning',
        showCancelButton: true,
        confirmButtonColor: '#d33',
        confirmButtonText: 'INICIAR REPARO'
    });

    if (!confirm.isConfirmed) return;

    Swal.fire({
        title: 'Reparando Histórico...',
        html: 'Analisando divergências e salvando correções...<br>Isso pode levar alguns instantes.',
        allowOutsideClick: false,
        didOpen: () => Swal.showLoading()
    });

    let totalCorrigidos = 0;

    for (const func of listaFuncionarios) {
        try {
            // 1. Baixa histórico
            const resp = await fetch('api.php', { method: 'POST', body: JSON.stringify({ acao: 'ler_pontos_usuario', usuario_id: func.id }) });
            const json = await resp.json();
            const historico = json.dados || [];

            for (const dia of historico) {
                let h = []; try { h = JSON.parse(dia.horarios); } catch(e){}
                if (!Array.isArray(h)) h = ['', '', '', '', '', '', '', ''];

                const dataStr = dia.data_registro;
                const dtReg = new Date(dataStr + 'T00:00:00');
                const obs = dia.observacao || '';

                // --- REGRAS CORRETAS ---
                const primeiraPalavra = (h[0] || '').toUpperCase();
                const ehImune = primeiraPalavra.includes('FÉRIAS') || primeiraPalavra.includes('FERIAS') || 
                                primeiraPalavra.includes('ATESTADO') || primeiraPalavra.includes('FOLGA') || 
                                primeiraPalavra.includes('LICENÇA');

                const temRegraS = obs.includes('[Regra: S]');
                const temRegraF = obs.includes('[Regra: F]');
                const nivel = func.nivel_acesso ? func.nivel_acesso.toLowerCase() : '';
                const ehHorista = (nivel === 'horista' || nivel.includes('estagi'));
                
                const feriados = getFeriadosNacionais(dataStr.split('-')[0]);
                
                const temFalta = h.some(val => val && val.toUpperCase() === 'FALTA');
                let considerarFeriado = false;
                if (!temFalta) {
                     const ehFeriadoCal = !!feriados[dataStr];
                     considerarFeriado = (ehFeriadoCal || temRegraF);
                }

                // --- QUAL DEVERIA SER A META? ---
                let metaCorreta = 480; 

                if (ehImune || ehHorista) {
                    metaCorreta = 0;
                } else if (temFalta) {
                    const ehFeriadoOriginal = !!feriados[dataStr] || temRegraF || temRegraS || dtReg.getDay() === 0;
                    if (ehFeriadoOriginal) {
                        let faltaM = h.slice(0, 2).some(v => v && (v.toUpperCase() === 'FALTA' || v.toUpperCase() === 'MANHÃ' || v.toUpperCase() === 'MANHA'));
                        let faltaT = h.slice(2, 4).some(v => v && (v.toUpperCase() === 'FALTA' || v.toUpperCase() === 'TARDE'));
                        metaCorreta = 0;
                        if (faltaM) metaCorreta += 240;
                        if (faltaT) metaCorreta += 240;
                        if (!faltaM && !faltaT) metaCorreta = 480;
                    } else if (dtReg.getDay() === 6) {
                        metaCorreta = 240;
                    } else {
                        metaCorreta = 480;
                    }
                } else {
                    if (considerarFeriado || temRegraS) metaCorreta = 0;
                    else if (dtReg.getDay() === 6) metaCorreta = 240;
                    else if (dtReg.getDay() === 0) metaCorreta = 0;
                }

                // --- QUAL DEVERIA SER O SALDO? ---
                const saldoCalc = recalcularSaldoReal(h, metaCorreta, considerarFeriado);
                let saldoCorreto = (saldoCalc !== null ? saldoCalc : 0);

                const metaBanco = parseInt(dia.meta_minutos);
                const saldoBanco = parseInt(dia.saldo_minutos); 
                
                if (metaBanco !== metaCorreta) {
                    await fetch('api.php', {
                        method: 'POST',
                        body: JSON.stringify({
                            acao: 'salvar_ponto_admin',
                            usuario_id: func.id,
                            data: dataStr,
                            horarios: h,
                            observacao: obs,
                            tipo_especial: (metaCorreta === 0 && !considerarFeriado) ? 'S' : 'N'
                        })
                    });
                    totalCorrigidos++;
                }
            }
        } catch (e) { console.error(`Erro ID ${func.id}`, e); }
    }

    // Recarrega tudo no final
    await fetch('api.php', { method: 'POST', body: JSON.stringify({ acao: 'recalcular_toda_base_do_zero' }) });
    await carregarDadosRH();
    
    Swal.fire({
        icon: 'success',
        title: 'Banco Reparado!',
        text: `${totalCorrigidos} dias inconsistentes foram corrigidos no banco de dados.`,
        timer: 4000
    });
};

// =====================================================================
// MÓDULO: PLANILHA INTELIGENTE (MOTOR FANTASMA AUTOMÁTICO)
// =====================================================================

window.sincronizarTudoSilencioso = async function() {
    if (!listaFuncionarios || listaFuncionarios.length === 0) return;
    let teveMudanca = false;

    for (const func of listaFuncionarios) {
        try {
            const resp = await fetch('api.php', { method: 'POST', body: JSON.stringify({ acao: 'ler_pontos_usuario', usuario_id: func.id }) });
            const json = await resp.json();
            const historico = json.dados || [];

            const dtHoje = new Date();
            dtHoje.setHours(0,0,0,0);

            const saldoTotalCalculado = historico.reduce((acc, curr) => {
                let h = []; try { h = JSON.parse(curr.horarios); } catch(e){}
                if (!Array.isArray(h)) h = ['', '', '', '', '', '', '', ''];
                
                const partesData = curr.data_registro.split('-');
                const dtReg = new Date(partesData[0], partesData[1]-1, partesData[2]);
                const isFuturo = dtReg > dtHoje;
                const isHoje = dtReg.getTime() === dtHoje.getTime();
                const obs = curr.observacao || '';

                const textoEvento = (h[0] || '').toUpperCase();
                const ehImune = textoEvento.includes('FÉRIAS') || textoEvento.includes('FERIAS') || 
                                textoEvento.includes('ATESTADO') || textoEvento.includes('FOLGA') || 
                                textoEvento.includes('LICENÇA');
                
                // NOVO: Detecta pagamento
                const ehPagamento = textoEvento.includes('PAGAMENTO');

                const temRegraS = obs.includes('[Regra: S]');
                const temRegraF = obs.includes('[Regra: F]');
                const nivel = func.nivel_acesso ? func.nivel_acesso.toLowerCase() : '';
                const ehHorista = (nivel === 'horista' || nivel.includes('estagi'));
                const feriados = getFeriadosNacionais(partesData[0]);
                
                const temFalta = h.some(val => val && val.toUpperCase() === 'FALTA');
                let considerarFeriado = false;
                if (!temFalta) {
                    const ehFeriadoCal = !!feriados[curr.data_registro];
                    considerarFeriado = (ehFeriadoCal || temRegraF);
                }

                let meta = 480; 
                if (ehImune || ehHorista) {
                    meta = 0;
                } else if (temFalta) {
                    const ehFeriadoOriginal = !!feriados[curr.data_registro] || temRegraF || temRegraS || dtReg.getDay() === 0;
                    if (ehFeriadoOriginal) {
                        let faltaM = h.slice(0, 2).some(v => v && (v.toUpperCase() === 'FALTA' || v.toUpperCase() === 'MANHÃ' || v.toUpperCase() === 'MANHA'));
                        let faltaT = h.slice(2, 4).some(v => v && (v.toUpperCase() === 'FALTA' || v.toUpperCase() === 'TARDE'));
                        meta = 0;
                        if (faltaM) meta += 240;
                        if (faltaT) meta += 240;
                        if (!faltaM && !faltaT) meta = 480;
                    } else if (dtReg.getDay() === 6) {
                        meta = 240;
                    } else {
                        meta = 480;
                    }
                } else {
                    if (considerarFeriado || temRegraS) meta = 0; 
                    else if (dtReg.getDay() === 6) meta = 240;
                    else if (dtReg.getDay() === 0) meta = 0;
                }

                const saldoCalc = recalcularSaldoReal(h, meta, considerarFeriado);
                let valorFinal = (saldoCalc !== null ? saldoCalc : parseInt(curr.saldo_minutos));

                // SÓ DESCONTA VIA REGRA DE TEXTO SE NÃO FOR UMA LINHA DEDICADA A PAGAMENTO
                if (!ehPagamento && obs.match(/(?:PG:|Pagamento:)\s*(\d+:\d+)/i)) {
                    const match = obs.match(/(?:PG:|Pagamento:)\s*(\d+:\d+)/i);
                    if (match && match[1]) {
                        const [ph, pm] = match[1].split(':').map(Number);
                        valorFinal -= ((ph * 60) + pm);
                    }
                }

                // A CORREÇÃO: PASSE LIVRE PARA PAGAMENTOS (NUNCA IGNORA)
                if (isFuturo && valorFinal < 0 && !ehPagamento) return acc;
                const diaFechado = (h && h[3] && h[3].length >= 5);
                if (isHoje && valorFinal < 0 && !diaFechado && !ehHorista && !ehPagamento) return acc;

                return acc + valorFinal;
            }, 0);

            const saldoAtualDoBanco = parseInt(func.banco_atual_minutos || 0);
            
            if (saldoTotalCalculado !== saldoAtualDoBanco) {
                await fetch('api.php', {
                    method: 'POST',
                    body: JSON.stringify({ acao: 'atualizar_saldo_banco', usuario_id: func.id, novo_saldo: saldoTotalCalculado })
                });
                func.banco_atual_minutos = saldoTotalCalculado;
                teveMudanca = true;
            }
        } catch (e) { }
    }

    if (teveMudanca && typeof carregarDadosRH === 'function') carregarDadosRH();
};

// =====================================================================
// GATILHOS AUTOMÁTICOS (RODAM SEM VOCÊ PRECISAR CLICAR)
// =====================================================================

// 1. Roda sozinho 2 segundos depois que você abre o painel do Admin
document.addEventListener('DOMContentLoaded', () => {
    setTimeout(window.sincronizarTudoSilencioso, 2000);
});

// 2. Roda sozinho toda vez que você FECHAR a janela "Gerir" de um funcionário
const observerSwal = new MutationObserver((mutations) => {
    mutations.forEach((mutation) => {
        if (mutation.removedNodes) {
            mutation.removedNodes.forEach((node) => {
                // Quando o modal do SweetAlert sai da tela, o motor é ativado
                if (node.classList && node.classList.contains('swal2-container')) {
                    window.sincronizarTudoSilencioso();
                }
            });
        }
    });
});
observerSwal.observe(document.body, { childList: true });

// --- NOVO: PREENCHER PONTO PADRÃO PARA TODOS OS FUNCIONÁRIOS ---
window.preencherMesParaTodos = async function() {
    const confirm = await Swal.fire({
        title: 'Gerar Pontos Automáticos?',
        text: `O sistema vai varrer TODOS os funcionários e preencher os dias vazios deste mês (até a data de hoje) com o horário padrão (07:30-17:00). Domingos e Feriados serão ignorados.`,
        icon: 'question',
        showCancelButton: true,
        confirmButtonColor: '#6366f1',
        confirmButtonText: 'Sim, Gerar para Todos'
    });

    if (!confirm.isConfirmed) return;

    Swal.fire({
        title: 'Gerando Registros...',
        html: 'Isso pode demorar alguns minutos dependendo da quantidade de funcionários.<br>Por favor, não feche a página.',
        allowOutsideClick: false,
        didOpen: () => Swal.showLoading()
    });

    // Pega o último dia do mês atual que está sendo visualizado na tela
    const ultimoDia = new Date(anoGestao, mesGestao, 0).getDate();
    const feriados = getFeriadosNacionais(anoGestao);
    const hojeStr = new Date().toISOString().split('T')[0];
    let totalSalvos = 0;

    for (const func of listaFuncionarios) {
        try {
            // Puxa o histórico do funcionário para saber quais dias já tem ponto
            const resp = await fetch('api.php', { method: 'POST', body: JSON.stringify({ acao: 'ler_pontos_usuario', usuario_id: func.id }) });
            const json = await resp.json();
            const historico = json.dados || [];

            let diasParaSalvar = [];

            for (let d = 1; d <= ultimoDia; d++) {
                const dataStr = `${anoGestao}-${String(mesGestao).padStart(2,'0')}-${String(d).padStart(2,'0')}`;
                const dataObj = new Date(dataStr + 'T00:00:00');
                const diaSem = dataObj.getDay(); // 0=Dom, 6=Sab

                // Regras para pular dias
                if (dataStr > hojeStr) continue; // Não preenche dias no futuro
                if (diaSem === 0) continue;      // Não preenche domingos
                if (feriados[dataStr]) continue; // Não preenche feriados

                // Se já existe qualquer registro neste dia (Férias, Falta, Ponto), pula.
                const existe = historico.find(r => r.data_registro === dataStr);
                if (existe) continue;

                // Define os horários
                let horarios = [];
                if (diaSem === 6) {
                    horarios = ["08:00", "12:00", "", "", "", "", "", ""]; // Sábado
                } else {
                    horarios = ["07:30", "11:30", "13:00", "17:00", "", "", "", ""]; // Dia Útil
                }

                diasParaSalvar.push({
                    usuario_id: func.id,
                    data: dataStr,
                    horarios: horarios,
                    observacao: 'Ponto Automático',
                    tipo_especial: 'N'
                });
            }

            // Manda salvar os dias vazios encontrados
            for (const dia of diasParaSalvar) {
                await fetch('api.php', {
                    method: 'POST',
                    body: JSON.stringify({
                        acao: 'salvar_ponto_admin',
                        ...dia
                    })
                });
                totalSalvos++;
            }
        } catch(e) { console.error("Erro ao preencher para", func.nome); }
    }

    // Recarrega a tabela de trás para mostrar os números novos
    await carregarDadosRH();
    
    Swal.fire({
        icon: 'success',
        title: 'Concluído!',
        text: `${totalSalvos} dias de trabalho foram criados automaticamente para toda a equipe.`
    });
};