<?php
session_start();
// --- FORÇA O FUSO HORÁRIO DE BRASÍLIA ---
date_default_timezone_set('America/Sao_Paulo'); 
require_once 'conexao.php';

// --- 1. TRAVA DE SEGURANÇA TOTAL ---
if (!isset($_SESSION['logado']) || $_SESSION['logado'] !== true) {
    header("Location: login.php"); exit;
}

$isAdmin = (strtolower($_SESSION['nivel']) === 'admin');
$usuarioLogado = $_SESSION['usuario'];

if (!$isAdmin) {
    $stmtCheck = $connUser->prepare("SELECT bloqueado, data_premio FROM rev WHERE usuario = ? LIMIT 1");
    $stmtCheck->execute([$usuarioLogado]);
    $me = $stmtCheck->fetch(PDO::FETCH_ASSOC);

    if ($me) {
        $isBloq = ($me['bloqueado'] == 'sim');
        $isVenc = ((int)$me['data_premio'] > 0 && (int)$me['data_premio'] < time());
        if ($isBloq || $isVenc) {
            die("Acesso Negado: Bloqueado ou Vencido");
        }
    }
}

// --- 2. CONFIGURAÇÕES VISUAIS ---
$nomePainel = "IPTV PANEL"; $corPrimaria = "#7367f0"; 
try {
    $conf = $connGeral->query("SELECT NomePainel, TemaPainel FROM site_config LIMIT 1")->fetch(PDO::FETCH_ASSOC);
    if ($conf) {
        if (!empty($conf['NomePainel'])) $nomePainel = $conf['NomePainel'];
        if (!empty($conf['TemaPainel'])) $corPrimaria = $conf['TemaPainel'];
    }
} catch (Exception $e) { }

// ====================================================================================
// CONFIGURAÇÃO DIRETA DO CSP 
// ====================================================================================
$IP_CSP = "49.12.35.101";
$PORTA_CSP = "2021"; 
$USUARIO_CSP = "kaua"; 
$SENHA_CSP = "909110";

// DICIONÁRIO INTERNO DE CANAIS (Para traduzir os "Unknown" do CSP)
$dicionario_canais = [
    // --- SD ---
    "155" => "BBB", "83" => "GLOBALSAT+", "57" => "A&E", "7A" => "ANIMAL PLANET", "80" => "APARECIDA",
    "82" => "ARTE 1", "54" => "AXN", "140" => "BAND ALTERNATIVO", "8C" => "BAND NEWS", "2F" => "BAND SPORT",
    "1A4" => "BANDEIRANTES", "90" => "BIS", "60" => "BOOMERANG", "43" => "CANAL BRASIL", "62" => "CANAL RURAL",
    "193" => "CANCAO NOVA", "5F" => "CARTOON NETWORK", "95" => "PREMIERE 9", "39" => "CINEMAX", "70" => "CNNE",
    "8D" => "CNNI", "7E" => "CNT", "18B" => "PREMIERE COMBATE", "5C" => "COMEDY CENTRAL", "9F" => "CURTA!",
    "9A" => "DEUTSCHE WELLE", "78" => "DISCOVERY CHANNEL", "2B" => "DISCOVERY H&H", "64" => "DISCOVERY KIDS",
    "6E" => "DISCOVERY TURBO", "66" => "DISNEY", "65" => "DISNEY JUNIOR", "67" => "DISNEY XD", "36" => "E!",
    "1AD" => "EPTV CAMPINAS", "1A3" => "EPTV RIBEIRAO PRETO", "1AF" => "EPTV SAO CARLOS", "2D" => "ESPN",
    "2E" => "ESPN BRASIL", "89" => "I-SAT", "30" => "ESPN+", "37" => "FOX", "2C" => "FOX LIFE", "32" => "FOX SPORT",
    "22" => "FOX SPORTV2", "1A8" => "FUTURA", "34" => "FISH TV", "23" => "FOOD NETWORK", "53" => "FX", "35" => "GLITZ",
    "197" => "GLOBO BAHIA", "198" => "GLOBO MINAS", "199" => "GLOBO NORDESTE", "194" => "GLOBO RIO DE JANEIRO",
    "195" => "GLOBO SAO PAULO", "28" => "GLOBO NEWS", "5E" => "GLOOB", "29" => "GNT", "45" => "HBO", "48" => "HBO FAMILY",
    "46" => "HBO PLUS", "4B" => "HBO PLUS E", "4C" => "HBO SIGNATURE", "47" => "HBO2", "7B" => "ID INVESTIGACAO DISCOVERY",
    "86" => "IDEAL TV", "1AC" => "INTER TV CABUGI", "4D" => "MAX", "49" => "MAX UP", "4A" => "MAX PRIME", "4E" => "MAX PRIME E",
    "3C" => "MEGAPIX", "7F" => "RBI", "1D" => "MTV", "2A" => "MULTISHOW", "88" => "MUSIC BOX BRAZIL", "79" => "NATIONAL GEOGRAPHIC",
    "73" => "NAT GEO WILD", "1A9" => "NBR", "9C" => "NHK PREMIUM", "6A" => "NICK JR", "6B" => "NICKELODEON", "33" => "OFF",
    "76" => "PLAY TV", "B0" => "POLISHOP", "18F" => "PREMIERE 1", "BC" => "PREMIERE 2", "191" => "PREMIERE 3",
    "192" => "PREMIERE 4", "BB" => "PREMIERE 5", "BA" => "PREMIERE 6", "18A" => "PREMIERE 7", "18E" => "PREMIERE 8",
    "18D" => "PREMIERE CLUBES", "44" => "PRIME BOX BRASIL", "85" => "RAI", "1A0" => "RBS PORTO ALEGRE", "6F" => "RECORD NEWS",
    "81" => "REDE BRASIL", "84" => "REDE TV", "5A" => "REDE VIDA", "7D" => "RIT", "19E" => "RPC TV PARANAENCE", "87" => "RECORD TV",
    "1AA" => "SBT", "96" => "SIC", "56" => "SONY", "4F" => "LIFETIME", "3A" => "SPACE", "27" => "SPORTV", "26" => "SPORTV2",
    "152" => "SPORTV2 ALTERNATIVO", "24" => "SPORTV3", "153" => "SPORTV ALTERNATIVO", "51" => "STUDIO UNUVERSAL", "52" => "SYFY",
    "5B" => "TBS", "50" => "TCM", "3E" => "TELECINE ACTION", "41" => "TELECINE CULT", "19C" => "TELECINE FUN", "40" => "TELECINE PIPOCA",
    "3D" => "TELECINE PREMIUM", "3F" => "TELECINE TOUCH", "6D" => "TERRA VIVA", "12D" => "TESTE1", "322" => "TESTE2", "69" => "H2",
    "68" => "THE HISTORY CHANNEL", "7C" => "TRAVEL AND LIVING CHANNEL", "3B" => "TNT", "61" => "TOONCAST", "58" => "TRU TV",
    "1A1" => "TV AMAZONAS", "19A" => "TV ANHANGUERA GOIANIA", "A4" => "TV BRASIL", "19D" => "TV CENTRO AMERICA", "1A7" => "TV CULTURA",
    "A2" => "TV CAMARA", "C7" => "TV ESCOLA", "97" => "TV ESPANA", "1AE" => "GLOBO BRASILIA", "A0" => "TV JUSTICA", "19F" => "TV LIBERAL BELEM",
    "6C" => "TV RA TIM BUM", "A1" => "TV SENADO", "1A6" => "TV TEM BAURU", "1A5" => "TV TEM SOROCABA", "19B" => "TV TEM SAO JOSE DO RIO PARDO",
    "1A2" => "TV TRIBUNAS SANTOS", "1B0" => "TV VANGUARDA SAO JOSE", "196" => "TV VERDES MARES FORTALE", "98" => "TV5 MONDE", "12C" => "TV EXEC",
    "8F" => "UNIVERSAL CHANNEL", "31" => "PARAMOUNT", "25" => "VIVA", "55" => "WARNER CHANNEL", "5D" => "WHOOHOO", "42" => "BOA VONTADE",
    "59" => "DISCOVERY CIVILIZATION", "74" => "DISCOVERY SCIENCE", "92" => "EI MAXX", "93" => "FISH TV", "B8" => "NOVO TEMPO",
    "38" => "SHOPTIME", "8E" => "TNT SERIES", "91" => "VH1 MEGA HITS",
    // --- ADULTOS ---
    "C0" => "PLAYBOY", "C1" => "SEXHOT", "9E" => "SEXTREME",
    // --- HD ---
    "20A" => "BAND HD", "243" => "BAND NEWS HD", "223" => "BAND SPORTS HD", "28A" => "CANAL BRASIL HD", "266" => "CARTOON HD",
    "28F" => "CINEMAX HD", "2E4" => "PREMIERE COMBATE HD", "2A8" => "COMEDY CENTRAL HD", "253" => "DISCOVERY KIDS HD",
    "268" => "DISCOVERY THEATER HD", "262" => "DISCOVERY TURBO HD", "251" => "DISCOVERY WORLD HD", "217" => "DISCOVERY HOME & HEALTH HD",
    "1DF" => "EPTV HD CAMPINAS", "222" => "ESPN BRASIL HD", "221" => "ESPN HD", "224" => "ESPN+ HD", "216" => "FOOD NETWORK HD",
    "28B" => "FOX LIFE HD", "288" => "FOX PREMIUM 1 HD", "289" => "FOX PREMIUM 2 HD", "225" => "FOX SPORTS 2 HD", "27A" => "FX HD",
    "21C" => "GLOBO NEWS HD", "1CA" => "GLOBO MINHAS HD", "1C6" => "GLOBO RJ HD", "1C7" => "GLOBO SP HD", "1CB" => "GLOBO NORDESTE HD",
    "261" => "H2 HD", "2A3" => "HBO FAMILY HD", "22B" => "ID INVESTIGAÇÃO DISCOVERY HD", "281" => "LIFETIME HD", "2A6" => "MAX HD",
    "2A7" => "MAX PRIME HD", "230" => "MEGAPIX HD", "271" => "VH1 HD", "218" => "VIVA HD", "21F" => "UNIVERSAL CHANNEL HD",
    "1C8" => "TV TEM VERDES MARES HD", "1D8" => "TV TEM BAURU HD", "1D1" => "TV LIBERAL BELEN HD", "1C9" => "TV BAHIA HD",
    "1CC" => "TV ANHANGUERA GOIANIA HD", "283" => "TNT SERIES HD", "29A" => "TELECINE CULT HD", "219" => "SPORT TV 3 HD",
    "25B" => "NIKELODEON HD", "26D" => "MTV HD", "1E0" => "GLOBO BRASILIA HD", "240" => "EI MAXX HD", "237" => "EI MAXX II HD",
    "22A" => "E! HD", "246" => "ANIMAL PLANET HD", "214" => "GLOBALSAT HD", "249" => "AXN HD", "220" => "BIS HD",
    "25C" => "DISCOVERY CHANNEL HD", "258" => "DISCOVERY THEATER HD", "256" => "DISNEY HD", "22C" => "FOX HD", "226" => "FOX SPORT HD",
    "252" => "GLOOB HD", "21D" => "GNT HD", "23A" => "HBO HD", "23C" => "HBO2 HD", "23B" => "HBO PLUS HD", "241" => "HBO SIGNATURE HD",
    "23E" => "MAX HD", "21E" => "MULTISHOW HD", "267" => "NATIONAL GEO WILD HD", "25E" => "NATIONAL GEO HD", "227" => "OFF HD",
    "24B" => "SONY HD", "22F" => "SPACE HD", "21A" => "SPORTV2 HD", "21B" => "SPORTV HD", "27F" => "SPORTV ALTERNATIVO HD",
    "232" => "TELECINE ACTION HD", "234" => "TELECINE FUN HD", "235" => "TELECINE PIPOCA HD", "231" => "TELECINE PREMIUM HD",
    "233" => "TELECINE TOUCH HD", "260" => "THE HISTORY CHANNEL HD", "25F" => "TRAVEL AND LIVING CHANNEL HD", "22E" => "TNT HD",
    "228" => "VH1 HD", "24A" => "WARNER CHANNEL HD", "244" => "PARAMOUNT HD", "2D2" => "PREMIERE 2 HD", "2D3" => "PREMIERE 3 HD",
    "2D4" => "PREMIERE 4 HD", "2D5" => "PREMIERE 5 HD", "2D1" => "PREMIERE CLUBES HD", "1D2" => "RSB TV PORTO ALEGRE HD",
    "1D3" => "REDE AMAZONICA HD", "1D0" => "RPC TV PARANAENCE HD", "2E5" => "BBB HD"
];

$online_users = [];
$erro = "";

// --- 3. CONEXÃO DIRETA COM O CSP ---
$url = "http://{$IP_CSP}:{$PORTA_CSP}/xmlHandler?command=proxy-users";
$auth = base64_encode("{$USUARIO_CSP}:{$SENHA_CSP}");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Basic $auth", "Connection: close"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$xml_bruto = trim(curl_exec($ch));
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_erro = curl_error($ch);
curl_close($ch);

// O SEU PRINT PROVOU QUE DÁ CÓDIGO 200 E QUE O XML CHEGA, MAS SEM A TAG <?xml !
if ($code == 200 || $code == 0) {
    if (!empty($xml_bruto)) {
        libxml_use_internal_errors(true);
        $xml = @simplexml_load_string($xml_bruto); // Lê o XML na força bruta, sem perguntar
        
        if ($xml) {
            foreach ($xml->xpath('//user') as $u) {
                $login = (string)$u['name'];
                
                // Ignora usuários do sistema (incluindo o próprio admin 'kaua' e 'capa')
                if (empty($login) || $login === '*' || in_array(strtolower($login), ['sandisk', 'admin', 'mapa', 'copo', 'kauã', 'kaua', 'capa'])) continue; 

                $sessoes = $u->xpath('.//session');
                $f = !empty($sessoes) ? $sessoes[0] : $u;
                
                $ip_cliente = !empty((string)$f['ip']) ? (string)$f['ip'] : "---";
                $tempo_on = (string)$f['connected'] ?: "0";
                
                // --- CÉREBRO DE NOME DA SUA TELA BRANCA ---
                $canal_assistindo = "Navegando no Menu";
                
                $service_name = (string)$f['service-name'];
                if (empty($service_name)) {
                    $service_name = (string)$f['name'];
                }

                if (!empty($service_name) && strpos(strtolower($service_name), 'unknown') === false && strtolower($service_name) !== 'null') {
                    // Limpa a sujeira do [SD CLARO] e |HD CLARO| que o CSP manda
                    $nome_limpo = preg_replace('/\[.*?\]\s*/', '', $service_name); 
                    $nome_limpo = preg_replace('/\|.*?\|\s*/', '', $nome_limpo);
                    $canal_assistindo = trim($nome_limpo);
                } else {
                    // SE O CSP MANDAR UNKNOWN (COMO O SEU CLIENTE alk06020 NA FOTO), O DICIONÁRIO SALVA A PÁTRIA
                    $service_id = trim((string)$f['service']);
                    if (!empty($service_id) && $service_id !== '0000:0000') {
                        $sid_orig = strtoupper(str_replace('0X', '', $service_id));
                        $sid_clean = ltrim($sid_orig, '0');
                        if (empty($sid_clean)) $sid_clean = '0';
                        
                        $tentativas = [ $sid_orig, $sid_clean, str_pad($sid_clean, 4, '0', STR_PAD_LEFT) ];

                        if (ctype_digit($sid_clean)) {
                            $hex_val = strtoupper(dechex((int)$sid_clean));
                            $tentativas[] = $hex_val;
                            $tentativas[] = str_pad($hex_val, 4, '0', STR_PAD_LEFT);
                        }
                        if (ctype_xdigit($sid_clean)) {
                            $tentativas[] = (string)hexdec($sid_clean);
                        }

                        $achou = false;
                        foreach ($tentativas as $t) {
                            if (isset($dicionario_canais[$t])) {
                                $canal_assistindo = $dicionario_canais[$t];
                                $achou = true;
                                break;
                            }
                        }

                        if (!$achou) {
                            $canal_assistindo = "Canal ID: " . $sid_orig;
                        }
                    }
                }

                // --- CÁLCULO DO TEMPO ---
                $segundos = 0;
                if (is_numeric($tempo_on)) {
                    $segundos = (int)$tempo_on;
                } elseif (strtotime($tempo_on) !== false) {
                    $segundos = time() - strtotime($tempo_on);
                }
                if ($segundos < 0) $segundos = 0;

                $h = floor($segundos / 3600);
                $m = floor(($segundos % 3600) / 60);
                $s = $segundos % 60;
                $tempo_fmt = sprintf("%02d:%02d:%02d", $h, $m, $s);

                $nome_real = $login; $dono_c = '';
                try {
                    $st = $connUser->prepare("SELECT nome, CadUser FROM usuario WHERE usuario = ? UNION SELECT nome, CadUser FROM teste WHERE usuario = ? LIMIT 1");
                    $st->execute([$login, $login]);
                    if ($r = $st->fetch()) { $nome_real = $r['nome']; $dono_c = $r['CadUser']; }
                } catch(Exception $e) {}

                if ($isAdmin || $dono_c === $usuarioLogado) {
                    $online_users[] = ['nome'=>$nome_real, 'login'=>$login, 'ip'=>$ip_cliente, 'canal'=>$canal_assistindo, 'tempo'=>$tempo_fmt, 'segundos'=>$segundos];
                }
            }
        } else {
            $erro = "O servidor CSP não retornou as tags XML de forma válida.";
        }
    } else {
        $erro = "A conexão deu certo, mas o CSP não enviou dados em branco.";
    }
} else {
    $erro = "Erro ao conectar no CSP. Código: {$code}. Causa: {$curl_erro}";
}

// Resposta AJAX
if (isset($_GET['ajax'])) {
    if (!empty($erro)) {
        echo '<tr><td colspan="5" class="text-center py-5 text-danger fw-bold"><i class="fas fa-exclamation-triangle"></i> ' . htmlspecialchars($erro) . '</td></tr>';
    } elseif (empty($online_users)) {
        echo '<tr><td colspan="5" class="text-center py-5 text-muted">Nenhum receptor ativo no momento.</td></tr>';
    } else {
        foreach($online_users as $u) {
            echo '<tr>
                <td class="nome-destaque"><span class="dot-online"></span>'.htmlspecialchars($u['nome']).'</td>
                <td class="text-info">'.htmlspecialchars($u['login']).'</td>
                <td class="font-monospace opacity-75">'.htmlspecialchars($u['ip']).'</td>
                <td class="text-warning fw-bold"><i class="fas fa-tv me-1 small"></i> '.htmlspecialchars($u['canal']).'</td>
                <td class="text-end text-success fw-bold tempo-online" data-segundos="'.$u['segundos'].'">'.$u['tempo'].'</td>
            </tr>';
        }
    }
    exit;
}
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Monitor Online | <?= htmlspecialchars($nomePainel) ?></title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <style>
        :root { --primary: <?= $corPrimaria ?>; --bg-body: #151521; --bg-card: #1e1e2d; --text-color: #d0d2d6; --border-color: #2b2b40; }
        body { background-color: var(--bg-body); color: var(--text-color); font-family: 'Segoe UI', sans-serif; overflow-x: hidden; margin: 0; }
        .sidebar { width: 260px; height: 100vh; position: fixed; background: var(--bg-card); border-right: 1px solid #333; z-index: 1050; padding: 20px; overflow-y: auto; transition: 0.3s;}
        .nav-link { color: #a6a6b7; padding: 12px 15px; border-radius: 8px; display: flex; align-items: center; gap: 12px; text-decoration: none; margin-bottom: 5px; font-weight: 500; transition: 0.2s;}
        .nav-link:hover, .nav-link.active { background: var(--primary); color: #fff; box-shadow: 0 4px 15px rgba(0,0,0,0.2); }
        .main-content { margin-left: 260px; transition: 0.3s; min-height: 100vh; }
        .top-header { background: linear-gradient(90deg, var(--bg-card) 0%, var(--primary) 100%); padding: 15px 30px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid rgba(255,255,255,0.1); }
        .card-monitor { background: var(--bg-card); border: 1px solid var(--border-color); border-radius: 15px; overflow: hidden; }
        .table-online { width: 100%; white-space: nowrap; border-collapse: collapse; }
        .table-online th, .table-online td { padding: 12px; font-size: 0.85rem; border-bottom: 1px solid var(--border-color); vertical-align: middle; }
        .nome-destaque { color: #ffffff; font-weight: 700; }
        .dot-online { width: 8px; height: 8px; background: #28c76f; border-radius: 50%; display: inline-block; margin-right: 8px; box-shadow: 0 0 5px #28c76f; }
        @media (max-width: 992px) { .sidebar { display:none; } .main-content { margin-left: 0; } }
    </style>
</head>
<body>

<nav class="sidebar">
    <div class="text-center mb-4"><h4 class="fw-bold text-white"><?= htmlspecialchars($nomePainel) ?></h4></div>
    <div class="nav flex-column">
        <a href="index.php" class="nav-link"><i class="fas fa-home"></i> Dashboard</a>
        <?php if ($isAdmin): ?>
            <div class="nav-group-title mt-3 mb-2 small text-muted fw-bold">ADMINISTRATIVO</div>
            <a href="gerenciar_perfis.php" class="nav-link"><i class="fas fa-layer-group"></i> Perfis</a>
            <a href="gerenciar_dns.php" class="nav-link"><i class="fas fa-network-wired"></i> Servidores DNS</a>
            <a href="gerenciar_admins.php" class="nav-link"><i class="fas fa-user-shield"></i> Equipe Admins</a>
            <a href="personalizar_painel.php" class="nav-link"><i class="fas fa-paint-brush"></i> Personalizar</a>
            <a href="config_geral.php" class="nav-link"><i class="fas fa-cogs"></i> Configurações</a>
            <a href="gerenciar_ips.php" class="nav-link"><i class="fas fa-shield-halved"></i> Firewall IPs</a>
            <a href="gerenciar_backups.php" class="nav-link"><i class="fas fa-database"></i> Backup</a>
            <a href="ferramentas_migracao.php" class="nav-link"><i class="fas fa-exchange-alt"></i> Exportar/Importar</a>
        <?php endif; ?>
        <div class="nav-group-title mt-3 mb-2 small text-muted fw-bold">MENU</div>
        <a href="revendedores.php" class="nav-link"><i class="fas fa-store"></i> Revendedores</a>
        <a href="clientes.php" class="nav-link"><i class="fas fa-users"></i> Clientes</a>
        <a href="testes.php" class="nav-link"><i class="fas fa-stopwatch"></i> Testes</a>
        <a href="monitor.php" class="nav-link active"><i class="fas fa-wifi"></i> Monitor Online</a>
        <a href="config_mp_revenda.php" class="nav-link"><i class="fas fa-wallet"></i> Pagamento</a>
        <a href="gerenciar_planos.php" class="nav-link"><i class="fas fa-tags"></i> Planos</a>
        <a href="gerenciar_email.php" class="nav-link"><i class="fas fa-envelope"></i> SMTP Email</a>
        <a href="suporte.php" class="nav-link"><i class="fas fa-headset"></i> Suporte / Mensagens</a>
        <a href="enviar_circular.php" class="nav-link"><i class="fas fa-paper-plane"></i> Enviar Circular</a>
        <a href="gerador_robo.php" class="nav-link"><i class="fas fa-robot"></i> WhatsAuto</a>
        <a href="sair.php" class="nav-link text-danger mt-4"><i class="fas fa-sign-out-alt"></i> Sair</a>
    </div>
</nav>

<main class="main-content">
    <div class="top-header">
        <div class="header-title text-white fw-bold">MONITORAMENTO REALTIME</div>
        <button onclick="location.reload()" class="btn btn-sm btn-outline-light rounded-pill"><i class="fas fa-sync"></i> Recarregar</button>
    </div>

    <div class="container-fluid p-4">
        <?php if($erro): ?>
            <div class="alert alert-danger border-0 shadow-sm fw-bold">
                <i class="fas fa-exclamation-triangle me-2"></i> <?= htmlspecialchars($erro) ?>
            </div>
        <?php endif; ?>

        <div class="card card-monitor p-4 shadow">
            <div class="d-flex justify-content-between mb-4">
                <h5 class="fw-bold text-white"><i class="fas fa-broadcast-tower text-primary me-2"></i> Canais Ativos</h5>
                <span class="badge bg-success px-3 py-2 rounded-pill" id="badge-online"><?= count($online_users) ?> Dispositivos</span>
            </div>
            <div class="table-responsive">
                <table class="table-online">
                    <thead><tr><th>NOME DO CLIENTE</th><th>USUÁRIO</th><th>IP</th><th>CANAL</th><th class="text-end">TEMPO</th></tr></thead>
                    <tbody id="tabela-corpo">
                        <?php if(!empty($erro)): ?>
                            <tr><td colspan="5" class="text-center py-5 text-danger fw-bold"><i class="fas fa-exclamation-triangle"></i> <?= htmlspecialchars($erro) ?></td></tr>
                        <?php elseif(empty($online_users)): ?>
                            <tr><td colspan="5" class="text-center py-5 text-muted">Nenhum receptor ativo no momento.</td></tr>
                        <?php else: foreach($online_users as $u): ?>
                            <tr>
                                <td class="nome-destaque"><span class="dot-online"></span><?= htmlspecialchars($u['nome']) ?></td>
                                <td class="text-info"><?= htmlspecialchars($u['login']) ?></td>
                                <td class="font-monospace opacity-75"><?= htmlspecialchars($u['ip']) ?></td>
                                <td class="text-warning fw-bold"><i class="fas fa-tv me-1"></i> <?= htmlspecialchars($u['canal']) ?></td>
                                <td class="text-end text-success fw-bold tempo-online" data-segundos="<?= $u['segundos'] ?>"><?= $u['tempo'] ?></td>
                            </tr>
                        <?php endforeach; endif; ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</main>

<script>
    setInterval(() => {
        document.querySelectorAll('.tempo-online').forEach(e => {
            let s = parseInt(e.getAttribute('data-segundos')) + 1;
            e.setAttribute('data-segundos', s);
            let h = Math.floor(s/3600).toString().padStart(2,'0');
            let m = Math.floor((s%3600)/60).toString().padStart(2,'0');
            let sec = (s%60).toString().padStart(2,'0');
            e.innerText = h + ':' + m + ':' + sec;
        });
    }, 1000);

    setInterval(() => {
        fetch('monitor.php?ajax=1').then(r => r.text()).then(html => {
            document.getElementById('tabela-corpo').innerHTML = html;
            let rows = document.querySelectorAll('#tabela-corpo tr');
            let count = (rows.length === 1 && (rows[0].innerText.includes('Nenhum') || rows[0].innerText.includes('XML') || rows[0].innerText.includes('Retorno'))) ? 0 : rows.length;
            document.getElementById('badge-online').innerText = count + ' Dispositivos';
        });
    }, 5000);
</script>
</body>
</html>
