@extends('layouts.app')
@section('title','Importando LOGs...')
@section('content')
 
<h2>A. Importação de LOGs em Andamento</h2>
 
<div class="progresso-box">
 
    {{-- Arquivo sendo processado --}}
    <div class="prog-arquivo-atual" id="prog-arquivo">
        Aguardando início...
    </div>
 
    {{-- Barra de progresso --}}
    <div class="prog-header">
        <span id="prog-label">Inicializando...</span>
        <span id="prog-pct">0%</span>
    </div>
    <div class="prog-track">
        <div class="prog-bar" id="prog-bar" style="width:0%"></div>
    </div>
    <div class="prog-sub" id="prog-sub">&nbsp;</div>
 
    {{-- Terminal de log em tempo real --}}
    <div class="prog-log" id="prog-log">
        <div class="log-info">▶ Iniciando processamento...</div>
    </div>
 
    {{-- Resumo final --}}
    <div class="prog-resumo" id="prog-resumo" style="display:none">
        <h3>✅ Importação Concluída</h3>
        <table class="table" style="max-width:420px;margin-top:.75rem">
            <tr><th>Início</th>            <td id="r-inicio">—</td></tr>
            <tr><th>Fim</th>               <td id="r-fim">—</td></tr>
            <tr><th>Tempo total</th>       <td id="r-tempo">—</td></tr>
            <tr><th>LOGs processados</th>  <td id="r-proc">—</td></tr>
            <tr><th>LOGs duplicados</th>   <td id="r-dup">—</td></tr>
            <tr><th>Erros</th>             <td id="r-erros">—</td></tr>
        </table>
 
        {{-- Tabela de LOGs duplicados --}}
        <div id="bloco-dup" style="display:none;margin-top:1rem">
            <h4 style="color:#E65100;margin-bottom:.5rem">
                ⚠️ LOGs Duplicados Encontrados
            </h4>
            <p style="font-size:.85rem;color:#555;margin-bottom:.4rem">
                Os arquivos abaixo possuem o mesmo indicativo (callsign).
                O segundo arquivo sobrescreveu o primeiro no banco de dados.
            </p>
            <table class="table" id="tbl-dup">
                <thead>
                    <tr>
                        <th>Callsign</th>
                        <th>1º Arquivo (sobrescrito)</th>
                        <th>2º Arquivo (prevaleceu)</th>
                    </tr>
                </thead>
                <tbody></tbody>
            </table>
        </div>
 
        {{-- Erros fatais --}}
        <div id="bloco-erros" style="display:none;margin-top:.75rem" class="alert alert-danger"></div>
 
        <div style="margin-top:1.5rem;display:flex;gap:.75rem;flex-wrap:wrap">
            <a href="{{ route('dashboard') }}"            class="btn btn-secondary">← Dashboard</a>
            <a href="{{ route('processamento.juntar') }}" class="btn btn-primary">Próxima Etapa: Juntar LOGs →</a>
        </div>
    </div>
 
</div>
 
<style>
.progresso-box{background:#fff;border-radius:8px;padding:1.5rem 2rem;
    box-shadow:0 2px 12px rgba(0,0,0,.1);max-width:820px}
.prog-arquivo-atual,.prog-arquivo{font-size:.82rem;color:var(--muted);margin-bottom:.6rem;
    min-height:1.4em;background:#f8f9fa;border-radius:4px;padding:.3rem .7rem;
    font-family:'Consolas',monospace;transition:color .2s}
.prog-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.35rem}
#prog-label{font-weight:600;font-size:.95rem}
#prog-pct{font-weight:700;color:var(--blue);font-size:1.05rem;min-width:3.5rem;text-align:right}
.prog-track{background:#e9ecef;border-radius:50px;height:26px;overflow:hidden;margin-bottom:.4rem}
.prog-bar{height:100%;background:linear-gradient(90deg,#1B4F8C,#2E86DE);
    border-radius:50px;transition:width .5s ease;min-width:0;position:relative}
.prog-bar.ativo::after{content:'';position:absolute;inset:0;
    background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);
    animation:shimmer 1.2s linear infinite}
@keyframes shimmer{from{transform:translateX(-100%)}to{transform:translateX(100%)}}
.prog-bar.concluido{background:linear-gradient(90deg,#2E7D32,#43A047)}
.prog-bar.concluido::after{display:none}
.prog-sub{font-size:.8rem;color:var(--muted);min-height:1.1em;margin-bottom:.75rem}
.prog-log{background:#1a2332;color:#cdd5df;font-family:'Consolas','Courier New',monospace;
    font-size:.8rem;border-radius:6px;padding:.75rem 1rem;height:260px;overflow-y:auto;
    line-height:1.7;margin-bottom:1rem;border:1px solid #2c3e50}
.prog-log div{padding:.02rem 0}
.log-ok  {color:#81c784}
.log-info{color:#64b5f6}
.log-erro{color:#ef9a9a}
.log-dup {color:#ffcc80;font-weight:bold}
.log-arq {color:#e0e0e0}
.prog-resumo h3{color:var(--green);margin-bottom:.15rem}
.prog-resumo h4{font-size:.95rem}
</style>
 
<script>
(function () {
    const barEl    = document.getElementById('prog-bar');
    const labelEl  = document.getElementById('prog-label');
    const pctEl    = document.getElementById('prog-pct');
    const subEl    = document.getElementById('prog-sub');
    const logEl    = document.getElementById('prog-log');
    const resumoEl = document.getElementById('prog-resumo');
    const arquivoEl= document.getElementById('prog-arquivo');
 
    let polling  = null;
    const startTime = Date.now(); // marca o início para medir tempo real

    // ── Terminal: substituição completa a cada poll ─────────────────────────
    // Não acumula linhas — a sessão usa janela deslizante de 30 linhas.
    // Cada poll renderiza o array completo, substituindo o conteúdo anterior.
    function renderLog(linhas) {
        logEl.innerHTML = '';
        const cls = {ok:'log-ok', info:'log-info', erro:'log-erro',
                     dup:'log-dup', arq:'log-arq'};
        (linhas || []).forEach(function(l) {
            const d = document.createElement('div');
            if (cls[l.tipo]) d.className = cls[l.tipo];
            d.textContent = l.msg;
            logEl.appendChild(d);
            if (l.tipo === 'arq' || l.tipo === 'ok') {
                arquivoEl.textContent = l.msg;
            }
        });
        logEl.scrollTop = logEl.scrollHeight;
    }

    // ── Atualiza barra ──────────────────────────────────────────────────────
    function setBar(atual, total) {
        const p = total > 0 ? Math.min(100, Math.round((atual / total) * 100)) : 0;
        barEl.style.width = p + '%';
        pctEl.textContent = p + '%';
    }

    // ── Consulta o status a cada 800ms ──────────────────────────────────────
    function consultarStatus() {
        fetch('{{ route("processamento.importar.status") }}', {cache: 'no-store'})
            .then(r => r.json())
            .then(d => {

                // Renderiza o log atual completo (substituição)
                renderLog(d.progresso || []);

                // Atualiza barra e label
                if (d.total > 0) {
                    setBar(d.atual, d.total);
                    if (!d.concluido) {
                        labelEl.textContent = 'Processando ' + d.atual + ' de ' + d.total + '...';
                        subEl.textContent   = d.atual + ' / ' + d.total + ' arquivos';
                    }
                } else if (d.status === 'limpando') {
                    labelEl.textContent = 'Limpando tabelas...';
                    subEl.textContent   = '';
                }
 
                // Concluído
                if (d.concluido) {
                    if (d.resultado) {
                        clearInterval(polling);
                        exibirResumo(d.resultado, d.total);
                    }
                    // Se concluido mas resultado ainda null: continua polling (max 15 ciclos extras)
                    else {
                        window._semResultado = (window._semResultado || 0) + 1;
                        if (window._semResultado >= 15) {
                            clearInterval(polling);
                            // Exibe o que tiver — pelo menos desbloqueia a tela
                            exibirResumo({
                                total_logs: d.total, total_qsos: 0,
                                total_validos: 0, total_invalidos: 0,
                                tempo: '?', inicio: '—', fim: '—',
                                erros: [], inv: [], det_invalidos: [],
                                inv_tempo: [], inv_banda: [],
                                total_result: 0, banda_unk: 0,
                                total_participantes: 0, total_lidos: 0,
                                total_processados: 0, processados: 0,
                                duplicatas: [], score_total: 0,
                            }, d.total);
                        }
                    }
                }
            })
            .catch(() => { /* silencia erros de rede temporários */ });
    }
 
    // ── Exibe resumo final ──────────────────────────────────────────────────
    function exibirResumo(r, total) {
        // Grava tempo real e libera menu
        const segundosReais = Math.round((Date.now() - startTime) / 1000);
        confirmarConclusao('A', segundosReais);
        setBar(total, total);
        barEl.classList.remove('ativo');
        barEl.classList.add('concluido');
        labelEl.textContent  = '✅ Concluído!';
        subEl.textContent    = '';
        arquivoEl.textContent = '✅ Todos os arquivos processados.';
 
        document.getElementById('r-inicio').textContent = r.inicio;
        document.getElementById('r-fim').textContent    = r.fim;
        document.getElementById('r-tempo').textContent  = r.tempo;
        document.getElementById('r-proc').textContent   = r.processados + ' arquivo(s)';
        document.getElementById('r-dup').textContent    = r.duplicatas.length;
        document.getElementById('r-erros').textContent  = r.erros.length;
 
        // Tabela de LOGs duplicados
        if (r.duplicatas.length > 0) {
            document.getElementById('bloco-dup').style.display = 'block';
            const tbody = document.querySelector('#tbl-dup tbody');
            r.duplicatas.forEach(function (dup) {
                const tr = document.createElement('tr');
                tr.innerHTML =
                    '<td><strong>' + dup.callsign + '</strong></td>' +
                    '<td style="color:#999"><code>' + dup.arquivo1 + '</code></td>' +
                    '<td><code>' + dup.arquivo2 + '</code></td>';
                tbody.appendChild(tr);
            });
        }
 
        // Erros fatais
        if (r.erros.length > 0) {
            const b = document.getElementById('bloco-erros');
            b.style.display = 'block';
            b.innerHTML = '<strong>Erros durante a importação:</strong><br>' +
                r.erros.map(s => '• ' + s).join('<br>');
        }
 
        resumoEl.style.display = 'block';
        resumoEl.scrollIntoView({behavior:'smooth', block:'start'});
    }
 
    // ── Dispara o processamento via fetch (não bloqueia a página) ───────────
    barEl.classList.add('ativo');
    fetch('{{ route("processamento.importar.processar") }}', {
        method: 'POST',
        headers: {
            'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
            'Content-Type': 'application/json',
            'Accept':       'application/json',
        },
    }).catch(() => {
        addLog('❌ Falha ao iniciar o processamento.', 'erro');
        clearInterval(polling);
    });
 
    // Inicia o polling imediatamente
    consultarStatus();
    polling = setInterval(consultarStatus, 800);
 

    // ── Confirma conclusão ao backend e desbloqueio do menu ─────────────────
    // Chamado UMA vez quando exibirResumo() renderiza os botões finais.
    // Envia o tempo real medido pelo JS (mais preciso que o tempo do PHP).
    function desbloquearMenu() {
        // Remove imediatamente o bloqueio visual do menu sem esperar reload
        const nav = document.querySelector('nav.navbar');
        if (nav) nav.classList.remove('navbar-processando');
        const aviso = document.querySelector('.navbar-aviso-proc');
        if (aviso) aviso.remove();
        const menuDiv = document.querySelector('.navbar-menu');
        if (menuDiv) menuDiv.classList.remove('menu-desabilitado');
        document.querySelectorAll('.nav-disabled').forEach(el => el.classList.remove('nav-disabled'));
        const banner = document.querySelector('.alert-warning');
        if (banner && banner.textContent.includes('Processamento em andamento')) banner.remove();
    }

    function confirmarConclusao(etapa, segundos) {
        desbloquearMenu(); // desbloqueio imediato no DOM
        fetch('{{ route("processamento.concluir-etapa") }}', {
            method: 'POST',
            headers: {
                'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
                'Content-Type': 'application/json',
                'Accept': 'application/json',
            },
            body: JSON.stringify({ etapa: etapa, segundos: segundos }),
        }).catch(() => { /* silencia — não é crítico */ });
    }

}());
</script>
@endsection