<?php
// Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
// Painel de atualizacoes OTA — historico de cada cliente que rodou /atualizar.
// Mostra: versao antes/depois, etapas, snapshot dos arquivos criticos, install path.
// Pra eu nao precisar mais entrar via PowerShell no cliente pra descobrir erro.

$dirAtu = __DIR__ . '/storage/atualizacoes';
$clientes = [];
if (is_dir($dirAtu)) {
    foreach (glob($dirAtu . '/*.jsonl') ?: [] as $f) {
        $host = basename($f, '.jsonl');
        $linhas = @file($f, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ?: [];
        $regs = [];
        foreach ($linhas as $l) {
            $j = @json_decode($l, true);
            if (is_array($j)) $regs[] = $j;
        }
        // mais recente primeiro
        usort($regs, fn($a,$b) => strcmp($b['gravado_em'] ?? '', $a['gravado_em'] ?? ''));
        if ($regs) $clientes[$host] = $regs;
    }
}
// Cliente em foco (query string)
$focoHost = $_GET['host'] ?? '';
$focoIdx  = (int)($_GET['i'] ?? 0);

function fmtData(?string $iso): string {
    if (!$iso) return '—';
    $t = strtotime($iso);
    return $t ? date('d/m/Y H:i:s', $t) : $iso;
}
function tag(string $cls, string $txt): string {
    return '<span class="tag ' . $cls . '">' . htmlspecialchars($txt) . '</span>';
}
?>
<!doctype html>
<html lang="pt-BR"><head>
<meta charset="utf-8">
<title>Atualizações OTA — Painel Central de Backups</title>
<style>
  body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background:#f8fafc; margin:0; color:#0f172a; }
  header { background:#1e293b; color:#fff; padding:1rem 1.5rem; display:flex; align-items:center; gap:1rem; }
  header h1 { font-size:1.1rem; margin:0; }
  header a { color:#94a3b8; text-decoration:none; font-size:.85rem; }
  header a:hover { color:#fff; }
  main { padding:1.5rem; max-width:1200px; margin:0 auto; }
  .grid { display:grid; grid-template-columns: 280px 1fr; gap:1.5rem; }
  .lista { background:#fff; border-radius:8px; padding:.5rem; border:1px solid #e2e8f0; }
  .lista h3 { margin:.4rem .5rem; font-size:.85rem; color:#64748b; text-transform:uppercase; letter-spacing:.05em; }
  .cli { display:block; padding:.5rem .7rem; border-radius:6px; text-decoration:none; color:#0f172a; font-size:.9rem; }
  .cli:hover { background:#f1f5f9; }
  .cli.ativo { background:#dbeafe; color:#1d4ed8; font-weight:600; }
  .cli small { display:block; color:#64748b; font-size:.75rem; margin-top:.15rem; }
  .detalhe { background:#fff; border-radius:8px; padding:1.5rem; border:1px solid #e2e8f0; }
  .detalhe h2 { margin-top:0; font-size:1.15rem; }
  table { width:100%; border-collapse:collapse; font-size:.85rem; }
  th, td { text-align:left; padding:.5rem .6rem; border-bottom:1px solid #f1f5f9; vertical-align:top; }
  th { background:#f8fafc; font-weight:600; color:#475569; font-size:.78rem; text-transform:uppercase; }
  .tag { display:inline-block; padding:.15rem .5rem; border-radius:4px; font-size:.75rem; font-weight:600; }
  .ok { background:#dcfce7; color:#166534; }
  .erro { background:#fee2e2; color:#7f1d1d; }
  .neutro { background:#e2e8f0; color:#475569; }
  pre { background:#1e293b; color:#e2e8f0; padding:.6rem; border-radius:6px; font-size:.75rem; max-height:300px; overflow:auto; }
  details { margin: .5rem 0; }
  summary { cursor:pointer; padding:.3rem 0; color:#475569; font-weight:600; }
  .versao-row { display:flex; gap:1rem; align-items:center; font-size:.95rem; margin-bottom:.5rem; }
  .versao-row strong { font-size:1.1rem; }
  .vazio { color:#64748b; text-align:center; padding:3rem; }
  .arq-tab td:first-child { font-family: monospace; font-size:.78rem; color:#475569; }
</style>
</head><body>

<header>
  <h1>🔄 Atualizações OTA</h1>
  <a href="index.php">← Voltar pro painel de backups</a>
</header>

<main>
<?php if (empty($clientes)): ?>
  <div class="vazio">
    <h2>Nenhuma atualização registrada ainda</h2>
    <p>Quando um cliente rodar a atualização do BI (v1.5.35+), o log dela aparece aqui automaticamente.</p>
  </div>
<?php else: ?>
  <div class="grid">
    <aside class="lista">
      <h3>Clientes (<?= count($clientes) ?>)</h3>
      <?php foreach ($clientes as $host => $regs):
        $ultima = $regs[0];
        $verNova = $ultima['versao_nova'] ?? '?';
        $sucesso = !empty($ultima['sucesso']);
        $ehEsse = ($host === $focoHost) || ($focoHost === '' && reset($clientes) === $regs);
      ?>
        <a class="cli <?= $ehEsse ? 'ativo' : '' ?>" href="?host=<?= urlencode($host) ?>">
          <strong><?= htmlspecialchars($host) ?></strong>
          <small>
            <?= count($regs) ?> atualizações · última v<?= htmlspecialchars($verNova) ?>
            <?= $sucesso ? '✅' : '❌' ?>
            · <?= htmlspecialchars(date('d/m H:i', strtotime($ultima['gravado_em'] ?? 'now'))) ?>
          </small>
        </a>
      <?php endforeach; ?>
    </aside>

    <section class="detalhe">
      <?php
        $hostSel = $focoHost ?: array_key_first($clientes);
        $regs    = $clientes[$hostSel] ?? [];
        $reg     = $regs[$focoIdx] ?? null;
      ?>
      <?php if (!$reg): ?>
        <p class="vazio">Selecione uma atualização à esquerda.</p>
      <?php else: ?>
        <h2><?= htmlspecialchars($hostSel) ?></h2>

        <div class="versao-row">
          <?= tag('neutro', 'v' . ($reg['versao_anterior'] ?? '?')) ?>
          →
          <strong><?= htmlspecialchars($reg['versao_nova'] ?? '?') ?></strong>
          <?= !empty($reg['sucesso']) ? tag('ok', '✅ Sucesso') : tag('erro', '❌ Falha') ?>
          <span style="color:#64748b">em <?= fmtData($reg['gravado_em'] ?? null) ?></span>
        </div>

        <?php if (!empty($reg['erro'])): ?>
          <div style="background:#fef2f2;border-left:4px solid #dc2626;padding:.7rem 1rem;border-radius:4px;margin:1rem 0">
            <strong style="color:#7f1d1d">Erro:</strong> <?= htmlspecialchars($reg['erro']) ?>
          </div>
        <?php endif; ?>

        <?php if (count($regs) > 1): ?>
          <details><summary>📜 Histórico (<?= count($regs) ?> registros)</summary>
            <table>
              <thead><tr><th>Quando</th><th>Versão</th><th>Status</th></tr></thead>
              <tbody>
                <?php foreach ($regs as $i => $r): ?>
                  <tr style="<?= $i === $focoIdx ? 'background:#fef3c7' : '' ?>">
                    <td><a href="?host=<?= urlencode($hostSel) ?>&i=<?= $i ?>"><?= fmtData($r['gravado_em'] ?? null) ?></a></td>
                    <td>v<?= htmlspecialchars($r['versao_anterior'] ?? '?') ?> → v<?= htmlspecialchars($r['versao_nova'] ?? '?') ?></td>
                    <td><?= !empty($r['sucesso']) ? '✅' : '❌' ?></td>
                  </tr>
                <?php endforeach; ?>
              </tbody>
            </table>
          </details>
        <?php endif; ?>

        <details open><summary>🛠 Etapas</summary>
          <table>
            <thead><tr><th>Etapa</th><th>OK</th><th>Quando</th><th>Detalhes</th></tr></thead>
            <tbody>
              <?php foreach (($reg['etapas'] ?? []) as $e): ?>
                <tr>
                  <td><strong><?= htmlspecialchars($e['etapa'] ?? '?') ?></strong></td>
                  <td><?= !empty($e['ok']) ? '✅' : '❌' ?></td>
                  <td><?= fmtData($e['em'] ?? null) ?></td>
                  <td><pre style="margin:0;max-height:120px"><?= htmlspecialchars(json_encode($e['detalhes'] ?? [], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) ?></pre></td>
                </tr>
              <?php endforeach; ?>
            </tbody>
          </table>
        </details>

        <?php
          $depois = $reg['snapshot_depois'] ?? $reg['snapshot_antes'] ?? [];
          $antes  = $reg['snapshot_antes']  ?? [];
        ?>
        <details><summary>📂 Ambiente do cliente</summary>
          <table>
            <tr><th>Install root</th><td><code><?= htmlspecialchars($depois['install_root'] ?? '?') ?></code></td></tr>
            <tr><th>App root</th><td><code><?= htmlspecialchars($depois['app_root'] ?? '?') ?></code></td></tr>
            <tr><th>PHP code root</th><td><code><?= htmlspecialchars($depois['php_code_root'] ?? '?') ?></code></td></tr>
            <tr><th>Versão PHP</th><td><?= htmlspecialchars($depois['php_version'] ?? '?') ?></td></tr>
            <tr><th>SAPI</th><td><?= htmlspecialchars($depois['php_sapi'] ?? '?') ?></td></tr>
            <tr><th>OS</th><td><?= htmlspecialchars($depois['os'] ?? '?') ?></td></tr>
            <tr><th>Memory limit</th><td><?= htmlspecialchars($depois['memory_limit'] ?? '?') ?></td></tr>
            <tr><th>IP remoto</th><td><?= htmlspecialchars($reg['ip_remoto'] ?? '?') ?></td></tr>
          </table>
        </details>

        <details><summary>📋 Arquivos críticos pós-atualização</summary>
          <table class="arq-tab">
            <thead><tr><th>Arquivo</th><th>Existe?</th><th>Bytes</th><th>Modificado em</th></tr></thead>
            <tbody>
            <?php foreach (($depois['arquivos'] ?? []) as $rel => $info): ?>
              <tr>
                <td><?= htmlspecialchars($rel) ?></td>
                <td><?= !empty($info['existe']) ? '✅' : '<span style="color:#dc2626">❌ FALTA</span>' ?></td>
                <td><?= number_format($info['bytes'] ?? 0, 0, ',', '.') ?></td>
                <td><?= fmtData($info['mtime'] ?? null) ?></td>
              </tr>
            <?php endforeach; ?>
            </tbody>
          </table>
        </details>

        <details><summary>🧠 Raw JSON</summary>
          <pre><?= htmlspecialchars(json_encode($reg, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) ?></pre>
        </details>
      <?php endif; ?>
    </section>
  </div>
<?php endif; ?>
</main>

</body></html>
