<?php
require_once __DIR__ . '/../db.php';
require_once __DIR__ . '/../includes/auth.php';
require_once __DIR__ . '/../includes/functions.php';
require_admin();

// Força reverificação de versão limpando o cache antes de qualquer output
if (isset($_GET['force_check'])) {
    @unlink('/opt/monitorping/.version_check_cache');
    header('Location: ' . BASE_URL . 'index.php?page=admin_update');
    exit;
}

require_once __DIR__ . '/../includes/header.php';

$currentVersion = trim(@file_get_contents('/var/www/html/VERSION') ?: 'dev');

// Verifica a última versão disponível (mesmo cache do header)
$latestVersion  = null;
$versionCacheFile = '/opt/monitorping/.version_check_cache';
if (file_exists($versionCacheFile)) {
    $cached = @json_decode(@file_get_contents($versionCacheFile), true);
    $latestVersion = $cached['latest'] ?? null;
}

$hasUpdate = $latestVersion && version_compare($latestVersion, $currentVersion, '>');
?>

<style>
.upd-page { max-width: 820px; }
.upd-card {
    background: var(--card); border: 1px solid var(--border);
    border-radius: 12px; padding: 1.5rem; margin-bottom: 1.5rem;
}
.upd-card h3 { margin: 0 0 1rem; font-size: 1.05rem; }
.ver-row { display: flex; gap: 2rem; flex-wrap: wrap; margin-bottom: 1.2rem; }
.ver-item { text-align: center; }
.ver-item small { display: block; color: var(--text-secondary); font-size: .78rem; margin-bottom: .25rem; }
.ver-item strong { font-size: 1.4rem; font-weight: 700; font-family: monospace; }
.ver-item strong.new { color: #22c55e; }
.ver-item strong.same { color: var(--text-secondary); }
.upd-btn {
    background: #2563eb; color: #fff; border: none; border-radius: 8px;
    padding: .65rem 1.4rem; font-size: .95rem; cursor: pointer;
    display: inline-flex; align-items: center; gap: .5rem;
}
.upd-btn:disabled { background: #94a3b8; cursor: not-allowed; }
.upd-btn.danger { background: #ef4444; }
#log-section { display: none; margin-top: 1.2rem; }
#log-box {
    background: #0f172a; color: #e2e8f0; font-family: monospace; font-size: .8rem;
    padding: 1rem; border-radius: 8px; height: 340px; overflow-y: auto;
    white-space: pre-wrap; word-break: break-all; line-height: 1.5;
}
.upd-status-bar {
    display: flex; align-items: center; gap: .75rem;
    padding: .6rem 1rem; border-radius: 8px; margin-bottom: .75rem;
    font-size: .88rem; font-weight: 600;
    background: #f1f5f9; border: 1px solid var(--border);
}
[data-theme="dark"] .upd-status-bar { background: #1e293b; }
.upd-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }
.upd-dot.running  { background: #f59e0b; animation: pulse .8s infinite alternate; }
.upd-dot.success  { background: #22c55e; }
.upd-dot.failed   { background: #ef4444; }
.upd-dot.idle     { background: #94a3b8; }
.upd-dot.triggered{ background: #3b82f6; animation: pulse .8s infinite alternate; }
.upd-dot.up_to_date { background: #22c55e; }
@keyframes pulse { to { opacity: .3; } }
</style>

<div class="upd-page">
    <h2 style="margin-bottom:.25rem;">🔄 Atualização do Sistema</h2>
    <p style="color:var(--text-secondary);font-size:.9rem;margin-bottom:1.5rem;">
        Gerencie atualizações do MonitorPing diretamente pelo painel.
    </p>

    <div class="upd-card">
        <h3>Versões</h3>
        <div class="ver-row">
            <div class="ver-item">
                <small>Versão instalada</small>
                <strong><?= h($currentVersion) ?></strong>
            </div>
            <div class="ver-item">
                <small>Versão disponível</small>
                <strong class="<?= $hasUpdate ? 'new' : 'same' ?>">
                    <?= $latestVersion ? h($latestVersion) : '—' ?>
                </strong>
            </div>
        </div>

        <?php if ($hasUpdate): ?>
        <div style="background:#f0fdf4;border:1px solid #86efac;border-radius:8px;padding:.7rem 1rem;margin-bottom:1rem;font-size:.88rem;color:#166534;">
            ✅ Nova versão <strong><?= h($latestVersion) ?></strong> disponível para instalação.
        </div>
        <?php else: ?>
        <div style="background:#f1f5f9;border:1px solid var(--border);border-radius:8px;padding:.7rem 1rem;margin-bottom:1rem;font-size:.88rem;color:var(--text-secondary);">
            Sistema na versão mais recente.
        </div>
        <?php endif; ?>

        <div id="status-bar" class="upd-status-bar">
            <span class="upd-dot idle" id="status-dot"></span>
            <span id="status-text">Pronto</span>
        </div>

        <div style="display:flex;gap:.75rem;flex-wrap:wrap;align-items:center;">
            <button class="upd-btn" id="btn-update" onclick="startUpdate()">
                🔄 <?= $hasUpdate ? 'Atualizar agora' : 'Forçar atualização' ?>
            </button>
            <button class="upd-btn" id="btn-check"
                style="background:var(--card);color:var(--text);border:1px solid var(--border);"
                onclick="checkVersion()">
                Verificar versão
            </button>
            <?php if ($currentVersion !== 'dev'): ?>
            <span style="font-size:.8rem;color:var(--text-secondary);">
                Atualização automática: todo dia às 3h da manhã
            </span>
            <?php endif; ?>
        </div>

        <div id="log-section">
            <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:.5rem;margin-top:1rem;">
                <span style="font-size:.85rem;font-weight:600;color:var(--text-secondary);">Log de atualização</span>
                <button onclick="document.getElementById('log-box').scrollTop=9999"
                    style="font-size:.75rem;background:none;border:none;cursor:pointer;color:var(--text-secondary);">
                    ↓ Ir para o fim
                </button>
            </div>
            <div id="log-box"></div>
        </div>
    </div>

    <?php
    $changelogFile = '/var/www/html/CHANGELOG.md';
    $changelog = @file_get_contents($changelogFile) ?: '';
    if ($changelog):
        // Converte markdown simples para HTML
        $lines = explode("\n", $changelog);
        $html = '';
        foreach ($lines as $line) {
            if (preg_match('/^## (.+)/', $line, $m)) {
                $html .= '<div class="cl-version">' . h($m[1]) . '</div>';
            } elseif (preg_match('/^- (.+)/', $line, $m)) {
                $html .= '<div class="cl-item">· ' . h($m[1]) . '</div>';
            }
        }
    ?>
    <div class="upd-card">
        <h3>Changelog</h3>
        <style>
        .cl-version { font-weight:700; font-size:.95rem; margin:1rem 0 .4rem; color:var(--text); }
        .cl-version:first-child { margin-top:0; }
        .cl-item { font-size:.85rem; color:var(--text-secondary); padding:.15rem 0 .15rem .5rem; border-left:2px solid var(--border); margin-bottom:.2rem; }
        </style>
        <?= $html ?>
    </div>
    <?php endif; ?>

    <div class="upd-card">
        <h3>Rollback manual</h3>
        <p style="color:var(--text-secondary);font-size:.85rem;margin-bottom:.75rem;">
            Se algo der errado, acesse o servidor via SSH e execute:
        </p>
        <code style="display:block;background:var(--bg);padding:.75rem 1rem;border-radius:6px;font-size:.82rem;border:1px solid var(--border);">
            sudo bash /opt/monitorping/update.sh --rollback YYYYMMDD-HHMMSS
        </code>
        <p style="font-size:.78rem;color:var(--text-secondary);margin-top:.5rem;">
            Os backups ficam em <code>/var/backups/monitorping/</code> por 30 dias.
        </p>
    </div>
</div>

<script>
const TRIGGER_URL = <?= json_encode(BASE_URL . 'index.php?page=api_update_trigger') ?>;
const LOG_URL     = <?= json_encode(BASE_URL . 'index.php?page=api_update_log') ?>;
const CSRF        = <?= json_encode(csrf_token()) ?>;

let pollInterval = null;
let pollCount = 0;
const MAX_POLL = 300; // 10 minutos (300 × 2s)

const statusLabels = {
    idle:       { text: 'Pronto',                  cls: 'idle' },
    triggered:  { text: 'Aguardando watcher...',   cls: 'triggered' },
    running:    { text: 'Atualizando...',           cls: 'running' },
    success:    { text: 'Atualização concluída!',   cls: 'success' },
    up_to_date: { text: 'Já está na versão mais recente.', cls: 'up_to_date' },
    failed:     { text: 'Falha na atualização.',    cls: 'failed' },
};

function setStatus(state, msg) {
    const info   = statusLabels[state] || { text: state, cls: 'idle' };
    const dot    = document.getElementById('status-dot');
    const text   = document.getElementById('status-text');
    dot.className = 'upd-dot ' + info.cls;
    text.textContent = msg || info.text;
}

function setLog(content) {
    const box = document.getElementById('log-box');
    const atBottom = box.scrollHeight - box.scrollTop <= box.clientHeight + 40;
    box.textContent = content || '';
    if (atBottom) box.scrollTop = box.scrollHeight;
}

async function poll() {
    pollCount++;
    if (pollCount > MAX_POLL) {
        stopPoll();
        setStatus('failed', 'Tempo limite excedido. Recarregue a página.');
        document.getElementById('btn-update').disabled = false;
        return;
    }
    try {
        const r = await fetch(LOG_URL);
        let data;
        try { data = await r.json(); } catch(e) {
            // JSON inválido pode ocorrer durante restart — aguarda próximo ciclo
            return;
        }
        const state = data.status || 'idle';

        setStatus(state, data.message);
        if (data.log) {
            document.getElementById('log-section').style.display = 'block';
            setLog(data.log);
        }

        if (['success', 'up_to_date', 'failed'].includes(state)) {
            stopPoll();
            document.getElementById('btn-update').disabled = false;
            if (state === 'success') {
                startReloadCountdown(5);
            }
        }
    } catch(e) {
        // Silencia erros de rede (podem ocorrer durante restart dos containers)
    }
}

function startPoll() {
    if (pollInterval) return;
    pollCount = 0;
    pollInterval = setInterval(poll, 2000);
}

function stopPoll() {
    if (pollInterval) { clearInterval(pollInterval); pollInterval = null; }
}

async function startUpdate() {
    if (!confirm('Confirma a atualização do sistema?\n\nO sistema será reiniciado brevemente. Os dados serão preservados.')) return;

    document.getElementById('btn-update').disabled = true;
    document.getElementById('log-section').style.display = 'block';
    document.getElementById('log-box').textContent = 'Disparando atualização...';
    setStatus('triggered');

    const fd = new FormData();
    fd.append('csrf_token', CSRF);

    try {
        const r    = await fetch(TRIGGER_URL, { method: 'POST', body: fd });
        const data = await r.json();
        if (!data.ok) {
            setStatus('failed', data.error || 'Erro ao disparar atualização.');
            document.getElementById('btn-update').disabled = false;
            return;
        }
        startPoll();
    } catch(e) {
        setStatus('failed', 'Erro de rede ao disparar atualização.');
        document.getElementById('btn-update').disabled = false;
    }
}

function startReloadCountdown(secs) {
    const bar = document.getElementById('status-bar');
    const reloadDiv = document.createElement('div');
    reloadDiv.id = 'reload-notice';
    reloadDiv.style.cssText = 'margin-top:.75rem;background:var(--card);border:1px solid var(--border);border-radius:8px;padding:.6rem 1rem;font-size:.85rem;color:var(--text-secondary);display:flex;align-items:center;gap:.5rem;';
    reloadDiv.innerHTML = `<span>↻</span><span id="reload-txt">Recarregando página em <strong>${secs}s</strong>…</span>`;
    bar.after(reloadDiv);

    const timer = setInterval(() => {
        secs--;
        if (secs <= 0) {
            clearInterval(timer);
            location.reload();
        } else {
            const el = document.getElementById('reload-txt');
            if (el) el.innerHTML = `Recarregando página em <strong>${secs}s</strong>…`;
        }
    }, 1000);
}

function checkVersion() {
    window.location.href = <?= json_encode(BASE_URL . 'index.php?page=admin_update&force_check=1') ?>;
}

// Ao carregar: restaura estado visual e retoma polling se necessário
(async () => {
    const r = await fetch(LOG_URL).catch(() => null);
    if (!r) return;
    const data = await r.json().catch(() => null);
    if (!data) return;
    const state = data.status || 'idle';
    if (['running', 'triggered'].includes(state)) {
        document.getElementById('btn-update').disabled = true;
        document.getElementById('log-section').style.display = 'block';
        setLog(data.log);
        setStatus(state, data.message);
        startPoll();
    } else if (['failed', 'success', 'up_to_date'].includes(state)) {
        if (data.log) {
            document.getElementById('log-section').style.display = 'block';
            setLog(data.log);
        }
        setStatus(state, data.message);
    }
})();
</script>

<?php require_once __DIR__ . '/../includes/footer.php'; ?>
