// ARQUIVO: gestao_ponto/logic_ponto_v10_final.js
// VERSÃO: CORREÇÃO DE TYPO (atualizarHoraInput) + FÉRIAS

let currentUser = null;
let isAniversarioHoje = false;
let registrosHoje = [null, null, null, null, null, null, null, null]; 
let bancoHorasAcumulado = 0;
let relogioInterval = null; 
let cronometroInterval = null;

const META_SEMANA = parseInt(localStorage.getItem('cfg_meta_dia')) || 480; 
const META_SABADO = parseInt(localStorage.getItem('cfg_meta_sab')) || 240;

// =========================================================
// 1. ZONA DE COMPATIBILIDADE (INTERFACE)
// =========================================================

// Função chamada pelo seu HTML no onsubmit do formulário
window.registrarPonto = async function(event) {
    if(event) event.preventDefault(); 
    await window.confirmarRegistroPonto(); 
};

window.confirmarRegistroPonto = async function() {
    Swal.fire({
        title: 'Atualizando...', 
        text: 'Sincronizando com o RH...',
        timer: 1000, 
        showConfirmButton: false, 
        didOpen: () => { Swal.showLoading(); }
    });
    await carregarPontoDoBanco();
};

window.registrarFalta = function() { 
    Swal.fire('Ação Bloqueada', 'O gerenciamento de faltas é feito exclusivamente pelo RH.', 'info'); 
};

window.openPontoModal = function() {
    const modal = document.getElementById('ponto-modal');
    if(modal) modal.classList.remove('hidden');
    atualizarInterface(); 
};

window.closePontoModal = function() { 
    const modal = document.getElementById('ponto-modal');
    if(modal) modal.classList.add('hidden');
};

// =========================================================
// 2. INICIALIZAÇÃO
// =========================================================

document.addEventListener('DOMContentLoaded', async () => {
    // 1. Recupera Sessão
    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) { window.location.href = "../"; return; }

    // 2. Permissão
    try {
        const resp = await fetch('api.php', {
            method: 'POST',
            body: JSON.stringify({ acao: 'checar_permissao', usuario_id: currentUser.id })
        });
        const json = await resp.json();
        if (json.nivel === 'horista' || json.nivel === 'estagiario') {
             currentUser.nivel_acesso = 'horista';
        }
    } catch (e) { console.error(e); }

    // 3. Inicia Relógio e Interface
    iniciarRelogio();
    transformarParaModoEspelho();
    
    // 4. Carrega Dados
    await carregarPontoDoBanco();
});

function transformarParaModoEspelho() {
    // Botão Atualizar
    const btn = document.getElementById('btn-confirmar');
    if (btn) {
        btn.className = "w-full bg-indigo-500 hover:bg-indigo-600 text-white font-bold py-4 rounded-xl shadow-lg transition-all flex items-center justify-center gap-2";
        btn.innerHTML = `<i class="fas fa-sync-alt"></i> ATUALIZAR SALDO`;
        btn.onclick = function(e) { e.preventDefault(); window.confirmarRegistroPonto(); };
    }

    // Botão Férias
    const areaBotoes = document.getElementById('btn-confirmar')?.parentElement;
    if (areaBotoes && !document.getElementById('btn-ver-ferias')) {
        const btnFerias = document.createElement('button');
        btnFerias.id = 'btn-ver-ferias';
        btnFerias.className = "mt-3 w-full bg-white border border-indigo-200 text-indigo-600 font-bold py-3 rounded-xl shadow-sm hover:bg-indigo-50 transition-all flex items-center justify-center gap-2";
        btnFerias.innerHTML = `<i class="fas fa-umbrella-beach"></i> MINHAS FÉRIAS`;
        btnFerias.onclick = consultarFerias; 
        areaBotoes.appendChild(btnFerias);
    }

    // Esconde itens de edição
    const ids = ['btn-falta', 'justificativa-ponto', 'justificativa-input', 'check-feriado', 'label-feriado', 'container-extra-desktop', 'container-extra-mobile'];
    ids.forEach(id => { const el = document.getElementById(id); if (el) el.style.display = 'none'; });

    if (areaBotoes && !document.getElementById('aviso-espelho')) {
        const aviso = document.createElement('div');
        aviso.id = 'aviso-espelho';
        aviso.className = 'mt-3 text-center text-xs text-slate-400 font-bold uppercase tracking-widest';
        aviso.innerHTML = '<i class="fas fa-lock"></i> Painel Gerenciado pelo RH';
        areaBotoes.appendChild(aviso);
    }
}

// --- CONSULTA DE FÉRIAS ---
async function consultarFerias() {
    Swal.fire({ title: 'Buscando Férias...', didOpen: () => Swal.showLoading() });
    try {
        const resp = await fetch('api.php', {
            method: 'POST',
            body: JSON.stringify({ acao: 'ler_ferias_usuario', usuario_id: currentUser.id })
        });
        const json = await resp.json();

        if (json.status === 'sucesso') {
            const periodos = json.periodos || [];
            if (periodos.length === 0) {
                Swal.fire('Sem Registros', 'Nenhuma férias encontrada no histórico.', 'info');
                return;
            }

            let htmlLista = `<div class="flex flex-col gap-3 mt-2 max-h-[60vh] overflow-y-auto px-1">`;
            periodos.forEach(p => {
                const dtIni = new Date(p.inicio);
                const dtFim = new Date(p.fim);
                // Ajuste de fuso para exibição correta
                dtIni.setMinutes(dtIni.getMinutes() + dtIni.getTimezoneOffset());
                dtFim.setMinutes(dtFim.getMinutes() + dtFim.getTimezoneOffset());

                const diasTotal = Math.round((dtFim - dtIni) / (1000 * 60 * 60 * 24)) + 1;
                const fmt = d => d.toLocaleDateString('pt-BR');
                
                const hoje = new Date(); hoje.setHours(0,0,0,0);
                let statusBadge = '';
                let bordaClass = 'border-slate-200';
                let iconClass = 'text-slate-400';

                // Comparações de data
                if (dtIni > hoje) {
                    statusBadge = `<span class="bg-blue-100 text-blue-700 text-[10px] px-2 py-0.5 rounded font-bold uppercase">Agendada</span>`;
                    bordaClass = 'border-blue-200 bg-blue-50';
                    iconClass = 'text-blue-500';
                } else if (dtFim < hoje) {
                    statusBadge = `<span class="bg-slate-100 text-slate-500 text-[10px] px-2 py-0.5 rounded font-bold uppercase">Concluída</span>`;
                } else {
                    statusBadge = `<span class="bg-emerald-100 text-emerald-700 text-[10px] px-2 py-0.5 rounded font-bold uppercase animate-pulse">Em Andamento</span>`;
                    bordaClass = 'border-emerald-300 bg-emerald-50';
                    iconClass = 'text-emerald-600';
                }

                htmlLista += `
                    <div class="border ${bordaClass} rounded-xl p-3 flex items-center gap-3 shadow-sm text-left">
                        <div class="h-10 w-10 rounded-full bg-white flex items-center justify-center shadow-sm ${iconClass}">
                            <i class="fas fa-plane"></i>
                        </div>
                        <div class="flex-1">
                            <div class="flex justify-between items-center mb-1">
                                <span class="text-xs font-bold text-slate-500 uppercase">${diasTotal} Dias</span>
                                ${statusBadge}
                            </div>
                            <div class="text-sm font-bold text-slate-700">
                                ${fmt(dtIni)} <span class="text-slate-400 mx-1">até</span> ${fmt(dtFim)}
                            </div>
                        </div>
                    </div>
                `;
            });
            htmlLista += `</div>`;

            Swal.fire({
                title: 'Minhas Férias',
                html: htmlLista,
                showConfirmButton: true,
                confirmButtonText: 'Fechar',
                confirmButtonColor: '#6366f1'
            });
        } else {
            Swal.fire('Erro', 'Não foi possível buscar as férias.', 'error');
        }
    } catch (e) { console.error(e); Swal.fire('Erro', 'Falha na conexão.', 'error'); }
}

// =========================================================
// 3. CARREGAMENTO DE DADOS
// =========================================================

async function carregarPontoDoBanco() {
    const dataObjeto = new Date();
    const ano = dataObjeto.getFullYear();
    const mes = String(dataObjeto.getMonth() + 1).padStart(2, '0');
    const dia = String(dataObjeto.getDate()).padStart(2, '0');
    const dataString = `${ano}-${mes}-${dia}`;
    
    // CORREÇÃO DO ERRO AQUI:
    if(typeof atualizarHoraInput === 'function') atualizarHoraInput(); 

    try {
        const resp = await fetch('api.php', {
            method: 'POST',
            body: JSON.stringify({ acao: 'ler_ponto_dia', usuario_id: currentUser.id, data: dataString })
        });
        const json = await resp.json();

        if (json.status === 'sucesso') {
            isAniversarioHoje = json.is_aniversario || false;
            if (isAniversarioHoje) setTimeout(() => exibirMensagemAniversarioInicio(currentUser.nome), 500);

            bancoHorasAcumulado = parseInt(json.acumulado || 0);

            if (json.dados_hoje) {
                let horarios = json.dados_hoje.horarios;
                try { if (typeof horarios === 'string') horarios = JSON.parse(horarios); } catch(e) { horarios = []; }
                
                if (Array.isArray(horarios)) registrosHoje = horarios.map(h => h === "" ? null : h);
                else registrosHoje = [null, null, null, null, null, null, null, null];
                
                if (json.dados_hoje.meta_minutos !== null) window.metaDoDiaServidor = parseInt(json.dados_hoje.meta_minutos);
                window.obsDoBanco = json.dados_hoje.observacao || '';
            } else {
                registrosHoje = [null, null, null, null, null, null, null, null];
                window.obsDoBanco = '';
            }
            atualizarInterface();
            renderizarMobile();
        }
    } catch (e) { console.error(e); }
}

window.atualizarInterface = function() {
    const elSubtitulo = document.getElementById('ponto-data-display')?.nextElementSibling;
    let textoDia = "DIA ÚTIL";
    const obs = window.obsDoBanco || '';
    if (obs.includes('[Regra: F]')) textoDia = "FERIADO (ADMIN)";
    else if (obs.includes('[Regra: S]')) textoDia = "SÁBADO LIVRE";
    if(elSubtitulo) elSubtitulo.innerText = textoDia;
    renderizarTimeline();
    calcularSaldos();
}

function calcularSaldos() {
    let saldoBaseBanco = bancoHorasAcumulado; 
    let nivel = (currentUser && currentUser.nivel_acesso) ? currentUser.nivel_acesso.toLowerCase().trim() : '';
    let ehHorista = (nivel === 'horista' || nivel.includes('estagi'));

    let metaAtual = 480; 
    const diaSemana = new Date().getDay(); 
    if (diaSemana === 6 || diaSemana === 0 || ehHorista) { metaAtual = 0; }
    if (typeof window.metaDoDiaServidor === 'number') { if (window.metaDoDiaServidor === 0) metaAtual = 0; }
    
    if (ehHorista) {
        metaAtual = 0;
        const elSub = document.getElementById('ponto-data-display')?.nextElementSibling;
        if(elSub) { elSub.innerText = "HORISTA / LIVRE"; elSub.className = "text-[10px] font-bold text-emerald-600 uppercase tracking-wider"; }
    }

    const hArr = registrosHoje.map(h => h === null ? "" : h);
    let saldoHoje = 0;
    if (typeof recalcularSaldoReal === 'function') saldoHoje = recalcularSaldoReal(hArr, metaAtual, false);
    if (saldoHoje === null) saldoHoje = 0;

    let minutosTrabalhados = 0;
    const toMins = (t) => { if(!t || t==="FALTA") return 0; const [h,m]=t.split(':').map(Number); return (h*60)+m; };
    for(let i=0; i<8; i+=2) {
        if(hArr[i] && hArr[i+1]) {
            const e = toMins(hArr[i]); const s = toMins(hArr[i+1]);
            if(s>e) minutosTrabalhados += (s-e);
        }
    }

    let saldoTotalReal = saldoBaseBanco + saldoHoje;
    atualizarDisplay(['display-banco-anterior', 'display-banco-anterior-mobile'], saldoTotalReal, true);
    
    const elsMeta = [document.getElementById('display-meta-dia'), document.getElementById('display-meta-dia-mobile')];
    elsMeta.forEach(el => { if(el) el.innerText = (metaAtual === 0) ? "Livre/Extra" : minsToTime(metaAtual); });
    atualizarDisplay(['display-total-trabalhado', 'display-total-trabalhado-mobile'], minutosTrabalhados);
    
    const elsSaldo = [document.getElementById('display-saldo-dia'), document.getElementById('display-saldo-dia-mobile')];
    const barsSaldo = [document.getElementById('bar-saldo-dia'), document.getElementById('bar-saldo-dia-mobile')];
    
    elsSaldo.forEach((el, idx) => {
        if(el) {
            el.innerText = (saldoHoje > 0 ? "+" : "") + minsToTime(saldoHoje);
            let corT = (saldoHoje >= 0 || ehHorista || metaAtual === 0) ? "text-emerald-600" : "text-rose-600";
            el.className = `text-xl font-bold ${corT}`; 
            const bar = barsSaldo[idx];
            if(bar) {
                let corB = (saldoHoje >= 0 || ehHorista || metaAtual === 0) ? "bg-emerald-500" : "bg-rose-500";
                bar.className = `${corB} h-1.5 rounded-full`;
                bar.style.width = (!ehHorista && saldoHoje < 0 && metaAtual > 0) ? `${Math.min(100, (minutosTrabalhados/metaAtual)*100)}%` : '100%';
            }
        }
    });
    
    const elsFinal = [document.getElementById('display-banco-final'), document.getElementById('display-banco-final-mobile')];
    elsFinal.forEach(el => {
        if(el) {
            el.innerText = (saldoTotalReal > 0 ? "+" : "") + minsToTime(saldoTotalReal);
            el.className = (saldoTotalReal >= 0 || ehHorista) ? "font-bold text-emerald-600 text-sm" : "font-bold text-rose-600 text-sm";
        }
    });
    return { meta: metaAtual, saldo: saldoHoje };
}

function renderizarTimeline(observacaoTexto = '') {
    const container = document.getElementById('timeline-container');
    if(!container) return;
    container.innerHTML = ''; 
    const labels = ["Entrada Manhã", "Saída Almoço", "Entrada Tarde", "Saída Tarde", "Extra 1", "Extra 2", "Extra 3", "Extra 4"];
    const obsReal = window.obsDoBanco || observacaoTexto;

    if (obsReal && obsReal.trim() !== '') {
        let textoLimpo = obsReal.replace(/\|/g, '<br>• ');
        container.innerHTML += `<div class="mb-4 p-3 rounded-lg bg-indigo-50 border border-indigo-100 shadow-sm"><p class="text-[10px] font-bold text-indigo-700 uppercase mb-1 flex items-center gap-1"><i class="fas fa-info-circle"></i> Info do Gestor:</p><p class="text-sm text-slate-700 font-medium leading-relaxed pl-1">• ${textoLimpo}</p></div>`;
    }

    registrosHoje.forEach((val, i) => {
        if(val) {
            const isFalta = val === "FALTA";
            container.innerHTML += `<div class="relative pl-4 pb-4 border-l-2 border-slate-200 last:border-0"><div class="absolute -left-[9px] top-0 w-4 h-4 rounded-full border-2 border-white ${isFalta ? 'bg-red-500' : 'bg-indigo-600'} shadow-sm"></div><div class="-mt-1"><span class="text-[10px] text-slate-400 font-bold uppercase tracking-wider">${labels[i]}</span><div class="flex flex-row items-center"><div class="${isFalta ? 'text-red-600' : 'text-slate-800'} font-mono font-bold text-lg leading-tight">${val}</div></div></div></div>`;
        }
    });
}

function renderizarMobile() {
    const divMobile = document.getElementById('lista-timeline-mobile');
    if (divMobile) {
        let listaH = registrosHoje;
        let html = `<div class="absolute left-[7px] top-2 bottom-2 w-[2px] bg-slate-100"></div>`; 
        const rotulos = ["Entrada", "Saída Almoço", "Volta Almoço", "Saída"];
        let temAlgum = false;
        for (let i = 0; i < 4; i++) { 
            const v = listaH[i];
            if (v && v.length >= 5 && v !== "FALTA") {
                temAlgum = true;
                const label = rotulos[i] || 'Extra';
                html += `<div class="relative flex items-center gap-3 z-10 mb-3 animate-fade-in"><div class="w-4 h-4 rounded-full bg-emerald-100 border-2 border-emerald-500 flex-shrink-0"></div><div class="flex justify-between w-full items-center bg-slate-50 rounded-lg px-3 py-2 border border-slate-100 shadow-sm"><span class="text-[10px] font-bold text-slate-400 uppercase tracking-wide">${label}</span><span class="text-sm font-bold text-slate-700 font-mono">${v}</span></div></div>`;
            } else if (v === "FALTA") {
                 temAlgum = true;
                 html += `<div class="text-center text-xs text-rose-500 font-bold py-2 bg-rose-50 rounded mb-2">FALTA REGISTRADA</div>`;
            }
        }
        if (!temAlgum) html = `<div class="text-center text-xs text-slate-400 py-6 italic">Aguardando registro do Gestor.</div>`;
        divMobile.innerHTML = html;
    }
}

// --- HELPERS E CORREÇÃO DO NOME DA FUNÇÃO ---

// AQUI ESTAVA O ERRO! (Corrigido para 'atualizar')
function atualizarHoraInput() { 
    const d = new Date(); 
    const el = document.getElementById('current-time-input'); 
    if(el) el.value = `${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}`; 
}

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')}`; }
function atualizarDisplay(ids, valor, cor = false) { if (!Array.isArray(ids)) ids = [ids]; ids.forEach(id => { const el = document.getElementById(id); if(el) { el.innerText = minsToTime(valor); if(cor) el.className = valor >= 0 ? "text-2xl font-bold text-emerald-600" : "text-2xl font-bold text-rose-500"; } }); }
function iniciarRelogio() { if(relogioInterval) clearInterval(relogioInterval); const atualizar = () => { atualizarHoraInput(); }; atualizar(); relogioInterval = setInterval(atualizar, 1000); }
function exibirMensagemAniversarioInicio(nome) { /* Mantida */ }
function recalcularSaldoReal(horariosArray, meta, ehFeriado = false) {
    if(!horariosArray || !Array.isArray(horariosArray)) return 0;
    const toMins = (t) => { if(!t || t.length < 5) return 0; const [h, m] = t.split(':').map(Number); return (h*60)+m; };
    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); } }
    let saldoJornada = ehFeriado ? minutosTrabalhados * 2 : (minutosTrabalhados - meta);
    if (!ehFeriado && Math.abs(saldoJornada) <= 10) saldoJornada = 0;
    let saldoIndenizacao = 0;
    if (horariosArray[1] && horariosArray[2]) { const int = toMins(horariosArray[2]) - toMins(horariosArray[1]); if (int < 60) saldoIndenizacao = 60 - int; }
    return saldoJornada + saldoIndenizacao;
}
window.voltarAoSistema = function() { window.location.href = "../"; }