<?php
/**
 * GESTOR CYBER - Painel Administrativo Completo
 * Acesso: admin e revendedores (com permissões distintas)
 */

define('GESTOR_CYBER', true);
define('DB_FILE', __DIR__ . '/database.json');

session_start();

// ─── Verificação de sessão ─────────────────────────────────────────────────────
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
    header('Location: index.php');
    exit;
}

$role     = $_SESSION['role'] ?? '';
$is_admin = ($role === 'admin');
$uid      = $_SESSION['user_id'] ?? '';

// ─── Funções BD ────────────────────────────────────────────────────────────────
function db_read(): array {
    if (!file_exists(DB_FILE)) return [];
    return json_decode(file_get_contents(DB_FILE), true) ?? [];
}

function db_write(array $data): void {
    file_put_contents(DB_FILE, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}

function gen_id(string $prefix = ''): string {
    return $prefix . bin2hex(random_bytes(6));
}

function hash_pass(string $p): string {
    return hash('sha256', $p);
}

function add_days(int $days, ?string $from = null): string {
    $base = $from ? strtotime($from) : time();
    if ($base < time()) $base = time(); // renova a partir de hoje se vencido
    return date('Y-m-d H:i:s', $base + ($days * 86400));
}

// ─── Processamento de POST ─────────────────────────────────────────────────────
$msg = '';
$msg_type = 'success';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $db  = db_read();
    $act = $_POST['action'] ?? '';

    // ══ ADMIN ONLY ACTIONS ═══════════════════════════════════════════════════

    if ($is_admin) {

        // ── Salvar configurações gerais ──────────────────────────────────────
        if ($act === 'save_config') {
            $db['config']['panel_name'] = trim($_POST['panel_name'] ?? 'GESTOR CYBER');
            $db['config']['whatsapp']   = preg_replace('/\D/', '', $_POST['whatsapp'] ?? '');
            $db['config']['test_duration_hours'] = (int)($_POST['test_duration_hours'] ?? 24);
            $db['config']['trust_renewal_days']  = (int)($_POST['trust_renewal_days'] ?? 2);

            // Upload de logo
            if (!empty($_FILES['logo']['tmp_name'])) {
                $ext   = strtolower(pathinfo($_FILES['logo']['name'], PATHINFO_EXTENSION));
                $valid = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'];
                if (in_array($ext, $valid)) {
                    $dest = __DIR__ . '/logo.' . $ext;
                    if (move_uploaded_file($_FILES['logo']['tmp_name'], $dest)) {
                        $db['config']['logo'] = 'logo.' . $ext;
                    }
                }
            }

            // Planos
            foreach (['mensal', 'trimestral', 'semestral', 'anual'] as $plan) {
                if (isset($_POST["plan_{$plan}_days"])) {
                    $db['config']['plans'][$plan]['days']  = (int)$_POST["plan_{$plan}_days"];
                    $db['config']['plans'][$plan]['price'] = (float)$_POST["plan_{$plan}_price"];
                }
            }

            db_write($db);
            $msg = 'Configurações salvas com sucesso!';
        }

        // ── Adicionar fonte M3U ──────────────────────────────────────────────
        if ($act === 'add_source') {
            $db['sources'][] = [
                'id'       => gen_id('src_'),
                'name'     => trim($_POST['source_name'] ?? ''),
                'url'      => trim($_POST['source_url'] ?? ''),
                'username' => trim($_POST['source_user'] ?? ''),
                'password' => trim($_POST['source_pass'] ?? ''),
                'status'   => 'active',
                'created_at' => date('Y-m-d H:i:s'),
            ];
            db_write($db);
            $msg = 'Fonte adicionada!';
        }

        // ── Remover fonte ────────────────────────────────────────────────────
        if ($act === 'delete_source') {
            $id = $_POST['source_id'] ?? '';
            $db['sources'] = array_values(array_filter($db['sources'], fn($s) => $s['id'] !== $id));
            db_write($db);
            $msg = 'Fonte removida!';
        }

        // ── Toggle status fonte ──────────────────────────────────────────────
        if ($act === 'toggle_source') {
            $id = $_POST['source_id'] ?? '';
            foreach ($db['sources'] as &$src) {
                if ($src['id'] === $id) {
                    $src['status'] = ($src['status'] === 'active') ? 'inactive' : 'active';
                    break;
                }
            }
            db_write($db);
            $msg = 'Status da fonte alterado!';
        }

        // ── Editar fonte M3U ─────────────────────────────────────────────────
        if ($act === 'edit_source') {
            $id = $_POST['source_id'] ?? '';
            foreach ($db['sources'] as &$src) {
                if ($src['id'] === $id) {
                    $src['name']     = trim($_POST['source_name'] ?? $src['name']);
                    $src['url']      = trim($_POST['source_url']  ?? $src['url']);
                    $src['username'] = trim($_POST['source_user'] ?? $src['username']);
                    if (!empty($_POST['source_pass'])) {
                        $src['password'] = trim($_POST['source_pass']);
                    }
                    // Limpar cache M3U ao editar a fonte
                    $cache = sys_get_temp_dir() . '/gestor_m3u_' . md5($src['url']) . '.cache';
                    if (file_exists($cache)) @unlink($cache);
                    break;
                }
            }
            db_write($db);
            $msg = 'Fonte atualizada com sucesso! Cache limpo.';
        }


        // ── Criar revendedor ─────────────────────────────────────────────────
        if ($act === 'add_reseller') {
            $uname = trim($_POST['res_username'] ?? '');
            $pass  = trim($_POST['res_password'] ?? '');
            // Verificar duplicado
            $exists = array_filter($db['resellers'], fn($r) => $r['username'] === $uname);
            if ($exists) {
                $msg = 'Usuário já existe!'; $msg_type = 'error';
            } elseif (!$uname || !$pass) {
                $msg = 'Preencha todos os campos!'; $msg_type = 'error';
            } else {
                $db['resellers'][] = [
                    'id'       => gen_id('res_'),
                    'username' => $uname,
                    'password' => hash_pass($pass),
                    'name'     => trim($_POST['res_name'] ?? $uname),
                    'credits'  => (int)($_POST['res_credits'] ?? 0),
                    'status'   => 'active',
                    'created_at' => date('Y-m-d H:i:s'),
                ];
                db_write($db);
                $msg = "Revendedor '$uname' criado!";
            }
        }

        // ── Editar créditos do revendedor ─────────────────────────────────────
        if ($act === 'edit_reseller_credits') {
            $id  = $_POST['res_id'] ?? '';
            $op  = $_POST['credit_op'] ?? 'add';
            $amt = (int)($_POST['credit_amount'] ?? 0);
            foreach ($db['resellers'] as &$res) {
                if ($res['id'] === $id) {
                    if ($op === 'add') $res['credits'] += $amt;
                    else $res['credits'] = max(0, $res['credits'] - $amt);
                    break;
                }
            }
            db_write($db);
            $msg = 'Créditos atualizados!';
        }

        // ── Toggle status revendedor ──────────────────────────────────────────
        if ($act === 'toggle_reseller') {
            $id = $_POST['res_id'] ?? '';
            foreach ($db['resellers'] as &$res) {
                if ($res['id'] === $id) {
                    $res['status'] = ($res['status'] === 'active') ? 'blocked' : 'active';
                    break;
                }
            }
            db_write($db);
            $msg = 'Status do revendedor alterado!';
        }

        // ── Deletar revendedor ────────────────────────────────────────────────
        if ($act === 'delete_reseller') {
            $id = $_POST['res_id'] ?? '';
            $db['resellers'] = array_values(array_filter($db['resellers'], fn($r) => $r['id'] !== $id));
            db_write($db);
            $msg = 'Revendedor removido!';
        }
    }

    // ══ SHARED ACTIONS (admin + reseller) ════════════════════════════════════

    // ── Criar cliente ─────────────────────────────────────────────────────────
    if ($act === 'add_client') {
        $uname = preg_replace('/\D/', '', trim($_POST['cli_username'] ?? ''));
        $pass  = preg_replace('/\D/', '', trim($_POST['cli_password'] ?? ''));
        $plan  = $_POST['cli_plan'] ?? 'mensal';
        $db2   = db_read();

        // Verificar se revendedor tem créditos
        if (!$is_admin) {
            $res_found = null;
            foreach ($db2['resellers'] as &$res) {
                if ($res['id'] === $uid) { $res_found = &$res; break; }
            }
            if (!$res_found || $res_found['credits'] < 1) {
                $msg = 'Créditos insuficientes!'; $msg_type = 'error';
                goto end_post;
            }
        }

        // Verificar duplicado
        $exists = array_filter($db2['clients'], fn($c) => $c['username'] === $uname);
        if ($exists) { $msg = 'Usuário já existe!'; $msg_type = 'error'; goto end_post; }
        if (!$uname || !$pass) { $msg = 'Preencha todos os campos com somente números!'; $msg_type = 'error'; goto end_post; }

        $days = (int)($db2['config']['plans'][$plan]['days'] ?? 30);

        $new_client = [
            'id'              => gen_id('cli_'),
            'username'        => $uname,
            'password'        => hash_pass($pass),
            'plain_password'  => $pass,
            'name'            => trim($_POST['cli_name'] ?? $uname),
            'plan'            => $plan,
            'max_connections' => (int)($_POST['cli_connections'] ?? 1),
            'adult_content'   => isset($_POST['cli_adult']) && $_POST['cli_adult'] === '1',
            'status'          => 'active',
            'expires_at'      => add_days($days),
            'owner_id'        => $uid,
            'is_test'         => false,
            'created_at'      => date('Y-m-d H:i:s'),
        ];

        $db2['clients'][] = $new_client;

        // Descontar crédito do revendedor
        if (!$is_admin) {
            foreach ($db2['resellers'] as &$res) {
                if ($res['id'] === $uid) { $res['credits']--; break; }
            }
        }

        db_write($db2);
        $db = $db2;
        $msg = "Cliente '$uname' criado! Vence em: " . date('d/m/Y', strtotime($new_client['expires_at']));
    }

    // ── Criar teste ───────────────────────────────────────────────────────────
    if ($act === 'add_test') {
        $db2      = db_read();
        $hrs      = (int)($db2['config']['test_duration_hours'] ?? 24);
        $cli_name = trim($_POST['test_name'] ?? 'TESTE');
        // Usuário e senha somente números
        $uname = (string)rand(10000000000, 99999999999); // 11 dígitos (formato celular)
        $pass  = (string)rand(10000000, 99999999);       // 8 dígitos

        $db2['clients'][] = [
            'id'              => gen_id('cli_'),
            'username'        => $uname,
            'password'        => hash_pass($pass),
            'plain_password'  => $pass,
            'name'            => 'TESTE - ' . strtoupper($cli_name),
            'plan'            => 'teste',
            'max_connections' => 1,
            'adult_content'   => false,
            'status'          => 'active',
            'expires_at'      => date('Y-m-d H:i:s', time() + ($hrs * 3600)),
            'owner_id'        => $uid,
            'is_test'         => true,
            'created_at'      => date('Y-m-d H:i:s'),
        ];

        db_write($db2);
        $db = $db2;
        $msg = "Teste criado para <strong>$cli_name</strong>! Usuário: <strong>$uname</strong> | Senha: <strong>$pass</strong> | Expira em {$hrs}h";
    }

    // ── Renovar cliente ───────────────────────────────────────────────────────
    if ($act === 'renew_client') {
        $id   = $_POST['cli_id'] ?? '';
        $plan = $_POST['renew_plan'] ?? 'mensal';
        $db2  = db_read();

        if (!$is_admin) {
            $res_found = null;
            foreach ($db2['resellers'] as &$res) {
                if ($res['id'] === $uid) { $res_found = &$res; break; }
            }
            if (!$res_found || $res_found['credits'] < 1) {
                $msg = 'Créditos insuficientes!'; $msg_type = 'error'; goto end_post;
            }
        }

        $days = (int)($db2['config']['plans'][$plan]['days'] ?? 30);
        foreach ($db2['clients'] as &$cli) {
            if ($cli['id'] === $id) {
                $cli['expires_at'] = add_days($days, $cli['expires_at']);
                $cli['plan']       = $plan;
                $cli['status']     = 'active';
                break;
            }
        }

        if (!$is_admin) {
            foreach ($db2['resellers'] as &$res) {
                if ($res['id'] === $uid) { $res['credits']--; break; }
            }
        }

        db_write($db2);
        $db = $db2;
        $msg = 'Cliente renovado com sucesso!';
    }

    // ── Renovação de Confiança ────────────────────────────────────────────────
    if ($act === 'trust_renew') {
        $id  = $_POST['cli_id'] ?? '';
        $db2 = db_read();
        $trust_days = (int)($db2['config']['trust_renewal_days'] ?? 2);
        foreach ($db2['clients'] as &$cli) {
            if ($cli['id'] === $id) {
                // Adicionar dias de confiança a partir de agora
                $base = max(time(), strtotime($cli['expires_at'] ?? 'now'));
                $cli['expires_at'] = date('Y-m-d H:i:s', $base + ($trust_days * 86400));
                $cli['trust_used'] = true;
                break;
            }
        }
        db_write($db2);
        $db = $db2;
        $msg = "Renovação de Confiança aplicada (+{$trust_days} dias)!";
    }

    // ── Toggle status cliente ─────────────────────────────────────────────────
    if ($act === 'toggle_client') {
        $id  = $_POST['cli_id'] ?? '';
        $db2 = db_read();
        foreach ($db2['clients'] as &$cli) {
            if ($cli['id'] === $id) {
                // Reseller só pode operar seus próprios clientes
                if (!$is_admin && ($cli['owner_id'] ?? '') !== $uid) break;
                $cli['status'] = ($cli['status'] === 'active') ? 'blocked' : 'active';
                break;
            }
        }
        db_write($db2);
        $db = $db2;
        $msg = 'Status do cliente alterado!';
    }

    // ── Deletar cliente ───────────────────────────────────────────────────────
    if ($act === 'delete_client') {
        $id  = $_POST['cli_id'] ?? '';
        $db2 = db_read();
        $db2['clients'] = array_values(array_filter(
            $db2['clients'],
            fn($c) => $c['id'] !== $id || (!$is_admin && ($c['owner_id'] ?? '') !== $uid)
        ));
        db_write($db2);
        $db = $db2;
        $msg = 'Cliente removido!';
    }

    // ── Editar cliente ────────────────────────────────────────────────────────
    if ($act === 'edit_client') {
        $id   = $_POST['cli_id'] ?? '';
        $db2  = db_read();
        foreach ($db2['clients'] as &$cli) {
            if ($cli['id'] === $id) {
                if (!$is_admin && ($cli['owner_id'] ?? '') !== $uid) break;
                $cli['name']            = trim($_POST['cli_name'] ?? $cli['name']);
                $cli['max_connections'] = (int)($_POST['cli_connections'] ?? 1);
                $cli['adult_content']   = isset($_POST['cli_adult']) && $_POST['cli_adult'] === '1';
                if (!empty($_POST['cli_password'])) {
                    $new_pass = preg_replace('/\D/', '', $_POST['cli_password']);
                    if ($new_pass) {
                        $cli['password']       = hash_pass($new_pass);
                        $cli['plain_password'] = $new_pass;
                    }
                }
                break;
            }
        }
        db_write($db2);
        $db = $db2;
        $msg = 'Cliente editado com sucesso!';
    }

    end_post:
    // Reload DB for display
    $db = db_read();
}

// ─── Dados para exibição ───────────────────────────────────────────────────────
$db      = db_read();
$config  = $db['config'] ?? [];
$clients = $db['clients'] ?? [];
$sources = $db['sources'] ?? [];
$resellers = $db['resellers'] ?? [];

// Filtrar clientes por dono (revendedor)
if (!$is_admin) {
    $clients = array_values(array_filter($clients, fn($c) => ($c['owner_id'] ?? '') === $uid));
}

// Dados do revendedor atual
$current_reseller = null;
if (!$is_admin) {
    foreach ($resellers as $r) {
        if ($r['id'] === $uid) { $current_reseller = $r; break; }
    }
}

// Estatísticas
$total_clients  = count($clients);
$active_clients = count(array_filter($clients, fn($c) => ($c['status'] ?? '') === 'active'));
$expired_now    = count(array_filter($clients, fn($c) => !empty($c['expires_at']) && strtotime($c['expires_at']) < time()));
$plans_list     = $config['plans'] ?? [];

$panel_name = htmlspecialchars($config['panel_name'] ?? 'GESTOR CYBER');
$logo_path  = !empty($config['logo']) && file_exists(__DIR__ . '/' . $config['logo']) ? $config['logo'] : '';
?>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= $panel_name ?> — Admin</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&family=Share+Tech+Mono&family=Rajdhani:wght@400;600;700&display=swap" rel="stylesheet">
<style>
  :root {
    --neon-blue: #00f0ff;
    --neon-green: #39ff14;
    --neon-yellow: #ffe600;
    --neon-pink: #ff2d78;
    --bg-dark: #0a0e1a;
    --bg-panel: #0f172a;
    --bg-card: #111827;
    --border-cyber: rgba(0,240,255,0.2);
  }
  * { box-sizing: border-box; }
  body {
    background: var(--bg-dark);
    font-family: 'Rajdhani', sans-serif;
    color: #c8d6e5;
    min-height: 100vh;
    background-image:
      radial-gradient(ellipse at 10% 20%, rgba(0,240,255,0.04) 0%, transparent 60%),
      radial-gradient(ellipse at 90% 80%, rgba(57,255,20,0.04) 0%, transparent 60%),
      repeating-linear-gradient(0deg, transparent, transparent 40px, rgba(0,240,255,0.015) 40px, rgba(0,240,255,0.015) 41px),
      repeating-linear-gradient(90deg, transparent, transparent 40px, rgba(0,240,255,0.015) 40px, rgba(0,240,255,0.015) 41px);
  }
  .font-orb { font-family: 'Orbitron', monospace; }
  .font-mono { font-family: 'Share Tech Mono', monospace; }

  /* Neon text */
  .neon-blue  { color: var(--neon-blue); text-shadow: 0 0 8px var(--neon-blue); }
  .neon-green { color: var(--neon-green); text-shadow: 0 0 8px var(--neon-green); }
  .neon-yellow{ color: var(--neon-yellow); text-shadow: 0 0 8px var(--neon-yellow); }
  .neon-pink  { color: var(--neon-pink); text-shadow: 0 0 8px var(--neon-pink); }

  /* Cards */
  .cyber-card {
    background: var(--bg-card);
    border: 1px solid var(--border-cyber);
    border-radius: 4px;
    position: relative;
    overflow: hidden;
  }
  .cyber-card::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 1px;
    background: linear-gradient(90deg, transparent, var(--neon-blue), transparent);
  }

  /* Buttons */
  .btn-cyber {
    font-family: 'Orbitron', monospace;
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.08em;
    padding: 8px 16px;
    border-radius: 2px;
    border: 1px solid var(--neon-blue);
    color: var(--neon-blue);
    background: rgba(0,240,255,0.05);
    cursor: pointer;
    transition: all 0.2s;
    text-transform: uppercase;
  }
  .btn-cyber:hover {
    background: rgba(0,240,255,0.15);
    box-shadow: 0 0 12px rgba(0,240,255,0.4);
  }
  .btn-green  { border-color: var(--neon-green); color: var(--neon-green); background: rgba(57,255,20,0.05); }
  .btn-green:hover  { background: rgba(57,255,20,0.12); box-shadow: 0 0 12px rgba(57,255,20,0.4); }
  .btn-yellow { border-color: var(--neon-yellow); color: var(--neon-yellow); background: rgba(255,230,0,0.05); }
  .btn-yellow:hover { background: rgba(255,230,0,0.12); box-shadow: 0 0 12px rgba(255,230,0,0.4); }
  .btn-pink   { border-color: var(--neon-pink); color: var(--neon-pink); background: rgba(255,45,120,0.05); }
  .btn-pink:hover   { background: rgba(255,45,120,0.12); box-shadow: 0 0 12px rgba(255,45,120,0.4); }
  .btn-sm { padding: 4px 10px; font-size: 0.6rem; }

  /* Inputs */
  .cyber-input {
    background: rgba(0,240,255,0.04);
    border: 1px solid rgba(0,240,255,0.2);
    border-radius: 2px;
    color: #e2e8f0;
    padding: 8px 12px;
    font-family: 'Share Tech Mono', monospace;
    font-size: 0.85rem;
    width: 100%;
    transition: border-color 0.2s;
  }
  .cyber-input:focus {
    outline: none;
    border-color: var(--neon-blue);
    box-shadow: 0 0 8px rgba(0,240,255,0.2);
  }
  select.cyber-input option { background: #111827; }

  /* Tabs */
  .tab-btn {
    font-family: 'Orbitron', monospace;
    font-size: 0.65rem;
    letter-spacing: 0.05em;
    padding: 10px 20px;
    border-bottom: 2px solid transparent;
    color: #64748b;
    cursor: pointer;
    transition: all 0.2s;
    white-space: nowrap;
  }
  .tab-btn.active, .tab-btn:hover {
    color: var(--neon-blue);
    border-bottom-color: var(--neon-blue);
  }

  /* Table */
  .cyber-table { width: 100%; border-collapse: collapse; font-size: 0.85rem; }
  .cyber-table th {
    font-family: 'Orbitron', monospace;
    font-size: 0.6rem;
    letter-spacing: 0.1em;
    color: #64748b;
    padding: 10px 12px;
    border-bottom: 1px solid rgba(0,240,255,0.1);
    text-align: left;
    text-transform: uppercase;
  }
  .cyber-table td {
    padding: 10px 12px;
    border-bottom: 1px solid rgba(255,255,255,0.04);
    vertical-align: middle;
  }
  .cyber-table tr:hover td { background: rgba(0,240,255,0.03); }

  /* Stat cards */
  .stat-card {
    background: var(--bg-card);
    border: 1px solid rgba(0,240,255,0.15);
    border-radius: 4px;
    padding: 20px;
    position: relative;
    overflow: hidden;
  }
  .stat-card::after {
    content: '';
    position: absolute;
    bottom: 0; left: 0; right: 0;
    height: 2px;
  }
  .stat-card.blue::after  { background: var(--neon-blue); box-shadow: 0 0 8px var(--neon-blue); }
  .stat-card.green::after { background: var(--neon-green); box-shadow: 0 0 8px var(--neon-green); }
  .stat-card.yellow::after{ background: var(--neon-yellow); box-shadow: 0 0 8px var(--neon-yellow); }
  .stat-card.pink::after  { background: var(--neon-pink); box-shadow: 0 0 8px var(--neon-pink); }

  /* Badge */
  .badge {
    display: inline-block;
    font-family: 'Orbitron', monospace;
    font-size: 0.55rem;
    padding: 2px 8px;
    border-radius: 2px;
    letter-spacing: 0.08em;
  }
  .badge-active  { background: rgba(57,255,20,0.1); color: var(--neon-green); border: 1px solid rgba(57,255,20,0.3); }
  .badge-blocked { background: rgba(255,45,120,0.1); color: var(--neon-pink); border: 1px solid rgba(255,45,120,0.3); }
  .badge-expired { background: rgba(255,230,0,0.1); color: var(--neon-yellow); border: 1px solid rgba(255,230,0,0.3); }
  .badge-test    { background: rgba(0,240,255,0.1); color: var(--neon-blue); border: 1px solid rgba(0,240,255,0.3); }

  /* Sidebar */
  .sidebar { background: #090d1a; border-right: 1px solid rgba(0,240,255,0.1); }

  /* Modal */
  .modal-bg {
    display: none;
    position: fixed; inset: 0;
    background: rgba(0,0,0,0.8);
    backdrop-filter: blur(4px);
    z-index: 100;
    align-items: center;
    justify-content: center;
  }
  .modal-bg.open { display: flex; }
  .modal-box {
    background: #111827;
    border: 1px solid rgba(0,240,255,0.3);
    border-radius: 4px;
    padding: 24px;
    width: 100%;
    max-width: 480px;
    max-height: 90vh;
    overflow-y: auto;
    position: relative;
  }
  .modal-box::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 2px;
    background: linear-gradient(90deg, var(--neon-blue), var(--neon-green));
  }

  /* Scrollbar */
  ::-webkit-scrollbar { width: 4px; height: 4px; }
  ::-webkit-scrollbar-track { background: #090d1a; }
  ::-webkit-scrollbar-thumb { background: rgba(0,240,255,0.3); border-radius: 2px; }

  /* Alert */
  .alert {
    padding: 12px 16px;
    border-radius: 2px;
    border-left: 3px solid;
    font-family: 'Share Tech Mono', monospace;
    font-size: 0.8rem;
  }
  .alert-success { background: rgba(57,255,20,0.08); border-color: var(--neon-green); color: var(--neon-green); }
  .alert-error   { background: rgba(255,45,120,0.08); border-color: var(--neon-pink); color: var(--neon-pink); }

  @keyframes scanline {
    0% { top: -10%; }
    100% { top: 110%; }
  }
  .scanline {
    position: fixed; left: 0; right: 0;
    height: 2px;
    background: linear-gradient(transparent, rgba(0,240,255,0.03), transparent);
    pointer-events: none;
    animation: scanline 8s linear infinite;
    z-index: 999;
  }
</style>
</head>
<body>
<div class="scanline"></div>

<div class="flex h-screen overflow-hidden">

<!-- ═══════════════════════════════ SIDEBAR ═══════════════════════════════ -->
<aside class="sidebar w-56 flex-shrink-0 flex flex-col overflow-y-auto">
  <!-- Logo -->
  <div class="p-4 border-b border-cyan-900/30">
    <?php if ($logo_path): ?>
      <img src="<?= htmlspecialchars($logo_path) ?>" alt="Logo" class="h-10 mb-2">
    <?php endif; ?>
    <div class="font-orb text-xs font-black neon-blue tracking-widest"><?= $panel_name ?></div>
    <div class="font-mono text-xs text-slate-500 mt-1">
      <?= $is_admin ? '⬡ ADMINISTRADOR' : '◈ REVENDEDOR' ?>
    </div>
    <?php if (!$is_admin && $current_reseller): ?>
    <div class="mt-2 text-xs">
      <span class="text-slate-400">Créditos: </span>
      <span class="neon-yellow font-bold"><?= $current_reseller['credits'] ?></span>
    </div>
    <?php endif; ?>
  </div>

  <!-- Nav -->
  <nav class="flex-1 p-3 space-y-1">
    <div class="text-xs font-orb text-slate-600 uppercase tracking-widest px-2 py-1">Gestão</div>
    <a href="#" onclick="showTab('clients')" class="nav-item flex items-center gap-2 px-3 py-2 rounded text-sm text-slate-300 hover:text-cyan-400 hover:bg-cyan-900/20 transition-colors">
      <span>◈</span> Clientes
    </a>
    <?php if ($is_admin): ?>
    <a href="#" onclick="showTab('resellers')" class="nav-item flex items-center gap-2 px-3 py-2 rounded text-sm text-slate-300 hover:text-cyan-400 hover:bg-cyan-900/20 transition-colors">
      <span>◈</span> Revendedores
    </a>
    <a href="#" onclick="showTab('sources')" class="nav-item flex items-center gap-2 px-3 py-2 rounded text-sm text-slate-300 hover:text-cyan-400 hover:bg-cyan-900/20 transition-colors">
      <span>◈</span> Fontes M3U
    </a>
    <div class="text-xs font-orb text-slate-600 uppercase tracking-widest px-2 py-1 mt-3">Sistema</div>
    <a href="#" onclick="showTab('config')" class="nav-item flex items-center gap-2 px-3 py-2 rounded text-sm text-slate-300 hover:text-cyan-400 hover:bg-cyan-900/20 transition-colors">
      <span>◈</span> Configurações
    </a>
    <?php endif; ?>
  </nav>

  <!-- Logout -->
  <div class="p-3 border-t border-cyan-900/30">
    <a href="?logout=1" onclick="fetch('api.php?action=logout')" class="btn-cyber btn-pink w-full text-center block">⏻ LOGOUT</a>
  </div>
</aside>

<!-- ═══════════════════════════════ MAIN ══════════════════════════════════ -->
<main class="flex-1 overflow-y-auto">

  <!-- Header -->
  <div class="border-b border-cyan-900/30 bg-black/20 px-6 py-3 flex items-center justify-between">
    <div class="font-orb text-xs neon-blue tracking-widest">PAINEL DE CONTROLE</div>
    <div class="font-mono text-xs text-slate-500"><?= date('d/m/Y H:i:s') ?> | <?= htmlspecialchars($_SESSION['username']) ?></div>
  </div>

  <div class="p-6">

    <?php if ($msg): ?>
    <div class="alert <?= $msg_type === 'error' ? 'alert-error' : 'alert-success' ?> mb-4">
      <?= $msg ?>
    </div>
    <?php endif; ?>

    <!-- Stats -->
    <div class="grid grid-cols-2 lg:grid-cols-4 gap-4 mb-6">
      <div class="stat-card blue">
        <div class="font-mono text-xs text-slate-500 mb-1">TOTAL CLIENTES</div>
        <div class="font-orb text-2xl neon-blue"><?= $total_clients ?></div>
      </div>
      <div class="stat-card green">
        <div class="font-mono text-xs text-slate-500 mb-1">ATIVOS</div>
        <div class="font-orb text-2xl neon-green"><?= $active_clients ?></div>
      </div>
      <div class="stat-card yellow">
        <div class="font-mono text-xs text-slate-500 mb-1">VENCIDOS</div>
        <div class="font-orb text-2xl neon-yellow"><?= $expired_now ?></div>
      </div>
      <?php if ($is_admin): ?>
      <div class="stat-card pink">
        <div class="font-mono text-xs text-slate-500 mb-1">REVENDEDORES</div>
        <div class="font-orb text-2xl neon-pink"><?= count($resellers) ?></div>
      </div>
      <?php else: ?>
      <div class="stat-card blue">
        <div class="font-mono text-xs text-slate-500 mb-1">MEUS CRÉDITOS</div>
        <div class="font-orb text-2xl neon-blue"><?= $current_reseller['credits'] ?? 0 ?></div>
      </div>
      <?php endif; ?>
    </div>

    <!-- ══════════════ TAB: CLIENTS ══════════════ -->
    <div id="tab-clients" class="tab-content">
      <div class="cyber-card p-4 mb-4 flex flex-wrap items-center gap-3">
        <div class="font-orb text-sm neon-blue flex-1">◈ GESTÃO DE CLIENTES</div>
        <button onclick="openModal('modal-add-client')" class="btn-cyber btn-green">+ NOVO CLIENTE</button>
        <button onclick="openModal('modal-add-test')" class="btn-cyber btn-yellow">⚡ GERAR TESTE</button>
      </div>

      <!-- Busca -->
      <div class="mb-3">
        <input type="text" id="client-search" class="cyber-input" placeholder="Buscar cliente..." oninput="filterClients()">
      </div>

      <div class="cyber-card overflow-x-auto">
        <table class="cyber-table" id="clients-table">
          <thead>
            <tr>
              <th>USUÁRIO</th>
              <th>NOME</th>
              <th>PLANO</th>
              <th>VENCIMENTO</th>
              <th>STATUS</th>
              <th>CONEXÕES</th>
              <th>ADULTO</th>
              <th>AÇÕES</th>
            </tr>
          </thead>
          <tbody>
            <?php foreach ($clients as $cli):
              $expired = !empty($cli['expires_at']) && strtotime($cli['expires_at']) < time();
              $status  = $cli['status'] ?? 'active';
              $is_test = $cli['is_test'] ?? false;
              $exp_date = !empty($cli['expires_at']) ? date('d/m/Y H:i', strtotime($cli['expires_at'])) : '—';
              $days_left = !empty($cli['expires_at']) ? max(0, ceil((strtotime($cli['expires_at']) - time()) / 86400)) : 0;
            ?>
            <tr class="client-row">
              <td class="font-mono text-xs">
                <?= htmlspecialchars($cli['username']) ?>
                <?php if ($is_test): ?><br><span class="badge badge-test">TESTE</span><?php endif; ?>
              </td>
              <td class="text-sm"><?= htmlspecialchars($cli['name'] ?? '') ?></td>
              <td>
                <?php $plan_label = $plans_list[$cli['plan']]['label'] ?? strtoupper($cli['plan'] ?? '-'); ?>
                <span class="text-xs text-slate-400"><?= htmlspecialchars($plan_label) ?></span>
              </td>
              <td class="font-mono text-xs">
                <?= $exp_date ?>
                <?php if ($expired): ?>
                  <br><span class="badge badge-expired">VENCIDO</span>
                <?php elseif ($days_left <= 3): ?>
                  <br><span class="badge badge-expired"><?= $days_left ?>d restantes</span>
                <?php endif; ?>
              </td>
              <td>
                <span class="badge <?= $status === 'active' ? 'badge-active' : 'badge-blocked' ?>">
                  <?= $status === 'active' ? 'ATIVO' : 'BLOQUEADO' ?>
                </span>
              </td>
              <td class="text-center font-mono text-xs neon-blue"><?= $cli['max_connections'] ?? 1 ?></td>
              <td class="text-center">
                <?= ($cli['adult_content'] ?? false) ? '<span class="neon-pink text-xs">✓</span>' : '<span class="text-slate-600 text-xs">✗</span>' ?>
              </td>
              <td>
                <div class="flex gap-1 flex-wrap">
                  <!-- Renovar -->
                  <form method="POST" style="display:inline" onsubmit="return setRenew('<?= $cli['id'] ?>')">
                    <input type="hidden" name="action" value="renew_client">
                    <input type="hidden" name="cli_id" id="renew_id_<?= $cli['id'] ?>" value="<?= $cli['id'] ?>">
                    <input type="hidden" name="renew_plan" id="renew_plan_<?= $cli['id'] ?>" value="mensal">
                    <button type="submit" class="btn-cyber btn-sm btn-green" onclick="pickPlan('<?= $cli['id'] ?>', event)">↻ RENOVAR</button>
                  </form>
                  <!-- Confiança -->
                  <?php if ($expired && !($cli['trust_used'] ?? false)): ?>
                  <form method="POST" style="display:inline">
                    <input type="hidden" name="action" value="trust_renew">
                    <input type="hidden" name="cli_id" value="<?= $cli['id'] ?>">
                    <button type="submit" class="btn-cyber btn-sm btn-yellow" title="Renovação de Confiança (+<?= $config['trust_renewal_days'] ?? 2 ?>d)">★ CONFIANÇA</button>
                  </form>
                  <?php endif; ?>
                  <!-- Toggle -->
                  <form method="POST" style="display:inline">
                    <input type="hidden" name="action" value="toggle_client">
                    <input type="hidden" name="cli_id" value="<?= $cli['id'] ?>">
                    <button type="submit" class="btn-cyber btn-sm <?= $status === 'active' ? 'btn-pink' : 'btn-green' ?>">
                      <?= $status === 'active' ? '✕ BLOCK' : '✓ ATIVAR' ?>
                    </button>
                  </form>
                  <!-- Editar -->
                  <button onclick='openEditClient(<?= json_encode($cli) ?>)' class="btn-cyber btn-sm">✎ EDITAR</button>
                  <!-- M3U -->
                  <button onclick="showM3U('<?= htmlspecialchars($cli['username']) ?>', '<?= htmlspecialchars($cli['plain_password'] ?? '') ?>')" class="btn-cyber btn-sm btn-yellow">▶ M3U</button>
                  <!-- Deletar -->
                  <form method="POST" style="display:inline" onsubmit="return confirm('Deletar cliente?')">
                    <input type="hidden" name="action" value="delete_client">
                    <input type="hidden" name="cli_id" value="<?= $cli['id'] ?>">
                    <button type="submit" class="btn-cyber btn-sm btn-pink">✕ DEL</button>
                  </form>
                </div>
              </td>
            </tr>
            <?php endforeach; ?>
            <?php if (empty($clients)): ?>
            <tr><td colspan="8" class="text-center text-slate-600 py-8 font-mono text-xs">Nenhum cliente cadastrado</td></tr>
            <?php endif; ?>
          </tbody>
        </table>
      </div>
    </div><!-- /tab-clients -->

    <?php if ($is_admin): ?>
    <!-- ══════════════ TAB: RESELLERS ══════════════ -->
    <div id="tab-resellers" class="tab-content hidden">
      <div class="cyber-card p-4 mb-4 flex items-center gap-3">
        <div class="font-orb text-sm neon-blue flex-1">◈ GESTÃO DE REVENDEDORES</div>
        <button onclick="openModal('modal-add-reseller')" class="btn-cyber btn-green">+ NOVO REVENDEDOR</button>
      </div>
      <div class="cyber-card overflow-x-auto">
        <table class="cyber-table">
          <thead>
            <tr>
              <th>USUÁRIO</th>
              <th>NOME</th>
              <th>CRÉDITOS</th>
              <th>STATUS</th>
              <th>CRIADO EM</th>
              <th>AÇÕES</th>
            </tr>
          </thead>
          <tbody>
            <?php foreach ($resellers as $res): ?>
            <tr>
              <td class="font-mono text-xs"><?= htmlspecialchars($res['username']) ?></td>
              <td><?= htmlspecialchars($res['name'] ?? '') ?></td>
              <td class="font-orb text-lg neon-yellow"><?= $res['credits'] ?></td>
              <td>
                <span class="badge <?= ($res['status'] ?? 'active') === 'active' ? 'badge-active' : 'badge-blocked' ?>">
                  <?= ($res['status'] ?? 'active') === 'active' ? 'ATIVO' : 'BLOQUEADO' ?>
                </span>
              </td>
              <td class="font-mono text-xs text-slate-400"><?= date('d/m/Y', strtotime($res['created_at'] ?? 'now')) ?></td>
              <td>
                <div class="flex gap-1 flex-wrap">
                  <button onclick="openCreditModal('<?= $res['id'] ?>', '<?= htmlspecialchars($res['username']) ?>')" class="btn-cyber btn-sm btn-yellow">± CRÉDITOS</button>
                  <form method="POST" style="display:inline">
                    <input type="hidden" name="action" value="toggle_reseller">
                    <input type="hidden" name="res_id" value="<?= $res['id'] ?>">
                    <button type="submit" class="btn-cyber btn-sm <?= ($res['status'] ?? 'active') === 'active' ? 'btn-pink' : 'btn-green' ?>">
                      <?= ($res['status'] ?? 'active') === 'active' ? '✕ BLOCK' : '✓ ATIVAR' ?>
                    </button>
                  </form>
                  <form method="POST" style="display:inline" onsubmit="return confirm('Deletar revendedor?')">
                    <input type="hidden" name="action" value="delete_reseller">
                    <input type="hidden" name="res_id" value="<?= $res['id'] ?>">
                    <button type="submit" class="btn-cyber btn-sm btn-pink">✕ DEL</button>
                  </form>
                </div>
              </td>
            </tr>
            <?php endforeach; ?>
            <?php if (empty($resellers)): ?>
            <tr><td colspan="6" class="text-center text-slate-600 py-8 font-mono text-xs">Nenhum revendedor cadastrado</td></tr>
            <?php endif; ?>
          </tbody>
        </table>
      </div>
    </div>

    <!-- ══════════════ TAB: SOURCES ══════════════ -->
    <div id="tab-sources" class="tab-content hidden">
      <div class="cyber-card p-4 mb-4 flex flex-wrap items-center gap-3">
        <div class="font-orb text-sm neon-blue flex-1">◈ FONTES M3U MASTER</div>
        <button onclick="clearM3UCache()" class="btn-cyber btn-yellow">⚡ LIMPAR CACHE</button>
        <button onclick="openModal('modal-add-source')" class="btn-cyber btn-green">+ NOVA FONTE</button>
      </div>
      <div class="cyber-card overflow-x-auto">
        <table class="cyber-table">
          <thead>
            <tr><th>NOME</th><th>URL</th><th>USUÁRIO</th><th>STATUS</th><th>CRIADA EM</th><th>AÇÕES</th></tr>
          </thead>
          <tbody>
            <?php foreach ($sources as $src): ?>
            <tr>
              <td class="font-mono text-sm"><?= htmlspecialchars($src['name']) ?></td>
              <td class="font-mono text-xs text-slate-400 max-w-xs truncate"><?= htmlspecialchars($src['url']) ?></td>
              <td class="font-mono text-xs"><?= htmlspecialchars($src['username'] ?? '—') ?></td>
              <td>
                <span class="badge <?= ($src['status'] ?? 'active') === 'active' ? 'badge-active' : 'badge-blocked' ?>">
                  <?= ($src['status'] ?? 'active') === 'active' ? 'ATIVO' : 'INATIVO' ?>
                </span>
              </td>
              <td class="font-mono text-xs text-slate-400"><?= date('d/m/Y', strtotime($src['created_at'] ?? 'now')) ?></td>
              <td>
                <div class="flex gap-1 flex-wrap">
                  <button onclick='openEditSource(<?= json_encode($src) ?>)' class="btn-cyber btn-sm btn-yellow">✎ EDITAR</button>
                  <form method="POST" style="display:inline">
                    <input type="hidden" name="action" value="toggle_source">
                    <input type="hidden" name="source_id" value="<?= $src['id'] ?>">
                    <button type="submit" class="btn-cyber btn-sm"><?= ($src['status'] ?? 'active') === 'active' ? '⏸ PAUSAR' : '▶ ATIVAR' ?></button>
                  </form>
                  <form method="POST" style="display:inline" onsubmit="return confirm('Remover fonte?')">
                    <input type="hidden" name="action" value="delete_source">
                    <input type="hidden" name="source_id" value="<?= $src['id'] ?>">
                    <button type="submit" class="btn-cyber btn-sm btn-pink">✕ DEL</button>
                  </form>
                </div>
              </td>
            </tr>
            <?php endforeach; ?>
            <?php if (empty($sources)): ?>
            <tr><td colspan="6" class="text-center text-slate-600 py-8 font-mono text-xs">Nenhuma fonte cadastrada</td></tr>
            <?php endif; ?>
          </tbody>
        </table>
      </div>
    </div>

    <!-- ══════════════ TAB: CONFIG ══════════════ -->
    <div id="tab-config" class="tab-content hidden">
      <div class="font-orb text-sm neon-blue mb-4">◈ CONFIGURAÇÕES DO PAINEL</div>
      <form method="POST" enctype="multipart/form-data">
        <input type="hidden" name="action" value="save_config">
        <div class="grid grid-cols-1 lg:grid-cols-2 gap-6">

          <!-- Geral -->
          <div class="cyber-card p-5">
            <div class="font-orb text-xs neon-blue mb-4 tracking-widest">CONFIGURAÇÕES GERAIS</div>
            <div class="space-y-3">
              <div>
                <label class="font-mono text-xs text-slate-400 block mb-1">NOME DO PAINEL</label>
                <input type="text" name="panel_name" value="<?= htmlspecialchars($config['panel_name'] ?? '') ?>" class="cyber-input">
              </div>
              <div>
                <label class="font-mono text-xs text-slate-400 block mb-1">WHATSAPP (apenas números)</label>
                <input type="text" name="whatsapp" value="<?= htmlspecialchars($config['whatsapp'] ?? '') ?>" class="cyber-input" placeholder="5511999999999">
              </div>
              <div>
                <label class="font-mono text-xs text-slate-400 block mb-1">DURAÇÃO DO TESTE (horas)</label>
                <input type="number" name="test_duration_hours" value="<?= (int)($config['test_duration_hours'] ?? 24) ?>" class="cyber-input" min="1" max="168">
              </div>
              <div>
                <label class="font-mono text-xs text-slate-400 block mb-1">DIAS DE RENOVAÇÃO DE CONFIANÇA</label>
                <input type="number" name="trust_renewal_days" value="<?= (int)($config['trust_renewal_days'] ?? 2) ?>" class="cyber-input" min="1" max="7">
              </div>
              <div>
                <label class="font-mono text-xs text-slate-400 block mb-1">LOGOTIPO</label>
                <?php if ($logo_path): ?>
                  <img src="<?= htmlspecialchars($logo_path) ?>" class="h-12 mb-2 border border-cyan-900/50 p-1">
                <?php endif; ?>
                <input type="file" name="logo" accept="image/*" class="cyber-input text-xs py-1">
              </div>
            </div>
          </div>

          <!-- Planos -->
          <div class="cyber-card p-5">
            <div class="font-orb text-xs neon-green mb-4 tracking-widest">PLANOS E VALORES</div>
            <div class="space-y-4">
              <?php foreach (['mensal', 'trimestral', 'semestral', 'anual'] as $plan):
                $p = $plans_list[$plan] ?? ['days' => 30, 'price' => 0, 'label' => ucfirst($plan)];
              ?>
              <div>
                <div class="font-mono text-xs neon-yellow mb-2"><?= strtoupper($plan) ?></div>
                <div class="flex gap-2">
                  <div class="flex-1">
                    <label class="font-mono text-xs text-slate-500">Dias</label>
                    <input type="number" name="plan_<?= $plan ?>_days" value="<?= (int)$p['days'] ?>" class="cyber-input">
                  </div>
                  <div class="flex-1">
                    <label class="font-mono text-xs text-slate-500">Valor (R$)</label>
                    <input type="number" step="0.01" name="plan_<?= $plan ?>_price" value="<?= number_format((float)($p['price'] ?? 0), 2, '.', '') ?>" class="cyber-input">
                  </div>
                </div>
              </div>
              <?php endforeach; ?>
            </div>
          </div>
        </div>

        <div class="mt-4">
          <button type="submit" class="btn-cyber btn-green">💾 SALVAR CONFIGURAÇÕES</button>
        </div>
      </form>
    </div>
    <?php endif; ?>

  </div><!-- /p-6 -->
</main>
</div><!-- /flex -->

<!-- ═══════════════════════ MODAIS ════════════════════════════════════════════ -->

<!-- Modal: Novo Cliente -->
<div id="modal-add-client" class="modal-bg">
  <div class="modal-box">
    <div class="font-orb text-sm neon-blue mb-4">◈ NOVO CLIENTE</div>
    <form method="POST">
      <input type="hidden" name="action" value="add_client">
      <div class="space-y-3">
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">NOME COMPLETO</label>
          <input type="text" name="cli_name" class="cyber-input" placeholder="Nome do cliente" required>
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">USUÁRIO <span class="text-yellow-400">(somente números)</span></label>
          <input type="text" name="cli_username" id="new-cli-user" class="cyber-input" required
                 placeholder="ex: 31985001234" inputmode="numeric" pattern="[0-9]+"
                 oninput="this.value=this.value.replace(/\D/g,'')">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">SENHA <span class="text-yellow-400">(somente números)</span></label>
          <input type="text" name="cli_password" id="new-cli-pass" class="cyber-input" required
                 placeholder="ex: 12345678" inputmode="numeric" pattern="[0-9]+"
                 oninput="this.value=this.value.replace(/\D/g,'')">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">PLANO</label>
          <select name="cli_plan" class="cyber-input">
            <?php foreach ($plans_list as $key => $plan): ?>
            <option value="<?= $key ?>"><?= htmlspecialchars($plan['label'] ?? $key) ?> — <?= $plan['days'] ?> dias — R$ <?= number_format($plan['price'] ?? 0, 2, ',', '.') ?></option>
            <?php endforeach; ?>
          </select>
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">CONEXÕES SIMULTÂNEAS</label>
          <input type="number" name="cli_connections" value="1" min="1" max="10" class="cyber-input">
        </div>
        <div class="flex items-center gap-3">
          <input type="checkbox" name="cli_adult" value="1" id="chk-adult" class="w-4 h-4">
          <label for="chk-adult" class="font-mono text-xs neon-pink cursor-pointer">HABILITAR CONTEÚDO ADULTO</label>
        </div>
      </div>
      <div class="flex gap-3 mt-5">
        <button type="submit" class="btn-cyber btn-green flex-1">✓ CRIAR CLIENTE</button>
        <button type="button" onclick="closeModal('modal-add-client')" class="btn-cyber btn-pink">✕ CANCELAR</button>
      </div>
    </form>
  </div>
</div>

<!-- Modal: Gerar Teste -->
<div id="modal-add-test" class="modal-bg">
  <div class="modal-box">
    <div class="font-orb text-sm neon-yellow mb-4">⚡ GERAR TESTE</div>
    <form method="POST">
      <input type="hidden" name="action" value="add_test">
      <div class="space-y-3">
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">NOME DO CLIENTE</label>
          <input type="text" name="test_name" class="cyber-input" required placeholder="Nome de quem vai testar">
        </div>
        <div class="font-mono text-xs text-slate-500 bg-black/20 border border-cyan-900/30 rounded p-3">
          ⚡ Usuário e senha serão gerados automaticamente com <span class="neon-yellow">somente números</span>.<br>
          Duração: <span class="neon-blue"><?= (int)($config['test_duration_hours'] ?? 24) ?> horas</span>
        </div>
      </div>
      <div class="flex gap-3 mt-5">
        <button type="submit" class="btn-cyber btn-yellow flex-1">⚡ GERAR TESTE</button>
        <button type="button" onclick="closeModal('modal-add-test')" class="btn-cyber btn-pink">✕ CANCELAR</button>
      </div>
    </form>
  </div>
</div>

<!-- Modal: Editar Cliente -->
<div id="modal-edit-client" class="modal-bg">
  <div class="modal-box">
    <div class="font-orb text-sm neon-yellow mb-4">✎ EDITAR CLIENTE</div>
    <form method="POST">
      <input type="hidden" name="action" value="edit_client">
      <input type="hidden" name="cli_id" id="edit-cli-id">
      <div class="space-y-3">
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">NOME</label>
          <input type="text" name="cli_name" id="edit-cli-name" class="cyber-input">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">NOVA SENHA <span class="text-yellow-400">(somente números — deixe em branco para manter)</span></label>
          <input type="text" name="cli_password" class="cyber-input" placeholder="Nova senha numérica..."
                 inputmode="numeric" oninput="this.value=this.value.replace(/\D/g,'')">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">CONEXÕES SIMULTÂNEAS</label>
          <input type="number" name="cli_connections" id="edit-cli-conn" value="1" min="1" max="10" class="cyber-input">
        </div>
        <div class="flex items-center gap-3">
          <input type="checkbox" name="cli_adult" value="1" id="edit-cli-adult" class="w-4 h-4">
          <label for="edit-cli-adult" class="font-mono text-xs neon-pink cursor-pointer">CONTEÚDO ADULTO</label>
        </div>
      </div>
      <div class="flex gap-3 mt-5">
        <button type="submit" class="btn-cyber btn-yellow flex-1">💾 SALVAR</button>
        <button type="button" onclick="closeModal('modal-edit-client')" class="btn-cyber btn-pink">✕ CANCELAR</button>
      </div>
    </form>
  </div>
</div>

<!-- Modal: Adicionar Fonte -->
<?php if ($is_admin): ?>
<div id="modal-add-source" class="modal-bg">
  <div class="modal-box">
    <div class="font-orb text-sm neon-blue mb-4">◈ NOVA FONTE M3U</div>
    <form method="POST">
      <input type="hidden" name="action" value="add_source">
      <div class="space-y-3">
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">NOME DA FONTE</label>
          <input type="text" name="source_name" class="cyber-input" required placeholder="Servidor Principal">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">URL DO SERVIDOR (base ou get.php)</label>
          <input type="text" name="source_url" class="cyber-input" required placeholder="http://servidor.com:8080">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">USUÁRIO MASTER</label>
          <input type="text" name="source_user" class="cyber-input" placeholder="usuario_master">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">SENHA MASTER</label>
          <input type="text" name="source_pass" class="cyber-input" placeholder="senha_master">
        </div>
      </div>
      <div class="flex gap-3 mt-5">
        <button type="submit" class="btn-cyber btn-green flex-1">✓ ADICIONAR</button>
        <button type="button" onclick="closeModal('modal-add-source')" class="btn-cyber btn-pink">✕ CANCELAR</button>
      </div>
    </form>
  </div>
</div>

<!-- Modal: Editar Fonte M3U -->
<div id="modal-edit-source" class="modal-bg">
  <div class="modal-box">
    <div class="font-orb text-sm neon-yellow mb-4">✎ EDITAR FONTE M3U</div>
    <form method="POST">
      <input type="hidden" name="action" value="edit_source">
      <input type="hidden" name="source_id" id="edit-src-id">
      <div class="space-y-3">
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">NOME DA FONTE</label>
          <input type="text" name="source_name" id="edit-src-name" class="cyber-input" required>
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">URL DO SERVIDOR</label>
          <input type="text" name="source_url" id="edit-src-url" class="cyber-input" required placeholder="http://servidor.com:8080">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">USUÁRIO MASTER</label>
          <input type="text" name="source_user" id="edit-src-user" class="cyber-input" placeholder="usuario_master">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">SENHA MASTER <span class="text-slate-500">(deixe em branco para manter)</span></label>
          <input type="text" name="source_pass" class="cyber-input" placeholder="Nova senha ou deixe em branco">
        </div>
        <div class="font-mono text-xs text-slate-500 bg-black/20 border border-cyan-900/30 rounded p-2">
          ⚡ Ao salvar, o cache da lista M3U será limpo automaticamente.
        </div>
      </div>
      <div class="flex gap-3 mt-5">
        <button type="submit" class="btn-cyber btn-yellow flex-1">💾 SALVAR ALTERAÇÕES</button>
        <button type="button" onclick="closeModal('modal-edit-source')" class="btn-cyber btn-pink">✕ CANCELAR</button>
      </div>
    </form>
  </div>
</div>

<!-- Modal: Novo Revendedor -->
<div id="modal-add-reseller" class="modal-bg">
  <div class="modal-box">
    <div class="font-orb text-sm neon-green mb-4">◈ NOVO REVENDEDOR</div>
    <form method="POST">
      <input type="hidden" name="action" value="add_reseller">
      <div class="space-y-3">
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">NOME</label>
          <input type="text" name="res_name" class="cyber-input" placeholder="Nome do revendedor">
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">USUÁRIO</label>
          <input type="text" name="res_username" class="cyber-input" required>
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">SENHA</label>
          <input type="text" name="res_password" class="cyber-input" required>
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">CRÉDITOS INICIAIS</label>
          <input type="number" name="res_credits" value="0" min="0" class="cyber-input">
        </div>
      </div>
      <div class="flex gap-3 mt-5">
        <button type="submit" class="btn-cyber btn-green flex-1">✓ CRIAR</button>
        <button type="button" onclick="closeModal('modal-add-reseller')" class="btn-cyber btn-pink">✕ CANCELAR</button>
      </div>
    </form>
  </div>
</div>

<!-- Modal: Créditos Revendedor -->
<div id="modal-credits" class="modal-bg">
  <div class="modal-box">
    <div class="font-orb text-sm neon-yellow mb-1">± GERENCIAR CRÉDITOS</div>
    <div class="font-mono text-xs text-slate-400 mb-4" id="credit-reseller-name"></div>
    <form method="POST">
      <input type="hidden" name="action" value="edit_reseller_credits">
      <input type="hidden" name="res_id" id="credit-res-id">
      <div class="space-y-3">
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">OPERAÇÃO</label>
          <select name="credit_op" class="cyber-input">
            <option value="add">➕ Adicionar créditos</option>
            <option value="remove">➖ Remover créditos</option>
          </select>
        </div>
        <div>
          <label class="font-mono text-xs text-slate-400 block mb-1">QUANTIDADE</label>
          <input type="number" name="credit_amount" value="10" min="1" class="cyber-input">
        </div>
      </div>
      <div class="flex gap-3 mt-5">
        <button type="submit" class="btn-cyber btn-yellow flex-1">APLICAR</button>
        <button type="button" onclick="closeModal('modal-credits')" class="btn-cyber btn-pink">✕ CANCELAR</button>
      </div>
    </form>
  </div>
</div>
<?php endif; ?>

<!-- Modal: M3U Info -->
<div id="modal-m3u" class="modal-bg">
  <div class="modal-box">
    <div class="font-orb text-sm neon-yellow mb-4">▶ LINKS DO CLIENTE</div>
    <div class="space-y-3">
      <div>
        <label class="font-mono text-xs text-slate-400 block mb-1">URL M3U PLUS</label>
        <input type="text" id="m3u-url-plus" class="cyber-input text-xs" readonly onclick="this.select()">
      </div>
      <div>
        <label class="font-mono text-xs text-slate-400 block mb-1">URL M3U</label>
        <input type="text" id="m3u-url" class="cyber-input text-xs" readonly onclick="this.select()">
      </div>
      <div>
        <label class="font-mono text-xs text-slate-400 block mb-1">EPG URL</label>
        <input type="text" id="m3u-epg" class="cyber-input text-xs" readonly onclick="this.select()">
      </div>
      <div class="border-t border-cyan-900/30 pt-3">
        <label class="font-mono text-xs neon-blue block mb-1">◈ XTREAM CODES</label>
        <div class="grid grid-cols-1 gap-2">
          <div>
            <label class="font-mono text-xs text-slate-500 block mb-1">HOST</label>
            <input type="text" id="xtream-host" class="cyber-input text-xs" readonly onclick="this.select()">
          </div>
          <div class="grid grid-cols-2 gap-2">
            <div>
              <label class="font-mono text-xs text-slate-500 block mb-1">USUÁRIO</label>
              <input type="text" id="xtream-user" class="cyber-input text-xs" readonly onclick="this.select()">
            </div>
            <div>
              <label class="font-mono text-xs text-slate-500 block mb-1">SENHA</label>
              <input type="text" id="xtream-pass" class="cyber-input text-xs" readonly onclick="this.select()">
            </div>
          </div>
        </div>
      </div>
    </div>
    <?php if (!empty($config['whatsapp'])): ?>
    <a href="#" id="whatsapp-share" target="_blank" class="btn-cyber btn-green mt-4 block text-center">📲 ENVIAR VIA WHATSAPP</a>
    <?php endif; ?>
    <button type="button" onclick="closeModal('modal-m3u')" class="btn-cyber btn-pink w-full mt-2">✕ FECHAR</button>
  </div>
</div>

<!-- Modal: Plano para Renovação -->
<div id="modal-renew-plan" class="modal-bg">
  <div class="modal-box">
    <div class="font-orb text-sm neon-green mb-4">↻ SELECIONAR PLANO DE RENOVAÇÃO</div>
    <div id="renew-plan-buttons" class="grid grid-cols-2 gap-3">
      <?php foreach ($plans_list as $key => $plan): ?>
      <button onclick="confirmRenew('<?= $key ?>')" class="btn-cyber btn-green py-3">
        <div><?= htmlspecialchars($plan['label'] ?? $key) ?></div>
        <div class="text-xs opacity-70"><?= $plan['days'] ?>d — R$ <?= number_format($plan['price'] ?? 0, 2, ',', '.') ?></div>
      </button>
      <?php endforeach; ?>
    </div>
    <button type="button" onclick="closeModal('modal-renew-plan')" class="btn-cyber btn-pink w-full mt-3">✕ CANCELAR</button>
  </div>
</div>

<script>
// ─── Tabs ───────────────────────────────────────────────────────────────────
function showTab(name) {
  document.querySelectorAll('.tab-content').forEach(t => t.classList.add('hidden'));
  document.getElementById('tab-' + name)?.classList.remove('hidden');
}
showTab('clients');

// ─── Modais ─────────────────────────────────────────────────────────────────
function openModal(id) { document.getElementById(id).classList.add('open'); }
function closeModal(id) { document.getElementById(id).classList.remove('open'); }
document.querySelectorAll('.modal-bg').forEach(m => {
  m.addEventListener('click', e => { if (e.target === m) m.classList.remove('open'); });
});

// ─── Editar Cliente ──────────────────────────────────────────────────────────
function openEditClient(cli) {
  document.getElementById('edit-cli-id').value   = cli.id;
  document.getElementById('edit-cli-name').value = cli.name || '';
  document.getElementById('edit-cli-conn').value = cli.max_connections || 1;
  document.getElementById('edit-cli-adult').checked = !!cli.adult_content;
  openModal('modal-edit-client');
}

// ─── Editar Fonte ────────────────────────────────────────────────────────────
function openEditSource(src) {
  document.getElementById('edit-src-id').value   = src.id;
  document.getElementById('edit-src-name').value = src.name || '';
  document.getElementById('edit-src-url').value  = src.url  || '';
  document.getElementById('edit-src-user').value = src.username || '';
  openModal('modal-edit-source');
}

// ─── M3U Info ───────────────────────────────────────────────────────────────
function showM3U(username, password) {
  const pwd  = password || 'SENHA';
  const base = window.location.origin + window.location.pathname.replace('admin.php', '');
  const host = base.replace(/\/$/, ''); // sem barra final — esse é o HOST do Xtream

  // URLs M3U via get.php (padrão Xtream)
  const urlPlus = `${host}/get.php?username=${username}&password=${pwd}&type=m3u_plus`;
  const urlM3u  = `${host}/get.php?username=${username}&password=${pwd}&type=m3u`;
  const epg     = `${host}/get.php?username=${username}&password=${pwd}&type=xmltv`;

  document.getElementById('m3u-url-plus').value = urlPlus;
  document.getElementById('m3u-url').value      = urlM3u;
  document.getElementById('m3u-epg').value      = epg;

  // Xtream Codes: host, user, pass separados (aponta para player_api.php)
  document.getElementById('xtream-host').value = host;
  document.getElementById('xtream-user').value = username;
  document.getElementById('xtream-pass').value = pwd;

  const wa = document.getElementById('whatsapp-share');
  if (wa) {
    const msg = encodeURIComponent(
      `🎬 *IPTV - Dados de Acesso*\n\n` +
      `👤 Usuário: ${username}\n` +
      `🔑 Senha: ${pwd}\n\n` +
      `📡 *M3U Plus (Cole no app):*\n${urlPlus}\n\n` +
      `⚡ *Xtream Codes:*\n🌐 Host: ${host}\n👤 User: ${username}\n🔑 Pass: ${pwd}`
    );
    wa.href = `https://wa.me/<?= preg_replace('/\D/','',$config['whatsapp']??'') ?>?text=${msg}`;
  }
  openModal('modal-m3u');
}

// ─── Renovação com seleção de plano ─────────────────────────────────────────
let _renewClientId = null;
function pickPlan(id, e) {
  e.preventDefault();
  _renewClientId = id;
  openModal('modal-renew-plan');
}
function confirmRenew(plan) {
  if (!_renewClientId) return;
  document.getElementById('renew_plan_' + _renewClientId).value = plan;
  closeModal('modal-renew-plan');
  document.getElementById('renew_id_' + _renewClientId).closest('form').submit();
}

// ─── Créditos Revendedor ─────────────────────────────────────────────────────
function openCreditModal(id, name) {
  document.getElementById('credit-res-id').value = id;
  document.getElementById('credit-reseller-name').textContent = '@ ' + name;
  openModal('modal-credits');
}

// ─── Filtro de clientes ──────────────────────────────────────────────────────
function filterClients() {
  const q = document.getElementById('client-search').value.toLowerCase();
  document.querySelectorAll('#clients-table .client-row').forEach(row => {
    row.style.display = row.textContent.toLowerCase().includes(q) ? '' : 'none';
  });
}

// ─── Limpar cache M3U ────────────────────────────────────────────────────────
async function clearM3UCache() {
  const btn = event.target;
  btn.disabled = true;
  btn.textContent = '⏳ LIMPANDO...';
  try {
    const r = await fetch('api.php?action=clear_cache', { method: 'POST' });
    const d = await r.json();
    btn.textContent = d.success ? '✓ CACHE LIMPO' : '✕ ERRO';
    btn.style.color = d.success ? 'var(--neon-green)' : 'var(--neon-pink)';
    setTimeout(() => { btn.disabled = false; btn.textContent = '⚡ LIMPAR CACHE'; btn.style.color = ''; }, 2000);
  } catch(e) {
    btn.textContent = '✕ ERRO'; btn.disabled = false;
  }
}

// ─── Logout ──────────────────────────────────────────────────────────────────
document.querySelector('[href="?logout=1"]')?.addEventListener('click', e => {
  e.preventDefault();
  fetch('api.php?action=logout').finally(() => window.location.href = 'index.php');
});
</script>
</body>
</html>
