<?php
session_start();
require_once 'conexao.php';

// --- 1. SEGURANÇA: APENAS ADMIN ---
if (!isset($_SESSION['logado']) || $_SESSION['nivel'] !== 'admin') {
    header("Location: index.php"); 
    exit;
}

$isAdmin = true;
$usuarioLogado = $_SESSION['usuario'];
$msg = ""; $msg_tipo = "";

// --- 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) { }


// --- 3. CORREÇÃO DO MENU LATERAL (MENSAGENS NÃO LIDAS) ---
$total_msg_nao_lidas = 0;
try {
    $stmtMsg = $connUser->prepare("SELECT COUNT(*) FROM chamados_suporte WHERE destinatario = ? AND lida = 'nao'");
    $stmtMsg->execute([$usuarioLogado]);
    $total_msg_nao_lidas = $stmtMsg->fetchColumn();
} catch (Exception $e) { }





// =========================================================================================
// FUNÇÃO MESTRE 4.0: MODO RAIO-X (SONAR)
// =========================================================================================
function editarXML_CSP($ip, $acao, $dadosCSP) {
    if (empty($ip)) return "O IP fornecido está vazio.";
    
    // Limpeza rigorosa da URL base
    $IP_CSP = trim($dadosCSP['url']);
    $IP_CSP = str_replace(['http://', 'https://'], '', $IP_CSP); 
    $IP_CSP = rtrim(explode('/', $IP_CSP)[0], '/');
    $PORTA_CSP = trim($dadosCSP['porta']);
    
    $USUARIO_CSP = trim($dadosCSP['usuario']);
    $SENHA_CSP = trim($dadosCSP['senha']);
    
    $url_base = "http://{$IP_CSP}:{$PORTA_CSP}";

    // PASSO 1: Acessa a raiz para descobrir o link verdadeiro da aba Config
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url_base . "/");
    curl_setopt($ch, CURLOPT_USERPWD, "$USUARIO_CSP:$SENHA_CSP");
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); // Aceita qualquer tipo de auth da CSP
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $html_main = curl_exec($ch);
    curl_close($ch);

    // Caçador de Links Inteligente
    $config_path = "config"; 
    if ($html_main && preg_match('/<a[^>]+href=["\']([^"\'>]+)["\'][^>]*>.*?Config.*?<\/a>/is', $html_main, $m)) {
        $config_path = trim($m[1]);
    }
    
    $url_config = rtrim($url_base, '/') . '/' . ltrim($config_path, '/');

    // PASSO 2: Acessa a página da Configuração exata
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url_config);
    curl_setopt($ch, CURLOPT_USERPWD, "$USUARIO_CSP:$SENHA_CSP");
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $html_config = curl_exec($ch);
    $httpcode_config = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpcode_config != 200) {
        return "A CSP negou acesso à aba $config_path. HTTP Code: $httpcode_config. O usuário admin da CSP tem permissão para editar arquivos?";
    }

    // PASSO 3: MODO RAIO-X (Extrai o Textarea ou acusa o erro com texto da CSP)
    if (!preg_match('/<textarea[^>]*name=["\']?([^"\'\s>]+)["\']?[^>]*>(.*?)<\/textarea>/is', $html_config, $matches)) {
        // Se falhar, pega o que a página respondeu e joga na tela pra gente ver!
        $texto_csp = htmlspecialchars(substr(trim(strip_tags($html_config)), 0, 200));
        return "FALHA: A página [$url_config] carregou, mas a caixa do XML não estava lá. O servidor respondeu: [$texto_csp...]";
    }
    
    $textarea_name = $matches[1];
    $xml_content = htmlspecialchars_decode($matches[2], ENT_QUOTES);

    if (strpos($xml_content, '<cardserv-proxy') === false) {
        return "O texto extraído não é um XML válido. A CSP pode estar bloqueando a leitura completa.";
    }

    // PASSO 4: Injeta ou Remove o IP da lista Negra
    if (strpos($xml_content, '<default-deny-list>') === false) {
         if (strpos($xml_content, '<ca-profiles>') !== false) {
             $xml_content = preg_replace('/<ca-profiles>/i', "<ca-profiles>\n        <default-deny-list></default-deny-list>", $xml_content, 1);
         } else {
             return "Tag <ca-profiles> não encontrada no XML. O arquivo parece incompleto.";
         }
    }

    if (preg_match('/<default-deny-list>(.*?)<\/default-deny-list>/is', $xml_content, $m)) {
        $lista_ips = $m[1];
        $lista_ips = preg_replace('/\b' . preg_quote($ip, '/') . '\b/', '', $lista_ips); // Remove limpo
        
        if ($acao === 'adicionar') {
            $lista_ips .= ' ' . $ip; // Adiciona o IP alvo
        }
        
        $lista_ips = trim(preg_replace('/\s+/', ' ', $lista_ips)); // Limpa lixo
        $xml_content = preg_replace('/<default-deny-list>.*?<\/default-deny-list>/is', "<default-deny-list>$lista_ips</default-deny-list>", $xml_content, 1);
    }

    // PASSO 5: Acha os botões de envio dinamicamente
    $action_url = $url_config;
    if (preg_match('/<form[^>]+action=["\']([^"\']+)["\']/i', $html_config, $f_match)) {
        $f_action = trim($f_match[1]);
        if (strpos($f_action, 'http') === 0) {
            $action_url = $f_action;
        } else {
            $action_url = rtrim($url_base, '/') . '/' . ltrim($f_action, '/');
        }
    }

    $btn_name = 'action'; $btn_value = 'Save';
    if (preg_match('/<input[^>]+type=["\']submit["\'][^>]+name=["\']([^"\']+)["\'][^>]*value=["\']([^"\']+)["\']/i', $html_config, $btn)) {
        $btn_name = $btn[1]; $btn_value = $btn[2];
    }

    $post_data = [
        $textarea_name => $xml_content,
        $btn_name => $btn_value
    ];

    // PASSO 6: Salva as alterações na CSP
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $action_url);
    curl_setopt($ch, CURLOPT_USERPWD, "$USUARIO_CSP:$SENHA_CSP");
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($ch, CURLOPT_REFERER, $url_config); // Drible anti-bot
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $resp = curl_exec($ch);
    $httpcode_save = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($httpcode_save >= 200 && $httpcode_save < 400) {
        return true; // SUCESSO ABSOLUTO
    } else {
        return "Erro ao salvar! A CSP bloqueou o envio final. Código HTTP: $httpcode_save";
    }
}
// =========================================================================================


// --- 3. AÇÕES DO PAINEL ---
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
    // --- ADICIONADO: Desbloquear IP do Sistema de Teste Automático ---
    if (isset($_POST['acao']) && $_POST['acao'] === 'desbloquear_teste') {
        $id_ip_teste = (int)$_POST['id_teste'];
        try {
            $connUser->prepare("DELETE FROM ip_bloqueados_teste WHERE id = ?")->execute([$id_ip_teste]);
            $msg = "IP removido da lista negra do Teste Automático com sucesso!";
            $msg_tipo = "success";
        } catch (Exception $e) {
            $msg = "Erro: " . $e->getMessage();
            $msg_tipo = "danger";
        }
    }

    // Desbloquear Firewall Padrão (Remove do Painel e Limpa da CSP)
    if (isset($_POST['acao']) && $_POST['acao'] === 'desbloquear') {
        $id_firewall = (int)$_POST['id'];
        try {
            $stmt_ip = $connUser->prepare("SELECT ip FROM firewall WHERE id = ?");
            $stmt_ip->execute([$id_firewall]);
            $row_ip = $stmt_ip->fetch(PDO::FETCH_ASSOC);
            
            if ($row_ip) {
                $ip_remover = trim($row_ip['ip']);
                
                $dadosCSP = $connGeral->query("SELECT url, porta, usuario, senha FROM painel LIMIT 1")->fetch(PDO::FETCH_ASSOC);
                $resp_csp = "Ignorado.";
                if ($dadosCSP) {
                    $resultado = editarXML_CSP($ip_remover, 'remover', $dadosCSP);
                    $resp_csp = ($resultado === true) ? "IP limpo do XML da CSP." : "Erro na CSP: $resultado";
                }
                
                $connUser->prepare("DELETE FROM firewall WHERE id = ?")->execute([$id_firewall]);
                $msg = "IP Desbloqueado! Painel [OK] | CSP: [$resp_csp]";
                $msg_tipo = "success";
            }
        } catch (Exception $e) {
            $msg = "Erro: " . $e->getMessage();
            $msg_tipo = "danger";
        }
    }
    
    // Limpar Histórico
    if (isset($_POST['acao']) && $_POST['acao'] === 'limpar_historico') {
        $connUser->query("DELETE FROM firewall WHERE bloqueado = 'nao'");
        $msg = "Histórico limpo!";
        $msg_tipo = "primary";
    }

    // Bloquear Manualmente + Derrubar VPS (KICK) + Injetar no XML
    if (isset($_POST['acao']) && $_POST['acao'] === 'bloquear_manual') {
        $ip_manual = trim($_POST['ip']);
        
        if (filter_var($ip_manual, FILTER_VALIDATE_IP)) {
            try {
                // 1. Salva no Banco de Dados local do Painel
                $chk = $connUser->prepare("SELECT id FROM firewall WHERE ip = ?");
                $chk->execute([$ip_manual]);
                if ($chk->rowCount() > 0) {
                    $connUser->prepare("UPDATE firewall SET bloqueado = 'sim', tentativas = 99, data_bloqueio = NOW(), usuario = 'Bloqueio Manual' WHERE ip = ?")->execute([$ip_manual]);
                } else {
                    $connUser->prepare("INSERT INTO firewall (ip, usuario, tentativas, bloqueado, data_bloqueio) VALUES (?, 'Bloqueio Manual', 99, 'sim', NOW())")->execute([$ip_manual]);
                }
                
                $kick_realizado = false;
                $xml_status = "Servidor CSP não configurado no painel.";
                
                $dadosCSP = $connGeral->query("SELECT url, porta, usuario, senha FROM painel LIMIT 1")->fetch(PDO::FETCH_ASSOC);
                if ($dadosCSP) {
                    $IP_CSP = trim($dadosCSP['url']);
                    $IP_CSP = str_replace(['http://', 'https://'], '', $IP_CSP); 
                    $IP_CSP = rtrim(explode('/', $IP_CSP)[0], '/');
                    $PORTA_CSP = trim($dadosCSP['porta']);
                    
                    $USUARIO_CSP = trim($dadosCSP['usuario']);
                    $SENHA_CSP = trim($dadosCSP['senha']);
                    
                    // 2. Derruba conexões da memória ativas no momento (SNIPER KICK)
                    $url_users = "http://{$IP_CSP}:{$PORTA_CSP}/xmlHandler?command=proxy-users";
                    $ch = curl_init();
                    curl_setopt($ch, CURLOPT_URL, $url_users);
                    curl_setopt($ch, CURLOPT_USERPWD, "$USUARIO_CSP:$SENHA_CSP");
                    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
                    $xml_bruto = curl_exec($ch);
                    curl_close($ch);

                    if (!empty($xml_bruto)) {
                        libxml_use_internal_errors(true);
                        $xml = @simplexml_load_string($xml_bruto);
                        if ($xml) {
                            foreach ($xml->xpath('//user') as $u) {
                                $login = (string)$u['name'];
                                foreach ($u->xpath('.//session') as $f) {
                                    $ip_cliente = (string)$f['host'] ?: (string)$f['ip'] ?: "";
                                    
                                    if ($ip_cliente === $ip_manual) {
                                        // O TIRO DE KICK NA CSP 
                                        $kick_url = "http://{$IP_CSP}:{$PORTA_CSP}/xmlHandler?command=kick-user&name=" . urlencode($login);
                                        $chk = curl_init();
                                        curl_setopt($chk, CURLOPT_URL, $kick_url);
                                        curl_setopt($chk, CURLOPT_USERPWD, "$USUARIO_CSP:$SENHA_CSP");
                                        curl_setopt($chk, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
                                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                                        curl_setopt($chk, CURLOPT_TIMEOUT, 2);
                                        curl_exec($chk);
                                        curl_close($chk);
                                        $kick_realizado = true;
                                    }
                                }
                            }
                        }
                    }
                    
                    // 3. Injeta o IP na Aba Config XML da CSP permanentemente
                    $resultado_xml = editarXML_CSP($ip_manual, 'adicionar', $dadosCSP);
                    $xml_status = ($resultado_xml === true) ? "<strong class='text-success'>[INJETADO COM SUCESSO]</strong>" : "<strong class='text-danger'>$resultado_xml</strong>";
                }

                $txt_kick = $kick_realizado ? "Conexão derrubada da Memória (KICK)." : "O IP não possuía conexão ativa neste exato momento.";
                
                // MENSAGEM FINAL PARA O USUÁRIO
                $msg = "Ação contra o IP ($ip_manual) Concluída. <br> ESTADO KICK: $txt_kick <br> ARQUIVO CSP: $xml_status";
                $msg_tipo = ($resultado_xml === true) ? "success" : "warning";
                
            } catch (Exception $e) {
                $msg = "Erro grave no sistema: " . $e->getMessage();
                $msg_tipo = "danger";
            }
        } else {
            $msg = "Formato de IP inválido. Tente novamente.";
            $msg_tipo = "warning";
        }
    }
}

// --- 4. LISTAGEM FIREWALL GERAL ---
$lista_ips = [];
try {
    $lista_ips = $connUser->query("SELECT * FROM firewall ORDER BY bloqueado DESC, data_bloqueio DESC")->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e) {}

// --- 5. ADICIONADO: LISTAGEM FIREWALL DO TESTE AUTOMÁTICO ---
$lista_ips_teste = [];
try {
    $lista_ips_teste = $connUser->query("SELECT * FROM ip_bloqueados_teste ORDER BY data_bloqueio DESC")->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e) {}
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>

<?php include 'tema_global.php'; ?>



    <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Firewall IPs | <?= 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; padding: 0; }
        
        /* Sidebar Estilo IPTV */
        .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); }
        .nav-group-title { font-size: 0.75rem; text-transform: uppercase; color: #5e5873; font-weight: 700; margin: 25px 0 10px 12px; letter-spacing: 1px; }
        
        /* Layout */
        .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); flex-wrap: wrap; gap: 15px; }
        .header-title { font-size: 1.3rem; font-weight: 800; color: #fff; text-transform: uppercase; letter-spacing: 1px; margin: 0; }

        @media (max-width: 992px) { 
            .sidebar { transform: translateX(-100%); } 
            .sidebar.show { transform: translateX(0); } 
            .main-content { margin-left: 0; } 
            .mobile-toggle { display: block !important; margin-right: 15px; } 
            .action-buttons { width: 100%; display: flex; justify-content: space-between; }
        }

        .mobile-toggle { display: none; background: none; border: none; color: #fff; font-size: 1.5rem; }
        .overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.5); z-index: 1040; }
        .overlay.show { display: block; }
        
        .card-custom { background: var(--bg-card) !important; border: 1px solid var(--border-color); border-radius: 12px; overflow: hidden; }
        .table-custom { width: 100%; border-collapse: collapse; }
        .table-custom th { background-color: rgba(0,0,0,0.2); color: #b9b9c3; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; padding: 15px; border-bottom: 1px solid var(--border-color); }
        .table-custom td { padding: 15px; border-bottom: 1px solid var(--border-color); vertical-align: middle; color: #fff; }
        
        .btn-unlock { background: rgba(40, 199, 111, 0.2); color: #28c76f; border: 1px solid rgba(40, 199, 111, 0.2); padding: 5px 12px; border-radius: 5px; font-weight: bold; transition: 0.2s; font-size: 0.8rem; }
        .btn-unlock:hover { background: #28c76f; color: #fff; }
        
        .status-blocked { color: #ea5455; font-weight: bold; background: rgba(234, 84, 85, 0.1); padding: 4px 10px; border-radius: 4px; font-size: 0.75rem; }
        .status-risk { color: #ff9f43; font-weight: bold; font-size: 0.75rem; }
    </style>
</head>
<body>
<?php include 'menu.php'; ?>


<main class="main-content">
    <div class="top-header">
        <div class="d-flex align-items-center">
            <button class="mobile-toggle" onclick="toggleMenu()"><i class="fas fa-bars"></i></button>
            <h1 class="header-title">Firewall de Segurança</h1>
        </div>
        
        <div class="d-flex gap-2 action-buttons">
            <button class="btn btn-danger btn-sm fw-bold rounded-pill px-3 shadow-sm" data-bs-toggle="modal" data-bs-target="#modalBloquearIP">
                <i class="fas fa-ban me-1"></i> BLOQUEAR IP
            </button>
            <form method="POST" onsubmit="return confirm('Limpar histórico de IPs não bloqueados?')" class="m-0">
                <input type="hidden" name="acao" value="limpar_historico">
                <button class="btn btn-outline-light btn-sm fw-bold rounded-pill px-3"><i class="fas fa-broom me-1"></i> LIMPAR LOGS</button>
            </form>
        </div>
    </div>

    <div class="container-fluid p-3 p-md-4">
        
        <?php if($msg): ?>
            <div class="alert alert-<?= $msg_tipo ?> alert-dismissible fade show border-0 shadow-sm mb-4">
                <?= $msg ?>
                <button class="btn-close" data-bs-dismiss="alert"></button>
            </div>
        <?php endif; ?>

        <h5 class="text-white fw-bold mb-3"><i class="fas fa-server text-primary me-2"></i> Firewall Principal (Painel & CSP)</h5>
        <div class="card card-custom shadow-lg mb-5">
            <div class="table-responsive">
                <table class="table-custom">
                    <thead>
                        <tr>
                            <th class="ps-4">Endereço IP</th>
                            <th>Tentativa de Login</th>
                            <th class="text-center">Tentativas</th>
                            <th>Status</th>
                            <th>Data do Evento</th>
                            <th class="text-end pe-4">Ação</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php if(count($lista_ips) > 0): ?>
                            <?php foreach($lista_ips as $row): 
                                $isBlock = ($row['bloqueado'] === 'sim');
                            ?>
                            <tr>
                                <td class="fw-bold font-monospace text-info ps-4"><?= htmlspecialchars($row['ip']) ?></td>
                                <td>
                                    <span class="fw-bold text-white"><?= htmlspecialchars($row['usuario']) ?></span>
                                </td>
                                <td class="text-center">
                                    <span class="badge rounded-pill <?= $isBlock ? 'bg-danger' : 'bg-warning text-dark' ?>">
                                        <?= $row['tentativas'] ?>
                                    </span>
                                </td>
                                <td>
                                    <?php if($isBlock): ?>
                                        <span class="status-blocked"><i class="fas fa-ban me-1"></i> BLOQUEADO</span>
                                    <?php else: ?>
                                        <span class="status-risk"><i class="fas fa-exclamation-triangle me-1"></i> EM RISCO</span>
                                    <?php endif; ?>
                                </td>
                                <td class="small text-white-50"><?= date('d/m/Y H:i:s', strtotime($row['data_bloqueio'])) ?></td>
                                <td class="text-end pe-4">
                                    <?php if($isBlock): ?>
                                        <form method="POST" class="d-inline">
                                            <input type="hidden" name="acao" value="desbloquear">
                                            <input type="hidden" name="id" value="<?= $row['id'] ?>">
                                            <button type="submit" class="btn-unlock shadow-sm">
                                                <i class="fas fa-unlock-alt me-1"></i> LIBERAR
                                            </button>
                                        </form>
                                    <?php else: ?>
                                        <span class="text-white-50 small">Monitorando</span>
                                    <?php endif; ?>
                                </td>
                            </tr>
                            <?php endforeach; ?>
                        <?php else: ?>
                            <tr>
                                <td colspan="6" class="text-center py-4 text-muted">
                                    <i class="fas fa-shield-halved fa-2x mb-2 text-primary opacity-25"></i><br>
                                    Nenhum bloqueio registrado no Firewall Principal.
                                </td>
                            </tr>
                        <?php endif; ?>
                    </tbody>
                </table>
            </div>
        </div>

        <h5 class="text-white fw-bold mb-3"><i class="fas fa-robot text-warning me-2"></i> Lista Negra do Teste Automático</h5>
        <div class="card card-custom shadow-lg">
            <div class="table-responsive">
                <table class="table-custom">
                    <thead>
                        <tr>
                            <th class="ps-4">Endereço IP Fraudulento</th>
                            <th>Motivo do Bloqueio</th>
                            <th>Data do Banimento</th>
                            <th class="text-end pe-4">Ação</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php if(count($lista_ips_teste) > 0): ?>
                            <?php foreach($lista_ips_teste as $rowTeste): ?>
                            <tr>
                                <td class="fw-bold font-monospace text-danger ps-4"><?= htmlspecialchars($rowTeste['ip']) ?></td>
                                <td>
                                    <span class="text-white-50 small"><?= htmlspecialchars($rowTeste['motivo']) ?></span>
                                </td>
                                <td class="small text-white-50"><?= date('d/m/Y H:i:s', strtotime($rowTeste['data_bloqueio'])) ?></td>
                                <td class="text-end pe-4">
                                    <form method="POST" class="d-inline">
                                        <input type="hidden" name="acao" value="desbloquear_teste">
                                        <input type="hidden" name="id_teste" value="<?= $rowTeste['id'] ?>">
                                        <button type="submit" class="btn-unlock shadow-sm">
                                            <i class="fas fa-unlock-alt me-1"></i> LIBERAR IP
                                        </button>
                                    </form>
                                </td>
                            </tr>
                            <?php endforeach; ?>
                        <?php else: ?>
                            <tr>
                                <td colspan="4" class="text-center py-4 text-muted">
                                    <i class="fas fa-check-circle fa-2x mb-2 text-success opacity-25"></i><br>
                                    Nenhum abuso detectado no sistema de Teste Automático.
                                </td>
                            </tr>
                        <?php endif; ?>
                    </tbody>
                </table>
            </div>
        </div>

    </div>
</main>

<div class="modal fade" id="modalBloquearIP" tabindex="-1">
    <div class="modal-dialog modal-dialog-centered">
        <div class="modal-content bg-dark border-secondary text-white shadow-lg">
            <form method="POST">
                <input type="hidden" name="acao" value="bloquear_manual">
                <div class="modal-header border-secondary">
                    <h5 class="modal-title fw-bold"><i class="fas fa-shield-halved text-danger me-2"></i>Bloquear IP na CSP</h5>
                    <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
                </div>
                <div class="modal-body p-4">
                    <div class="mb-3">
                        <label class="form-label fw-bold text-uppercase" style="font-size: 0.8rem; color: #b9b9c3;">Endereço de IP Invasor</label>
                        <input type="text" name="ip" class="form-control text-white border-secondary" style="background: #2b2b40; height: 50px;" placeholder="Ex: 192.168.0.1" required>
                    </div>
                    <div class="p-3 mt-4" style="background: rgba(234, 84, 85, 0.1); border: 1px dashed #ea5455; border-radius: 8px;">
                        <p class="text-danger small mb-0 fw-bold"><i class="fas fa-crosshairs me-1"></i> MODO SNIPER ATIVADO:</p>
                        <p class="text-white-50 small mb-0 mt-1">Ao confirmar, o sistema irá injetar este IP na <strong class="text-white">Deny-List da CSP</strong>. Se a VPS estiver online sugando conexões neste momento, ela será derrubada automaticamente.</p>
                    </div>
                </div>
                <div class="modal-footer border-secondary">
                    <button type="button" class="btn btn-secondary fw-bold" data-bs-dismiss="modal">CANCELAR</button>
                    <button type="submit" class="btn btn-danger fw-bold px-4">DERRUBAR CONEXÃO</button>
                </div>
            </form>
        </div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
    function toggleMenu() { 
        document.getElementById('sidebar').classList.toggle('show'); 
        document.getElementById('overlay').classList.toggle('show'); 
    }
</script>
</body>
</html>
