<?php
error_reporting(0);
ini_set('display_errors', 'off');

// API calls handle their own auth below
$api = isset($_GET['api']) && $_GET['api'] == '1';
if (!$api) {
    require_once(__DIR__ . '/utils.php');
    configure_session_lifetime(12);
    if (session_status() == PHP_SESSION_NONE) session_start();
    if (!isset($_SESSION['email'])) { header("location:index.php"); exit; }
}

if ($api) {
    header('Content-Type: application/json');
    $action = $_GET['action'] ?? '';

    // Public actions (no auth needed)
    if ($action === 'services_status') {
        $services = ["fapi-gateka", "fapi-bulkhours", "fapi-puppeteer", "fapi-stealth"];
        $res = [];
        foreach ($services as $svc) {
            $output = [];
            exec("systemctl is-active " . escapeshellarg($svc) . " 2>&1", $output);
            $state = trim($output[0] ?? "unknown");

            $port_output = [];
            exec("grep -oP '(?<=--port )\\d+' /etc/systemd/system/" . escapeshellarg($svc) . ".service 2>/dev/null", $port_output);
            $port = trim($port_output[0] ?? "");

            $res[] = ["name" => $svc, "status" => $state, "port" => $port];
        }
        echo json_encode(["msg" => "ok", "res" => $res]);
        exit;
    }

    // ── Admin actions: require authentication + admin role ──
    require_once(__DIR__ . '/utils.php');
    configure_session_lifetime(12);
    if (session_status() == PHP_SESSION_NONE) session_start();
    if (!isset($_SESSION['email'])) {
        echo json_encode(["msg" => "error", "res" => "Authentication required"]);
        exit;
    }
    // Check admin role for sensitive actions
    $admin_actions = ['create_user', 'update_user_role', 'delete_user', 'api_usage', 'impersonate', 'analytics', 'invite'];
    if (in_array($action, $admin_actions)) {
        $link = connect_db();
        $uid = intval($_SESSION['usid'] ?? 0);
        $stmt = $link->prepare("SELECT role FROM `users` WHERE usid=?");
        $stmt->bind_param('i', $uid);
        $stmt->execute();
        $rr = $stmt->get_result();
        $role = ($row = $rr->fetch_assoc()) ? ($row['role'] ?? 'user') : 'user';
        $stmt->close();
        close_db($link);
        if ($role !== 'admin') {
            echo json_encode(["msg" => "error", "res" => "Admin access required"]);
            exit;
        }
    }

    if ($action === 'service_manage' && $_SERVER["REQUEST_METHOD"] === "POST") {
        $svc = trim($_POST["service"] ?? "");
        $op  = trim($_POST["op"] ?? "restart");
        $allowed_svcs = ["fapi-gateka", "fapi-bulkhours", "fapi-puppeteer", "fapi-stealth"];
        $allowed_ops  = ["start", "stop", "restart"];
        if (!in_array($svc, $allowed_svcs) || !in_array($op, $allowed_ops)) {
            echo json_encode(["msg" => "error", "res" => "Not allowed"]);
        } else {
            $output = [];
            $status = 0;
            exec("sudo -n /usr/local/sbin/manage-fapi " . escapeshellarg($svc) . " " . escapeshellarg($op) . " 2>&1", $output, $status);
            echo json_encode(["msg" => $status === 0 ? "ok" : "error", "res" => $svc . " " . $op . ($status === 0 ? " ok" : " failed")]);
        }
    } else if ($action === 'list_users') {
        require_once(__DIR__ . '/utils.php');
        configure_session_lifetime(12);
        if (session_status() == PHP_SESSION_NONE) session_start();
        $link = connect_db();
        $result = mysqli_query($link, "SELECT usid, firstname, lastname, email, phone, company, role, created_at, last_login FROM `users` ORDER BY usid");
        $users = [];
        while ($row = mysqli_fetch_assoc($result)) { $users[] = $row; }
        close_db($link);
        echo json_encode(["msg" => "ok", "res" => $users]);
    } else if ($action === 'create_user' && $_SERVER["REQUEST_METHOD"] === "POST") {
        require_once(__DIR__ . '/utils.php');
        $b = json_decode(file_get_contents('php://input'), true) ?? [];
        $firstname = trim($b['firstname'] ?? '');
        $lastname = trim($b['lastname'] ?? '');
        $email = trim($b['email'] ?? '');
        $phone = trim($b['phone'] ?? '');
        $company = trim($b['company'] ?? '');
        $role = trim($b['role'] ?? 'user');
        if ($email === '' || $firstname === '') {
            echo json_encode(["msg" => "error", "res" => "Firstname and email required"]);
        } else {
            try {
                $password = substr(bin2hex(random_bytes(6)), 0, 12);
                $hash = password_hash($password, PASSWORD_DEFAULT);
                $link = connect_db();
                $stmt = $link->prepare("INSERT INTO `users` (firstname, lastname, email, phone, company, role, pass) VALUES (?,?,?,?,?,?,?)");
                $stmt->bind_param('sssssss', $firstname, $lastname, $email, $phone, $company, $role, $hash);
                if ($stmt->execute()) {
                    $newId = $stmt->insert_id;
                    echo json_encode(["msg" => "ok", "res" => ["usid" => $newId, "password" => $password]]);
                } else {
                    echo json_encode(["msg" => "error", "res" => "SQL: " . $stmt->error]);
                }
                $stmt->close();
                close_db($link);
            } catch (Exception $e) {
                echo json_encode(["msg" => "error", "res" => "Exception: " . $e->getMessage()]);
            }
        }
    } else if ($action === 'update_user_role' && $_SERVER["REQUEST_METHOD"] === "POST") {
        require_once(__DIR__ . '/utils.php');
        $b = json_decode(file_get_contents('php://input'), true) ?? [];
        $usid = intval($b['usid'] ?? 0);
        $role = trim($b['role'] ?? 'user');
        $allowed_roles = ['user', 'admin', 'client'];
        if ($usid <= 0 || !in_array($role, $allowed_roles)) {
            echo json_encode(["msg" => "error", "res" => "Invalid"]);
        } else {
            $link = connect_db();
            $stmt = $link->prepare("UPDATE `users` SET role=? WHERE usid=?");
            $stmt->bind_param('si', $role, $usid);
            $stmt->execute();
            $stmt->close();
            close_db($link);
            echo json_encode(["msg" => "ok", "res" => "updated"]);
        }
    } else if ($action === 'delete_user' && $_SERVER["REQUEST_METHOD"] === "POST") {
        require_once(__DIR__ . '/utils.php');
        $b = json_decode(file_get_contents('php://input'), true) ?? [];
        $usid = intval($b['usid'] ?? 0);
        if ($usid <= 0) {
            echo json_encode(["msg" => "error", "res" => "Invalid"]);
        } else {
            $link = connect_db();
            $stmt = $link->prepare("DELETE FROM `users` WHERE usid=?");
            $stmt->bind_param('i', $usid);
            $stmt->execute();
            $stmt->close();
            close_db($link);
            echo json_encode(["msg" => "ok", "res" => "deleted"]);
        }
    } else if ($action === 'impersonate' && $_SERVER["REQUEST_METHOD"] === "POST") {
        require_once(__DIR__ . '/utils.php');
        $b = json_decode(file_get_contents('php://input'), true) ?? [];
        $target = intval($b['usid'] ?? 0);
        if ($target <= 0) {
            echo json_encode(["msg" => "error", "res" => "Invalid user"]);
        } else {
            $link = connect_db();
            $stmt = $link->prepare("SELECT usid, firstname, lastname, email FROM `users` WHERE usid=?");
            $stmt->bind_param('i', $target);
            $stmt->execute();
            $row = $stmt->get_result()->fetch_assoc();
            $stmt->close();
            close_db($link);
            if (!$row) {
                echo json_encode(["msg" => "error", "res" => "User not found"]);
            } else {
                $_SESSION['admin_original_usid'] = $_SESSION['usid'];
                $_SESSION['admin_original_email'] = $_SESSION['email'];
                $_SESSION['admin_original_firstname'] = $_SESSION['firstname'] ?? '';
                $_SESSION['admin_original_lastname'] = $_SESSION['lastname'] ?? '';
                $_SESSION['usid'] = $row['usid'];
                $_SESSION['email'] = $row['email'];
                $_SESSION['firstname'] = $row['firstname'];
                $_SESSION['lastname'] = $row['lastname'];
                echo json_encode(["msg" => "ok", "res" => "Now viewing as " . $row['firstname'] . " " . $row['lastname']]);
            }
        }
    } else if ($action === 'restore_session') {
        if (!isset($_SESSION['admin_original_usid'])) {
            echo json_encode(["msg" => "error", "res" => "Not impersonating"]);
        } else {
            $_SESSION['usid'] = $_SESSION['admin_original_usid'];
            $_SESSION['email'] = $_SESSION['admin_original_email'];
            $_SESSION['firstname'] = $_SESSION['admin_original_firstname'];
            $_SESSION['lastname'] = $_SESSION['admin_original_lastname'];
            unset($_SESSION['admin_original_usid'], $_SESSION['admin_original_email'], $_SESSION['admin_original_firstname'], $_SESSION['admin_original_lastname']);
            echo json_encode(["msg" => "ok", "res" => "Restored"]);
        }
    } else if ($action === 'api_usage') {
        $result = [];

        // Anthropic: verify key with a minimal message call
        $ak = ($_SERVER['ANTHROPIC_API_KEY'] ?? getenv('ANTHROPIC_API_KEY')) ?: '';
        if ($ak) {
            $ch = curl_init('https://api.anthropic.com/v1/messages');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
                'model' => 'claude-haiku-4-5-20251001',
                'max_tokens' => 1,
                'messages' => [['role' => 'user', 'content' => 'hi']],
            ]));
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'x-api-key: '.$ak,
                'anthropic-version: 2023-06-01',
                'content-type: application/json',
            ]);
            $resp = curl_exec($ch);
            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
            $data = json_decode($resp, true);
            $key_hint = substr($ak, 0, 12) . '...' . substr($ak, -4);
            $result['anthropic'] = [
                'status' => $code,
                'data' => [
                    'valid' => $code === 200,
                    'key' => $key_hint,
                    'model' => $data['model'] ?? null,
                    'tier' => $data['usage']['service_tier'] ?? null,
                ],
            ];
        } else {
            $result['anthropic'] = ['status' => 0, 'data' => null];
        }

        // OpenAI: verify key with models list
        $ok = ($_SERVER['OPENAI_API_KEY'] ?? getenv('OPENAI_API_KEY')) ?: '';
        if ($ok) {
            $ch = curl_init('https://api.openai.com/v1/models?limit=1');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer '.$ok]);
            $resp = curl_exec($ch);
            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
            $key_hint = substr($ok, 0, 7) . '...' . substr($ok, -4);
            $result['openai'] = [
                'status' => $code,
                'data' => [
                    'valid' => $code === 200,
                    'key' => $key_hint,
                ],
            ];
        } else {
            $result['openai'] = ['status' => 0, 'data' => null];
        }

        echo json_encode(["msg" => "ok", "res" => $result]);
    } else if ($action === 'invite' && $_SERVER["REQUEST_METHOD"] === "POST") {
        $body = json_decode(file_get_contents('php://input'), true);
        $usid = intval($body['usid'] ?? 0);
        if (!$usid) { echo json_encode(["msg" => "error", "res" => "Missing usid"]); exit; }

        // Get user info
        $dbres = do_query("SELECT u.firstname, u.lastname, u.email, "
                        . "  (SELECT 1 FROM user_products WHERE usid=u.usid AND product='gateka') AS gateka "
                        . "FROM users u WHERE u.usid=" . $usid);
        $user = mysqli_fetch_assoc($dbres);
        if (!$user || !$user['email']) { echo json_encode(["msg" => "error", "res" => "User not found"]); exit; }

        // Generate invite token
        $token = bin2hex(random_bytes(32));
        $link = connect_db();
        $escaped_token = mysqli_real_escape_string($link, $token);
        mysqli_query($link, "UPDATE `users` SET invite_token='" . $escaped_token . "', invite_sent_at=NOW() WHERE usid=" . $usid);
        // Grant gateka product access (no-op if already granted)
        mysqli_query($link, "INSERT IGNORE INTO user_products (usid, product, role) VALUES (" . $usid . ", 'gateka', 'user')");
        close_db($link);

        // Build invite link
        $invite_url = "https://gateka.fr/invite.php?token=" . $token;
        $name = trim($user['firstname'] . ' ' . ($user['lastname'] ?? ''));

        // Send email
        $subject = "Invitation Gateka — Configurez votre accès";
        $esc_name = htmlspecialchars($name);
        $body_html = <<<HTML
<div style="font-family:'Helvetica Neue',Arial,sans-serif;max-width:520px;margin:0 auto">
  <!-- Header -->
  <div style="background:#faf6f1;border-radius:12px 12px 0 0;padding:32px 36px;text-align:center;border:1px solid #e8ddd2;border-bottom:none">
    <svg width="40" height="40" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg" style="display:block;margin:0 auto 12px">
      <path d="M58 28c-4-4-9-6-14-6C31.5 22 22 31.5 22 44s9.5 22 22 22c5 0 9.5-2 13-5V50H46" fill="none" stroke="#e07a5f" stroke-width="7" stroke-linecap="square" stroke-linejoin="miter"/>
    </svg>
    <div style="font-size:22px;font-weight:800;color:#2c1810;letter-spacing:1px">GATEKA</div>
  </div>
  <!-- Body -->
  <div style="background:#ffffff;padding:36px;border-left:1px solid #e8ddd2;border-right:1px solid #e8ddd2">
    <p style="font-size:16px;color:#2c1810;margin:0 0 20px;line-height:1.6">
      Bonjour <strong style="color:#e07a5f">{$esc_name}</strong>,
    </p>
    <p style="font-size:14px;color:#6b4d3e;margin:0 0 28px;line-height:1.7">
      Vous êtes invité(e) à rejoindre la plateforme <strong style="color:#2c1810">Gateka</strong>.<br/>
      Cliquez ci-dessous pour créer votre mot de passe et accéder à votre espace projet.
    </p>
    <div style="text-align:center;margin:0 0 28px">
      <a href="{$invite_url}" style="display:inline-block;padding:14px 36px;background:#e07a5f;color:#ffffff;border-radius:8px;text-decoration:none;font-weight:700;font-size:15px;letter-spacing:0.3px">
        Configurer mon accès →
      </a>
    </div>
    <p style="font-size:12px;color:#9a7b6a;margin:0 0 8px;line-height:1.5">
      Ou copiez ce lien dans votre navigateur :
    </p>
    <p style="font-size:12px;color:#c96a50;margin:0 0 24px;word-break:break-all;background:#fdf2ec;padding:10px 14px;border-radius:6px;border:1px solid #f0d5c9">
      {$invite_url}
    </p>
    <div style="border-top:1px solid #e8ddd2;padding-top:20px;margin-top:8px">
      <p style="font-size:12px;color:#9a7b6a;margin:0;line-height:1.5">
        Ce lien est à usage unique et vous est personnel.
      </p>
    </div>
  </div>
  <!-- Footer -->
  <div style="background:#faf6f1;border-radius:0 0 12px 12px;padding:20px 36px;text-align:center;border:1px solid #e8ddd2;border-top:none">
    <p style="font-size:12px;color:#9a7b6a;margin:0">
      <a href="https://gateka.fr" style="color:#e07a5f;text-decoration:none;font-weight:600">www.gateka.fr</a>
      &nbsp;·&nbsp; contact@gateka.fr
    </p>
  </div>
</div>
HTML;

        send_mail($subject, $body_html, $user['email']);

        echo json_encode(["msg" => "ok", "res" => "Invitation envoyée à " . $user['email']]);

    } else if ($action === 'analytics') {
        $days = intval($_GET['days'] ?? 30);
        $site_filter = $_GET['site'] ?? '';
        $where = "WHERE created_at >= DATE_SUB(NOW(), INTERVAL $days DAY)";
        if ($site_filter) {
            $link = connect_db();
            $site_filter = mysqli_real_escape_string($link, $site_filter);
            close_db($link);
            $where .= " AND site='$site_filter'";
        }

        // Page views per day
        $views_day = [];
        $r = do_query("SELECT DATE(created_at) as d, COUNT(*) as v, COUNT(DISTINCT session_hash) as u FROM analytics $where GROUP BY d ORDER BY d");
        while ($row = mysqli_fetch_assoc($r)) $views_day[] = $row;

        // Top pages
        $top_pages = [];
        $r = do_query("SELECT path, COUNT(*) as v FROM analytics $where GROUP BY path ORDER BY v DESC LIMIT 20");
        while ($row = mysqli_fetch_assoc($r)) $top_pages[] = $row;

        // Top referrers
        $top_refs = [];
        $r = do_query("SELECT referrer, COUNT(*) as v FROM analytics $where AND referrer != '' GROUP BY referrer ORDER BY v DESC LIMIT 10");
        while ($row = mysqli_fetch_assoc($r)) $top_refs[] = $row;

        // Devices
        $devices = [];
        $r = do_query("SELECT device, COUNT(*) as v FROM analytics $where GROUP BY device ORDER BY v DESC");
        while ($row = mysqli_fetch_assoc($r)) $devices[] = $row;

        // Browsers
        $browsers = [];
        $r = do_query("SELECT browser, COUNT(*) as v FROM analytics $where GROUP BY browser ORDER BY v DESC");
        while ($row = mysqli_fetch_assoc($r)) $browsers[] = $row;

        // Countries
        $countries = [];
        $r = do_query("SELECT country, COUNT(*) as v FROM analytics $where GROUP BY country ORDER BY v DESC LIMIT 10");
        while ($row = mysqli_fetch_assoc($r)) $countries[] = $row;

        // Sites
        $sites = [];
        $r = do_query("SELECT site, COUNT(*) as v FROM analytics WHERE created_at >= DATE_SUB(NOW(), INTERVAL $days DAY) GROUP BY site ORDER BY v DESC");
        while ($row = mysqli_fetch_assoc($r)) $sites[] = $row;

        echo json_encode(["msg" => "ok", "res" => [
            "views_day" => $views_day, "top_pages" => $top_pages, "top_refs" => $top_refs,
            "devices" => $devices, "browsers" => $browsers, "countries" => $countries, "sites" => $sites,
        ]]);

    } else {
        echo json_encode(["msg" => "error", "res" => "Unknown action"]);
    }
    exit;
}
?>
<?php
// If logged in, use standard header
require_once('utils.php');
configure_session_lifetime(12);
if (session_status() == PHP_SESSION_NONE) session_start();
if (isset($_SESSION['email'])) {
    include('header.php');
    $isImpersonating = isset($_SESSION['admin_original_usid']);
?>
<?php if ($isImpersonating): ?>
<div style="max-width:700px;margin:12px auto;padding:0 16px">
  <div style="background:#f59e0b;color:#1a1a1a;padding:8px 16px;border-radius:8px;display:flex;align-items:center;gap:10px;font-size:13px;font-weight:600;">
    <i class="fa-solid fa-user-secret"></i>
    Viewing as: <?php echo htmlspecialchars($_SESSION['firstname'] . ' ' . ($_SESSION['lastname'] ?? '')); ?>
    <button onclick="restoreSession()" style="margin-left:auto;padding:5px 12px;border:none;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;background:#ef4444;color:#fff;">
      <i class="fa-solid fa-arrow-rotate-left"></i> Restore my session
    </button>
  </div>
</div>
<script>
function restoreSession(){
  fetch('admin.php?api=1&action=restore_session').then(function(r){return r.json();}).then(function(d){
    if(d.msg==='ok') window.location.href='admin.php';
    else alert(d.res);
  });
}
</script>
<?php endif; ?>
<?php
// Fetch a Gateka embed token for the kanban widget on the Projets tab
$gateka_token = '';
try {
    $link = connect_db();
    if ($link) {
        $stmt = $link->prepare("SELECT token FROM embed_tokens WHERE product='Stealth' ORDER BY created_at DESC LIMIT 1");
        if ($stmt) {
            $stmt->execute();
            $rr = $stmt->get_result();
            if ($row = $rr->fetch_assoc()) { $gateka_token = $row['token']; }
            $stmt->close();
        }
        close_db($link);
    }
} catch (Exception $e) { /* best effort */ }
?>
<!-- ── Admin tabs (Services / Analytics / API / Users / Projets / Profil) ── -->
<style>
.adm-tabs{max-width:1100px;margin:24px auto 0;padding:0 16px;display:flex;gap:4px;border-bottom:1px solid var(--color-border);overflow-x:auto}
.adm-tab{padding:10px 18px;background:none;border:none;border-bottom:2px solid transparent;color:var(--color-text-muted);font-size:13px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;white-space:nowrap;transition:all .15s;font-family:inherit}
.adm-tab:hover{color:var(--color-text-primary)}
.adm-tab.is-active{color:var(--color-accent-blue,#3b82f6);border-bottom-color:var(--color-accent-blue,#3b82f6)}
.adm-tab i{font-size:13px}
.adm-pane{display:none}
.adm-pane.is-active{display:block}
</style>
<div class="adm-tabs" role="tablist">
  <button class="adm-tab" data-pane="pane-services" type="button"><i class="fa-solid fa-server"></i> Services</button>
  <button class="adm-tab is-active" data-pane="pane-analytics" type="button"><i class="fa-solid fa-chart-bar"></i> Analytics</button>
  <button class="adm-tab" data-pane="pane-projects" type="button"><i class="fa-solid fa-columns"></i> Projets</button>
  <button class="adm-tab" data-pane="pane-profile" type="button"><i class="fa-solid fa-user"></i> Profil</button>
  <button class="adm-tab" data-pane="pane-api" type="button"><i class="fa-solid fa-coins"></i> API Usage</button>
  <button class="adm-tab" data-pane="pane-users" type="button"><i class="fa-solid fa-users-gear"></i> Users</button>
</div>

<div class="adm-pane" id="pane-services">
<style>
.svc-grid{max-width:700px;margin:20px auto;padding:0 16px}
.svc-grid h2{font-size:20px;font-weight:700;margin-bottom:20px;display:flex;align-items:center;gap:10px}
.svc-card{display:flex;align-items:center;gap:14px;padding:14px 18px;margin-bottom:8px;border-radius:10px;background:var(--color-bg-surface);border:1px solid var(--color-border)}
.svc-name{font-weight:600;font-size:15px;flex:1}
.svc-port{color:var(--color-text-muted);font-size:13px;width:60px}
.svc-badge{padding:3px 10px;border-radius:12px;font-size:11px;font-weight:700;text-transform:uppercase;min-width:68px;text-align:center}
.svc-badge.active{background:rgba(34,197,94,.15);color:#22c55e}
.svc-badge.inactive,.svc-badge.failed{background:rgba(239,68,68,.15);color:#ef4444}
.svc-badge.unknown{background:rgba(245,158,11,.15);color:#f59e0b}
.svc-actions{display:flex;gap:6px}
.svc-btn{padding:5px 12px;border:none;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:opacity .15s}
.svc-btn:hover{opacity:.8}
.svc-btn:disabled{opacity:.3;cursor:not-allowed}
.svc-btn.start{background:#22c55e;color:#fff}
.svc-btn.restart{background:var(--color-accent-blue);color:#fff}
.svc-btn.stop{background:var(--color-accent-red);color:#fff}
</style>
<div class="svc-grid">
  <h2><i class="fa-solid fa-server"></i> Services</h2>
  <div id="svc-list"><i class="fa-solid fa-spinner fa-spin"></i> Loading...</div>
</div>
<script>
(function(){
  var el=document.getElementById('svc-list');
  function esc(s){var d=document.createElement('div');d.textContent=s;return d.innerHTML;}
  function bc(s){return s==='active'?'active':(s==='inactive'||s==='failed'?s:'unknown');}
  function render(svcs){
    el.innerHTML='';
    svcs.forEach(function(s){
      var up=s.status==='active';
      var d=document.createElement('div');d.className='svc-card';
      d.innerHTML='<span class="svc-name">'+esc(s.name)+'</span><span class="svc-port">'+(s.port?':'+esc(s.port):'')+'</span><span class="svc-badge '+bc(s.status)+'">'+esc(s.status)+'</span><span class="svc-actions">'+(!up?'<button class="svc-btn start" data-s="'+esc(s.name)+'" data-o="start">Start</button>':'')+(up?'<button class="svc-btn restart" data-s="'+esc(s.name)+'" data-o="restart">Restart</button>':'')+(up?'<button class="svc-btn stop" data-s="'+esc(s.name)+'" data-o="stop">Stop</button>':'')+'</span>';
      el.appendChild(d);
    });
    el.querySelectorAll('.svc-btn').forEach(function(b){b.addEventListener('click',function(){manage(b.dataset.s,b.dataset.o);});});
  }
  function load(){fetch('admin.php?api=1&action=services_status').then(function(r){return r.json();}).then(function(d){if(d.msg==='ok')render(d.res);}).catch(function(){el.textContent='Error loading services';});}
  function manage(svc,op){el.querySelectorAll('.svc-btn').forEach(function(b){b.disabled=true;});var body=new FormData();body.append('service',svc);body.append('op',op);fetch('admin.php?api=1&action=service_manage',{method:'POST',body:body}).then(function(r){return r.json();}).then(function(d){if(d.msg!=='ok')alert(d.res);setTimeout(load,1000);}).catch(function(){alert('Request failed');load();});}
  load();setInterval(load,10000);
})();
</script>
</div><!-- /pane-services -->

<div class="adm-pane is-active" id="pane-analytics">
<!-- ── Admin: User Management ── -->
<style>
.admin-panel{max-width:900px;margin:40px auto;padding:0 16px}
.admin-panel h2{font-size:20px;font-weight:700;margin-bottom:16px;display:flex;align-items:center;gap:10px}
.admin-table{width:100%;border-collapse:collapse;font-size:13px}
.admin-table th{text-align:left;padding:10px 12px;border-bottom:2px solid var(--color-border);color:var(--color-text-muted);font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.5px}
.admin-table td{padding:8px 12px;border-bottom:1px solid var(--color-border);vertical-align:middle}
.admin-table tr:hover td{background:var(--color-bg-surface)}
.admin-role{padding:2px 8px;border-radius:10px;font-size:11px;font-weight:600;cursor:pointer;border:none}
.admin-role.admin{background:rgba(76,120,255,.15);color:var(--color-accent-blue)}
.admin-role.user{background:rgba(180,180,180,.12);color:var(--color-text-muted)}
.admin-role.client{background:rgba(34,197,94,.15);color:#22c55e}
.admin-del{background:none;border:none;color:var(--color-text-muted);cursor:pointer;font-size:14px;padding:4px 8px;border-radius:6px;transition:all .15s}
.admin-del:hover{color:var(--color-accent-red);background:rgba(239,68,68,.1)}
.admin-new{display:grid;grid-template-columns:1fr 1fr 1fr 1fr 1fr auto;gap:8px;margin-bottom:20px;align-items:end}
.admin-new label{display:block;font-size:11px;font-weight:600;color:var(--color-text-muted);margin-bottom:3px}
.admin-new input,.admin-new select{width:100%;padding:8px 10px;border-radius:8px;border:1px solid var(--color-border);background:var(--color-bg-surface);color:var(--color-text-primary);font-size:13px;font-family:inherit;outline:none}
.admin-new input:focus,.admin-new select:focus{border-color:var(--color-accent-blue)}
.admin-new input::placeholder{color:var(--color-text-placeholder)}
.admin-add{padding:8px 16px;border:none;border-radius:8px;background:var(--color-accent-blue);color:#fff;font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap;transition:opacity .15s}
.admin-add:hover{opacity:.85}
.admin-pass{font-family:monospace;background:var(--color-bg-elevated);padding:2px 8px;border-radius:4px;font-size:12px;user-select:all;cursor:pointer}
.admin-toast{position:fixed;bottom:80px;right:24px;padding:10px 20px;border-radius:8px;font-size:13px;font-weight:600;color:#fff;background:#22c55e;box-shadow:0 4px 16px rgba(0,0,0,.3);opacity:0;transition:opacity .3s;pointer-events:none;z-index:999}
.admin-toast.show{opacity:1}
@media(max-width:800px){.admin-new{grid-template-columns:1fr 1fr;}}
</style>

<!-- Analytics -->
<div class="admin-panel" style="margin-bottom:20px">
  <h2><i class="fa-solid fa-chart-bar"></i> Analytics</h2>
  <div style="display:flex;gap:10px;margin-bottom:14px;align-items:center">
    <select id="ana-days" onchange="loadAnalytics()" style="padding:5px 10px;border-radius:6px;border:1px solid var(--color-border);background:var(--color-bg-surface);color:var(--color-text-primary);font-size:12px">
      <option value="7">7 days</option><option value="30" selected>30 days</option><option value="90">90 days</option><option value="365">1 year</option>
    </select>
    <select id="ana-site" onchange="loadAnalytics()" style="padding:5px 10px;border-radius:6px;border:1px solid var(--color-border);background:var(--color-bg-surface);color:var(--color-text-primary);font-size:12px">
      <option value="">All sites</option>
    </select>
  </div>
  <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:14px" id="ana-totals">
    <div class="api-card"><div class="api-card-body" style="text-align:center;padding:12px"><div style="font-size:22px;font-weight:800" id="ana-views">-</div><div style="font-size:11px;color:var(--color-text-muted)">Page views</div></div></div>
    <div class="api-card"><div class="api-card-body" style="text-align:center;padding:12px"><div style="font-size:22px;font-weight:800" id="ana-visitors">-</div><div style="font-size:11px;color:var(--color-text-muted)">Visitors</div></div></div>
    <div class="api-card"><div class="api-card-body" style="text-align:center;padding:12px"><div style="font-size:22px;font-weight:800" id="ana-pages">-</div><div style="font-size:11px;color:var(--color-text-muted)">Pages</div></div></div>
    <div class="api-card"><div class="api-card-body" style="text-align:center;padding:12px"><div style="font-size:22px;font-weight:800" id="ana-refs">-</div><div style="font-size:11px;color:var(--color-text-muted)">Referrers</div></div></div>
  </div>
  <div style="display:grid;grid-template-columns:2fr 1fr 1fr;gap:14px">
    <div>
      <div style="font-size:12px;font-weight:600;color:var(--color-text-muted);margin-bottom:6px">Top pages</div>
      <div id="ana-top-pages" style="font-size:12px"></div>
    </div>
    <div>
      <div style="font-size:12px;font-weight:600;color:var(--color-text-muted);margin-bottom:6px">Devices</div>
      <div id="ana-devices" style="font-size:12px"></div>
    </div>
    <div>
      <div style="font-size:12px;font-weight:600;color:var(--color-text-muted);margin-bottom:6px">Countries</div>
      <div id="ana-countries" style="font-size:12px"></div>
    </div>
  </div>
</div>
<script>
function loadAnalytics(){
  var days=document.getElementById('ana-days').value;
  var site=document.getElementById('ana-site').value;
  fetch('admin.php?api=1&action=analytics&days='+days+'&site='+encodeURIComponent(site))
    .then(function(r){return r.json()})
    .then(function(d){
      if(d.msg!=='ok')return;
      var r=d.res;
      // Totals
      var tv=0,tu=0;
      r.views_day.forEach(function(v){tv+=parseInt(v.v);tu+=parseInt(v.u)});
      document.getElementById('ana-views').textContent=tv.toLocaleString();
      document.getElementById('ana-visitors').textContent=tu.toLocaleString();
      document.getElementById('ana-pages').textContent=r.top_pages.length;
      document.getElementById('ana-refs').textContent=r.top_refs.length;
      // Sites dropdown
      var sel=document.getElementById('ana-site');
      var cur=sel.value;
      sel.innerHTML='<option value="">All sites</option>';
      r.sites.forEach(function(s){sel.innerHTML+='<option value="'+s.site+'"'+(s.site===cur?' selected':'')+'>'+s.site+' ('+s.v+')</option>'});
      // Top pages
      document.getElementById('ana-top-pages').innerHTML=r.top_pages.slice(0,10).map(function(p){
        return '<div style="display:flex;justify-content:space-between;padding:3px 0;border-bottom:1px solid var(--color-border)"><span style="color:var(--color-text-primary)">'+p.path+'</span><span style="color:var(--color-text-muted)">'+p.v+'</span></div>';
      }).join('');
      // Devices
      document.getElementById('ana-devices').innerHTML=r.devices.map(function(d){
        return '<div style="display:flex;justify-content:space-between;padding:3px 0"><span>'+d.device+'</span><span style="color:var(--color-text-muted)">'+d.v+'</span></div>';
      }).join('');
      // Countries
      document.getElementById('ana-countries').innerHTML=r.countries.map(function(c){
        return '<div style="display:flex;justify-content:space-between;padding:3px 0"><span>'+c.country+'</span><span style="color:var(--color-text-muted)">'+c.v+'</span></div>';
      }).join('');
    });
}
loadAnalytics();
</script>
</div><!-- /pane-analytics -->

<div class="adm-pane" id="pane-api">
<div class="admin-panel" style="margin-bottom:0">
  <h2><i class="fa-solid fa-coins"></i> API Consumption</h2>
  <div style="display:flex;gap:16px;flex-wrap:wrap;margin-bottom:10px">
    <div id="api-anthropic" class="api-card"><div class="api-card-head"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Anthropic_logo.svg/200px-Anthropic_logo.svg.png" alt="Anthropic" style="height:20px;filter:brightness(0) invert(1)"> Anthropic</div><div class="api-card-body"><i class="fa-solid fa-spinner fa-spin"></i></div></div>
    <div id="api-openai" class="api-card"><div class="api-card-head"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/OpenAI_Logo.svg/200px-OpenAI_Logo.svg.png" alt="OpenAI" style="height:18px;filter:brightness(0) invert(1)"> OpenAI</div><div class="api-card-body"><i class="fa-solid fa-spinner fa-spin"></i></div></div>
  </div>
</div>
<style>
.api-card{flex:1;min-width:280px;background:var(--color-bg-surface);border:1px solid var(--color-border);border-radius:12px;overflow:hidden}
.api-card-head{padding:12px 16px;font-weight:600;font-size:14px;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--color-border)}
.api-card-body{padding:16px;font-size:13px;color:var(--color-text-secondary);line-height:1.8}
.api-card-body .api-row{display:flex;justify-content:space-between;align-items:center}
.api-card-body .api-label{color:var(--color-text-muted)}
.api-card-body .api-value{font-weight:600;color:var(--color-text-primary);font-family:monospace}
.api-card-body .api-value.green{color:#22c55e}
.api-card-body .api-value.red{color:#ef4444}
.api-card-body .api-value.yellow{color:#f59e0b}
</style>
<script>
(function(){
  fetch('admin.php?api=1&action=api_usage').then(function(r){return r.json();}).then(function(d){
    if(d.msg!=='ok')return;
    var r=d.res;

    function renderCard(el, data) {
      if (!data || !data.data) {
        el.innerHTML='<div class="api-row"><span class="api-label">Status</span><span class="api-value red">Not configured</span></div>';
        return;
      }
      var a = data.data;
      var cls = a.valid ? 'green' : 'red';
      el.innerHTML='<div class="api-row"><span class="api-label">Status</span><span class="api-value '+cls+'">'+(a.valid ? '✓ Active' : '✗ Invalid')+'</span></div>'
        +'<div class="api-row"><span class="api-label">API Key</span><span class="api-value" style="font-size:11px">'+((a.key)||'—')+'</span></div>';
      if (a.model) el.innerHTML+='<div class="api-row"><span class="api-label">Model</span><span class="api-value">'+a.model+'</span></div>';
      if (a.tier) el.innerHTML+='<div class="api-row"><span class="api-label">Tier</span><span class="api-value">'+a.tier+'</span></div>';
    }

    renderCard(document.querySelector('#api-anthropic .api-card-body'), r.anthropic);
    renderCard(document.querySelector('#api-openai .api-card-body'), r.openai);
  });
})();
</script>
</div><!-- /pane-api -->

<div class="adm-pane" id="pane-users">
<div class="admin-panel">
  <h2><i class="fa-solid fa-users-gear"></i> Utilisateurs</h2>

  <div class="admin-new" id="admin-new-form">
    <div><label>Prénom</label><input type="text" id="nu-firstname" placeholder="Jean"></div>
    <div><label>Nom</label><input type="text" id="nu-lastname" placeholder="Dupont"></div>
    <div><label>Email</label><input type="email" id="nu-email" placeholder="jean@example.com"></div>
    <div><label>Entreprise</label><input type="text" id="nu-company" placeholder="Acme SAS"></div>
    <div><label>Rôle</label><select id="nu-role"><option value="client">Client</option><option value="user">User</option><option value="admin">Admin</option></select></div>
    <button class="admin-add" onclick="createUser()"><i class="fa-solid fa-plus"></i> Créer</button>
  </div>

  <table class="admin-table">
    <thead><tr><th>ID</th><th>Prénom</th><th>Nom</th><th>Email</th><th>Entreprise</th><th>Rôle</th><th>Créé</th><th></th></tr></thead>
    <tbody id="admin-users"></tbody>
  </table>
</div>

<div class="admin-toast" id="admin-toast"></div>

<script>
(function(){
  function esc(s){var d=document.createElement('div');d.textContent=s||'';return d.innerHTML;}
  function toast(msg,ok){var t=document.getElementById('admin-toast');t.textContent=msg;t.style.background=ok?'#22c55e':'#ef4444';t.classList.add('show');setTimeout(function(){t.classList.remove('show');},3000);}

  function loadUsers(){
    fetch('admin.php?api=1&action=list_users').then(function(r){return r.json();}).then(function(d){
      if(d.msg!=='ok')return;
      var tb=document.getElementById('admin-users');tb.innerHTML='';
      d.res.forEach(function(u){
        var tr=document.createElement('tr');
        var date=u.created_at?new Date(u.created_at).toLocaleDateString():'—';
        var roleEsc=esc(u.role);
        var nameEsc=esc(u.firstname);
        tr.innerHTML='<td>'+u.usid+'</td><td>'+esc(u.firstname)+'</td><td>'+esc(u.lastname)+'</td><td>'+esc(u.email)+'</td><td>'+esc(u.company)+'</td>'
          +'<td><button class="admin-role '+roleEsc+'" data-usid="'+u.usid+'" data-role="'+roleEsc+'">'+roleEsc+'</button></td>'
          +'<td style="font-size:12px;color:var(--color-text-muted)">'+date+'</td>'
          +'<td><button class="admin-invite" style="color:var(--color-accent-gold,#f3c84b)" data-usid="'+u.usid+'" data-name="'+nameEsc+'" title="Send invite"><i class="fa-solid fa-paper-plane"></i></button></td>'
          +'<td><button class="admin-del" data-usid="'+u.usid+'" data-name="'+nameEsc+'" title="Supprimer"><i class="fa-solid fa-trash"></i></button></td>';
        tb.appendChild(tr);
      });
      tb.querySelectorAll('.admin-role').forEach(function(b){
        b.addEventListener('click',function(){cycleRole(parseInt(b.dataset.usid),b.dataset.role);});
      });
      tb.querySelectorAll('.admin-invite').forEach(function(b){
        b.addEventListener('click',function(){inviteUser(parseInt(b.dataset.usid),b.dataset.name);});
      });
      tb.querySelectorAll('.admin-del').forEach(function(b){
        b.addEventListener('click',function(){deleteUser(parseInt(b.dataset.usid),b.dataset.name);});
      });
    });
  }

  window.createUser=function(){
    var fn=document.getElementById('nu-firstname').value.trim();
    var ln=document.getElementById('nu-lastname').value.trim();
    var em=document.getElementById('nu-email').value.trim();
    var co=document.getElementById('nu-company').value.trim();
    var ro=document.getElementById('nu-role').value;
    if(!fn||!em){toast('Prénom et email requis',false);return;}
    fetch('admin.php?api=1&action=create_user',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({firstname:fn,lastname:ln,email:em,company:co,role:ro})})
      .then(function(r){return r.json();})
      .then(function(d){
        if(d.msg==='ok'){
          toast('Utilisateur créé — Mot de passe : '+d.res.password,true);
          document.getElementById('nu-firstname').value='';
          document.getElementById('nu-lastname').value='';
          document.getElementById('nu-email').value='';
          document.getElementById('nu-company').value='';
          loadUsers();
        }else{toast(d.res,false);}
      });
  };

  window.cycleRole=function(usid,current){
    var roles=['user','client','admin'];
    var next=roles[(roles.indexOf(current)+1)%roles.length];
    fetch('admin.php?api=1&action=update_user_role',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({usid:usid,role:next})})
      .then(function(r){return r.json();})
      .then(function(d){if(d.msg==='ok'){toast('Rôle → '+next,true);loadUsers();}else toast(d.res,false);});
  };

  window.inviteUser=function(usid,name){
    if(!confirm('Send invite to '+name+'?'))return;
    fetch('admin.php?api=1&action=invite',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({usid:usid})})
      .then(function(r){return r.json();})
      .then(function(d){if(d.msg==='ok'){toast(d.res,true);}else toast(d.res,false);});
  };

  window.deleteUser=function(usid,name){
    if(!confirm('Supprimer '+name+' (ID '+usid+') ?'))return;
    fetch('admin.php?api=1&action=delete_user',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({usid:usid})})
      .then(function(r){return r.json();})
      .then(function(d){if(d.msg==='ok'){toast('Supprimé',true);loadUsers();}else toast(d.res,false);});
  };

  loadUsers();
})();
</script>
</div><!-- /pane-users -->

<div class="adm-pane" id="pane-projects">
  <?php include __DIR__ . '/_product_info_panel.php'; ?>
  <?php include __DIR__ . '/_notes_panel.php'; ?>
  <div style="max-width:1100px;margin:24px auto;padding:0 16px">
    <gateka-tasks product="Stealth" api="https://gateka.fr" token="<?php echo htmlspecialchars($gateka_token); ?>"></gateka-tasks>
  </div>
</div><!-- /pane-projects -->

<script src="https://gateka.fr/gateka/static/gateka-widget.js"></script>

<div class="adm-pane" id="pane-profile">
  <div style="max-width:900px;margin:24px auto;padding:0 16px">
    <iframe src="profile.php" style="width:100%;height:calc(100vh - 200px);min-height:500px;border:none;background:transparent" title="Profile"></iframe>
  </div>
</div><!-- /pane-profile -->

<!-- ── Tab switching ── -->
<script>
(function(){
  var tabs = document.querySelectorAll('.adm-tab');
  var panes = document.querySelectorAll('.adm-pane');
  function activate(paneId){
    tabs.forEach(function(t){ t.classList.toggle('is-active', t.dataset.pane === paneId); });
    panes.forEach(function(p){ p.classList.toggle('is-active', p.id === paneId); });
    try { localStorage.setItem('stealth-admin-tab', paneId); } catch(e){}
    if (location.hash !== '#' + paneId) {
      history.replaceState(null, '', '#' + paneId);
    }
  }
  tabs.forEach(function(t){
    t.addEventListener('click', function(){ activate(t.dataset.pane); });
  });
  var initial = (location.hash || '').replace(/^#/, '') || (function(){ try { return localStorage.getItem('stealth-admin-tab') || ''; } catch(e){ return ''; } })();
  if (initial && document.getElementById(initial)) {
    activate(initial);
  }
})();
</script>

<?php include('footer.php'); exit; }
// Non-logged-in: redirect to login
header("location:index.php?signin=connect"); exit; ?>
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Gateka — Services</title>
  <link rel="icon" href="img/favicon.svg" type="image/svg+xml" />
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
  <style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Inter',system-ui,-apple-system,sans-serif;line-height:1.6;transition:background .35s,color .35s}
a{text-decoration:none;color:inherit}
button{cursor:pointer;font-family:inherit}

:root{--radius:14px;--radius-sm:10px;--transition:.3s cubic-bezier(.4,0,.2,1);--nav-h:64px}

[data-theme="dark"]{
  --accent:#3b82f6;--accent-hover:#60a5fa;--accent-glow:rgba(59,130,246,.25);
  --gold:#94a3b8;--gold-hover:#cbd5e1;
  --bg:#0a0e14;--bg2:#0f1520;--bg3:#151d2a;
  --surface:rgba(10,14,20,.8);--surface-hover:rgba(18,24,34,.85);
  --text:#e2e8f0;--text2:#94a3b8;--text3:#64748b;
  --border:rgba(51,65,85,.5);--border2:rgba(71,85,105,.45);
  --overlay-bg:rgba(10,14,20,.85);
}
[data-theme="light"]{
  --accent:#e07a5f;--accent-hover:#c96a50;--accent-glow:rgba(224,122,95,.2);
  --gold:#f2cc8f;--gold-hover:#e8b96e;
  --bg:#faf6f1;--bg2:#fff8f2;--bg3:#f5ede6;
  --surface:rgba(255,248,242,.92);--surface-hover:rgba(245,237,230,.95);
  --text:#2c1810;--text2:#6b4d3e;--text3:#9a7b6a;
  --border:rgba(180,140,115,.25);--border2:rgba(160,120,95,.2);
  --overlay-bg:rgba(250,246,241,.92);
}
body{background:var(--bg);color:var(--text);overflow-x:hidden}
.gk-gradient{background:linear-gradient(135deg,var(--accent),var(--gold));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}

/* ── Navbar ── */
.gk-nav{position:fixed;top:0;left:0;right:0;height:var(--nav-h);z-index:100;
  display:flex;align-items:center;justify-content:space-between;padding:0 32px;
  background:var(--overlay-bg);backdrop-filter:blur(18px);border-bottom:1px solid var(--border)}
.gk-nav-brand{display:flex;align-items:center;gap:10px;font-weight:800;font-size:20px;letter-spacing:1px;color:var(--text)}
.gk-nav-brand svg{height:34px;width:34px}
.gk-nav-actions{display:flex;align-items:center;gap:6px}
.gk-nav-btn{background:transparent;border:1px solid var(--border2);border-radius:var(--radius-sm);
  padding:7px 13px;font-size:13px;font-weight:600;color:var(--text2);transition:var(--transition);display:flex;align-items:center;gap:5px}
.gk-nav-btn:hover{background:var(--surface-hover);color:var(--text);border-color:var(--text3)}

/* ── Services ── */
.svc-grid{max-width:700px;margin:0 auto;padding:calc(var(--nav-h) + 30px) 16px 40px}
.svc-grid h2{font-size:20px;font-weight:700;margin-bottom:20px;display:flex;align-items:center;gap:10px}
.svc-card{display:flex;align-items:center;gap:14px;padding:14px 18px;margin-bottom:8px;
  border-radius:var(--radius-sm);background:var(--bg2);border:1px solid var(--border)}
.svc-name{font-weight:600;font-size:15px;flex:1}
.svc-port{color:var(--text3);font-size:13px;width:60px}
.svc-badge{padding:3px 10px;border-radius:12px;font-size:11px;font-weight:700;text-transform:uppercase;min-width:68px;text-align:center}
.svc-badge.active{background:rgba(34,197,94,.15);color:#22c55e}
.svc-badge.inactive,.svc-badge.failed{background:rgba(239,68,68,.15);color:#ef4444}
.svc-badge.unknown{background:rgba(245,158,11,.15);color:#f59e0b}
.svc-actions{display:flex;gap:6px}
.svc-btn{padding:5px 12px;border:none;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:opacity .15s}
.svc-btn:hover{opacity:.8}
.svc-btn:disabled{opacity:.3;cursor:not-allowed}
.svc-btn.start{background:#22c55e;color:#fff}
.svc-btn.restart{background:var(--accent);color:#fff}
.svc-btn.stop{background:#ef4444;color:#fff}
  </style>
</head>
<body>

<nav class="gk-nav">
  <a href="connect/connect.php?signin=connect" class="gk-nav-brand">
    <svg width="34" height="34" viewBox="0 0 100 100" fill="none" style="flex-shrink:0"><path d="M58 28c-4-4-9-6-14-6C31.5 22 22 31.5 22 44s9.5 22 22 22c5 0 9.5-2 13-5V50H46" fill="none" stroke="var(--accent)" stroke-width="4.5" stroke-linecap="round" stroke-linejoin="round"/><circle cx="38" cy="34" r="3" fill="var(--gold)" opacity=".7"/><circle cx="44" cy="44" r="3.5" fill="var(--gold)"/><circle cx="34" cy="48" r="2.5" fill="var(--gold)" opacity=".6"/><circle cx="42" cy="56" r="2.5" fill="var(--gold)" opacity=".55"/><circle cx="50" cy="36" r="2" fill="var(--gold)" opacity=".5"/><circle cx="32" cy="38" r="2" fill="var(--gold)" opacity=".45"/><line x1="38" y1="34" x2="44" y2="44" stroke="var(--gold)" stroke-width="1" opacity=".3"/><line x1="44" y1="44" x2="34" y2="48" stroke="var(--gold)" stroke-width="1" opacity=".25"/><line x1="34" y1="48" x2="42" y2="56" stroke="var(--gold)" stroke-width="1" opacity=".25"/><line x1="38" y1="34" x2="50" y2="36" stroke="var(--gold)" stroke-width=".8" opacity=".2"/><line x1="32" y1="38" x2="38" y2="34" stroke="var(--gold)" stroke-width=".8" opacity=".2"/><line x1="32" y1="38" x2="34" y2="48" stroke="var(--gold)" stroke-width=".8" opacity=".2"/><line x1="50" y1="36" x2="44" y2="44" stroke="var(--gold)" stroke-width=".8" opacity=".2"/></svg>
    <span class="gk-gradient">Gateka</span>
  </a>
  <div class="gk-nav-actions">
    <button class="gk-nav-btn" onclick="var t=document.documentElement.dataset.theme==='dark'?'light':'dark';document.documentElement.dataset.theme=t;localStorage.setItem('gk-theme',t);this.querySelector('i').className=t==='dark'?'fa-solid fa-moon':'fa-solid fa-sun'" title="Toggle theme">
      <i class="fa-solid fa-moon"></i>
    </button>
  </div>
</nav>

<div class="svc-grid">
  <h2><i class="fa-solid fa-server"></i> Services</h2>
  <div id="svc-list"><i class="fa-solid fa-spinner fa-spin"></i> Loading...</div>
</div>

<script>
(function(){
  var saved=localStorage.getItem('gk-theme');
  if(saved)document.documentElement.dataset.theme=saved;

  var el = document.getElementById('svc-list');
  function esc(s){var d=document.createElement('div');d.textContent=s;return d.innerHTML;}
  function bc(s){return s==='active'?'active':(s==='inactive'||s==='failed'?s:'unknown');}

  function render(svcs){
    el.innerHTML='';
    svcs.forEach(function(s){
      var up=s.status==='active';
      var d=document.createElement('div');d.className='svc-card';
      d.innerHTML=
        '<span class="svc-name">'+esc(s.name)+'</span>'+
        '<span class="svc-port">'+(s.port?':'+esc(s.port):'')+'</span>'+
        '<span class="svc-badge '+bc(s.status)+'">'+esc(s.status)+'</span>'+
        '<span class="svc-actions">'+
        (!up?'<button class="svc-btn start" data-s="'+esc(s.name)+'" data-o="start">Start</button>':'')+
        (up?'<button class="svc-btn restart" data-s="'+esc(s.name)+'" data-o="restart">Restart</button>':'')+
        (up?'<button class="svc-btn stop" data-s="'+esc(s.name)+'" data-o="stop">Stop</button>':'')+
        '</span>';
      el.appendChild(d);
    });
    el.querySelectorAll('.svc-btn').forEach(function(b){
      b.addEventListener('click',function(){manage(b.dataset.s,b.dataset.o);});
    });
  }

  function load(){
    fetch('admin.php?api=1&action=services_status')
      .then(function(r){return r.json();})
      .then(function(d){if(d.msg==='ok')render(d.res);})
      .catch(function(){el.textContent='Error loading services';});
  }

  function manage(svc,op){
    el.querySelectorAll('.svc-btn').forEach(function(b){b.disabled=true;});
    var body=new FormData();body.append('service',svc);body.append('op',op);
    fetch('admin.php?api=1&action=service_manage',{method:'POST',body:body})
      .then(function(r){return r.json();})
      .then(function(d){if(d.msg!=='ok')alert(d.res);setTimeout(load,1000);})
      .catch(function(){alert('Request failed');load();});
  }

  load();
  setInterval(load,10000);
})();
</script>
</body>
</html>
