<?php
session_start();
require_once '../includes/db_connect.php';

/* ===== Хелпери ===== */
function h(?string $s): string { return htmlspecialchars((string)$s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
function json_out($data, int $code = 200) {
    http_response_code($code);
    header('Content-Type: application/json; charset=UTF-8');
    header('X-Content-Type-Options: nosniff');
    header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit();
}

/* ===== Доступ: адмін або вчитель ===== */
if (!isset($_SESSION['user_id']) || !in_array($_SESSION['role'] ?? '', ['admin', 'teacher'], true)) {
    header("Location: ../index.php");
    exit();
}

$user_id   = (int)($_SESSION['user_id'] ?? 0);
$full_name = $_SESSION['full_name'] ?? 'Адміністратор';

/* Поточна сторінка для header.php */
$current_file = basename($_SERVER['PHP_SELF'] ?? 'dashboard.php');

/* ===== CSRF (одноразовий токен на сесію) ===== */
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(16));
}
$CSRF = $_SESSION['csrf_token'];

/* ===== Повідомлення ===== */
$error = '';
$success = '';

/* ======= AJAX: оновлення порядку журналу (+/- або ручне введення) ======= */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax'], $_POST['update_order'])) {
    if (!hash_equals($CSRF, $_POST['csrf_token'] ?? '')) {
        json_out(['ok'=>false,'error'=>'CSRF'], 403);
    }

    $changed = [];
    if (!empty($_POST['order']) && is_array($_POST['order'])) {
        foreach ($_POST['order'] as $gid => $pos) {
            $group_id = (int)$gid;
            $position = max(1, (int)$pos);

            $stmt = $conn->prepare("UPDATE `groups` SET order_position = ? WHERE id = ?");
            $stmt->bind_param("ii", $position, $group_id);
            if ($stmt->execute()) {
                $changed[] = ["id"=>$group_id, "pos"=>$position];
            }
            $stmt->close();
        }
        if ($changed) {
            // Аудит-лог (без користувацьких HTML)
            $parts = array_map(fn($c) => "ID {$c['id']} → {$c['pos']}", $changed);
            $action = "Користувач {$user_id} оновив порядок журналів: " . implode(", ", $parts);
            $log = $conn->prepare("INSERT INTO `admin_logs` (user_id, action) VALUES (?, ?)");
            $log->bind_param("is", $user_id, $action);
            $log->execute(); $log->close();

            json_out(["ok"=>true, "changed"=>$changed]);
        }
    }
    json_out(["ok"=>false, "error"=>"Невірні дані"], 400);
}

/* ======= AJAX: перейменування журналу ======= */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax'], $_POST['rename_journal'])) {
    if (!hash_equals($CSRF, $_POST['csrf_token'] ?? '')) {
        json_out(['ok'=>false,'error'=>'CSRF'], 403);
    }

    $gid = (int)($_POST['group_id'] ?? 0);
    $new = trim($_POST['new_name'] ?? '');

    if ($gid <= 0) json_out(["ok"=>false, "error"=>"Невірний ID"], 400);
    if ($new === '' || mb_strlen($new) > 250) json_out(["ok"=>false, "error"=>"Некоректна назва"], 400);

    $stmt = $conn->prepare("UPDATE `groups` SET group_name = ? WHERE id = ?");
    $stmt->bind_param("si", $new, $gid);
    $ok = $stmt->execute();
    $stmt->close();

    if ($ok) {
        $safe = h($new);
        $action = "Користувач {$user_id} перейменував журнал ID {$gid} на '{$new}'";
        $log = $conn->prepare("INSERT INTO `admin_logs` (user_id, action) VALUES (?, ?)");
        $log->bind_param("is", $user_id, $action);
        $log->execute(); $log->close();

        json_out(["ok"=>true, "name"=>$safe]);
    }
    json_out(["ok"=>false, "error"=>"Помилка оновлення"], 500);
}

/* ======= Створення журналу (звичайний POST) ======= */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_journal'])) {
    if (!hash_equals($CSRF, $_POST['csrf_token'] ?? '')) {
        $error = 'Помилка безпеки (CSRF). Оновіть сторінку.';
    } else {
        $group_name = trim($_POST['journal_name'] ?? '');
        $course     = (int)($_POST['course'] ?? 0);

        if ($group_name === '') {
            $error = "Назва журналу не може бути порожньою!";
        } elseif (mb_strlen($group_name) > 250) {
            $error = "Назва журналу не може бути довшою за 250 символів!";
        } else {
            $res = $conn->query("SELECT IFNULL(MAX(order_position), 0) AS max_position FROM `groups`");
            $max_position = ($res && $res->num_rows) ? ((int)$res->fetch_assoc()['max_position'] + 1) : 1;

            $stmt = $conn->prepare("INSERT INTO `groups` (group_name, order_position, course) VALUES (?, ?, ?)");
            $stmt->bind_param("sii", $group_name, $max_position, $course);
            if ($stmt->execute()) {
                $new_group_id = $stmt->insert_id;
                $success = "Журнал '" . h($group_name) . "' успішно створений!";
                $action = "Користувач {$user_id} створив журнал '{$group_name}' (ID: {$new_group_id})";
                $log = $conn->prepare("INSERT INTO `admin_logs` (user_id, action) VALUES (?, ?)");
                $log->bind_param("is", $user_id, $action);
                $log->execute(); $log->close();
            } else {
                $error = "Помилка при створенні журналу.";
            }
            $stmt->close();
        }
    }
}

/* ======= Видалення журналу (GET з CSRF) ======= */
if (isset($_GET['delete_journal'])) {
    if (!hash_equals($CSRF, $_GET['csrf_token'] ?? '')) {
        http_response_code(403);
        die('Помилка безпеки (CSRF). Оновіть сторінку.');
    }

    $group_id = (int)$_GET['delete_journal'];

    $gname = 'невідомий журнал';
    if ($res = $conn->prepare("SELECT group_name FROM `groups` WHERE id = ?")) {
        $res->bind_param("i", $group_id);
        $res->execute();
        $r = $res->get_result()->fetch_assoc();
        if ($r && !empty($r['group_name'])) $gname = $r['group_name'];
        $res->close();
    }

    $stmt = $conn->prepare("UPDATE users SET group_id = NULL WHERE group_id = ?");
    $stmt->bind_param("i", $group_id);

    if ($stmt->execute()) {
        $stmt->close();
        $del = $conn->prepare("DELETE FROM `groups` WHERE id = ?");
        $del->bind_param("i", $group_id);
        if ($del->execute()) {
            $del->close();
            $success = "Журнал успішно видалений!";
            $action = "Користувач {$user_id} видалив журнал '{$gname}' (ID: {$group_id})";
            $log = $conn->prepare("INSERT INTO `admin_logs` (user_id, action) VALUES (?, ?)");
            $log->bind_param("is", $user_id, $action);
            $log->execute(); $log->close();
        } else {
            $error = "Не вдалося видалити журнал.";
        }
    } else {
        $error = "Не вдалося оновити користувачів перед видаленням журналу.";
        $stmt->close();
    }

    header("Location: dashboard.php");
    exit();
}

/* ======= Вибірка журналів ======= */
$groups_result = $conn->query("SELECT id, group_name, order_position, course FROM `groups` ORDER BY order_position ASC");

/* Призначимо order_position там, де 0 */
if ($groups_result && $groups_result->num_rows > 0) {
    $pos = 0;
    $groups_result->data_seek(0);
    while ($row = $groups_result->fetch_assoc()) {
        if ((int)$row['order_position'] === 0) {
            $pos++;
            $stmt = $conn->prepare("UPDATE `groups` SET order_position = ? WHERE id = ?");
            $stmt->bind_param("ii", $pos, $row['id']);
            $stmt->execute(); $stmt->close();
        } else {
            $pos = max($pos, (int)$row['order_position']);
        }
    }
    $groups_result = $conn->query("SELECT id, group_name, order_position, course FROM `groups` ORDER BY order_position ASC");
}

/* Розмір БД, версії */
$db_size_stmt = $conn->prepare("SELECT SUM(data_length + index_length) / 1024 / 1024 AS size_mb FROM information_schema.tables WHERE table_schema = DATABASE()");
$db_size_stmt->execute();
$db_size = (float)($db_size_stmt->get_result()->fetch_assoc()['size_mb'] ?? 0);
$db_size = number_format($db_size, 2);
$db_size_stmt->close();
$php_version  = phpversion();
$site_version = "5.0";

/* Активна навігація (якщо десь ще використаєш) */
$uri = $_SERVER['REQUEST_URI'] ?? '';
function is_active($needle){ global $uri; return strpos($uri, $needle) !== false ? 'active' : ''; }
?>
<!DOCTYPE html>
<html lang="uk">
<head>
    <meta charset="UTF-8">
    <meta name="robots" content="noindex, nofollow">
    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
    <title>Адмін-панель</title>
    <link rel="stylesheet" href="../assets/css/style.css">
    <style>
        :root{
            /* ===== Палітра КПКІТП (фіолетово-м'ятна) ===== */
            --mint: #a0e8d0;
            --mint-2: #89e0c5;
            --purple: #432855;
            --purple-2: #351f46;

            --bg: #f2fbf7;
            --card: rgba(255,255,255,.92);
            --text: #221a2d;
            --muted: rgba(34,26,45,.72);

            --brand: var(--purple);
            --brand-hover: var(--purple-2);

            --active: var(--mint);
            --active-border: rgba(67,40,85,.22);

            --radius:16px;
            --shadow: 0 14px 34px rgba(67,40,85,.12);
            --border: rgba(67,40,85,.14);

            --danger:#dc2626; --danger-hover:#b91c1c;
            --focus: rgba(160,232,208,.55);
        }

        *{box-sizing:border-box}
        html,body{width:100%;height:100%}

        body{
            margin:0;
            font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,"Noto Sans","Helvetica Neue",Arial;
            color:var(--text);
            overflow-x:hidden;
            background:
                radial-gradient(1100px 520px at 14% -8%, rgba(160,232,208,.75), transparent 60%),
                radial-gradient(900px 520px at 92% -6%, rgba(67,40,85,.18), transparent 60%),
                linear-gradient(180deg, #eefcf7 0%, #f6faf8 42%, #f6f7fb 100%);
        }

        .container{width:100%;max-width:1040px;padding:14px;margin:0 auto}

        .card{
            background:var(--card);
            border-radius:var(--radius);
            box-shadow:var(--shadow);
            padding:16px;
            margin-bottom:14px;
            border: 1px solid var(--border);
            backdrop-filter: blur(6px);
        }

        h1{margin:0 0 6px;font-size:22px}
        h2{margin:8px 0 6px;font-size:18px}
        .lead{color:var(--muted);font-size:14px;margin:0 0 10px}

        /* ===== Tabs ===== */
        .admin-tabs{
            display:flex;
            gap:10px;
            flex-wrap:wrap;
            align-items:center;
            margin: 2px 0 14px;
        }
        .admin-tabs a{
            display:inline-flex;
            align-items:center;
            justify-content:center;
            gap:8px;
            padding:10px 14px;
            border-radius:999px;
            text-decoration:none;
            font-weight:900;
            font-size:14px;
            color: var(--text);
            background: rgba(67,40,85,.08);
            border: 1px solid rgba(67,40,85,.18);
            box-shadow: 0 10px 22px rgba(67,40,85,.08);
            transition: transform .08s ease, box-shadow .12s ease, background .12s ease, border-color .12s ease;
        }
        .admin-tabs a:hover{
            transform: translateY(-1px);
            background: rgba(160,232,208,.45);
            border-color: rgba(67,40,85,.22);
            box-shadow: 0 14px 28px rgba(67,40,85,.10);
        }
        .admin-tabs a.active{
            color:#fff;
            background: linear-gradient(135deg, var(--purple) 0%, #4b2a61 55%, rgba(160,232,208,.95) 120%);
            border-color: rgba(255,255,255,.22);
            box-shadow: 0 18px 40px rgba(67,40,85,.18);
        }

        .alert{border-radius:12px;padding:10px 12px;margin:8px 0 12px;font-size:14px;border:1px solid transparent}
        .alert.error{background:rgba(220,38,38,.10);color:#7f1d1d;border-color:rgba(220,38,38,.25)}
        .alert.success{background:rgba(160,232,208,.35);color:#1f3b34;border-color:rgba(67,40,85,.18)}

        .btn{
            display:inline-block;
            text-decoration:none;
            padding:12px 16px;
            border-radius:12px;
            font-weight:900;
            font-size:14px;
            border:0;
            cursor:pointer;
            color:#fff;
            background: linear-gradient(135deg, var(--brand) 0%, #4b2a61 70%);
            box-shadow: 0 14px 28px rgba(67,40,85,.16);
            transition: transform .08s ease, box-shadow .12s ease, filter .12s ease;
        }
        .btn:hover{
            filter: brightness(1.05);
            transform: translateY(-1px);
            box-shadow: 0 18px 36px rgba(67,40,85,.20);
        }
        .btn-danger{background: linear-gradient(135deg, var(--danger) 0%, #b91c1c 70%) !important}
        .btn-danger:hover{filter:brightness(1.03)}
        .btn-sm{padding:8px 10px;font-size:13px;border-radius:10px;box-shadow: 0 10px 20px rgba(67,40,85,.12)}

        label{display:block;font-size:14px;font-weight:800;color:var(--text);margin-bottom:6px}
        input[type="text"], select, input[type="number"]{
            width:100%;
            max-width:420px;
            padding:12px 14px;
            border:1px solid rgba(67,40,85,.18);
            border-radius:12px;
            background:#fff;
            font-size:16px;
            outline: none;
            box-shadow: 0 10px 22px rgba(67,40,85,.06);
            transition: border-color .12s ease, box-shadow .12s ease;
        }
        input[type="text"]:focus, select:focus, input[type="number"]:focus{
            border-color: rgba(67,40,85,.32);
            box-shadow: 0 0 0 4px var(--focus), 0 14px 30px rgba(67,40,85,.10);
        }

        .journals{display:grid;gap:10px}
        .j-item{
            background: rgba(255,255,255,.92);
            border:1px solid var(--border);
            border-radius:16px;
            box-shadow: 0 14px 34px rgba(67,40,85,.10);
            padding:12px;
        }
        .j-head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}
        .j-title{font-weight:950;font-size:16px;color:var(--text);word-break:break-word;flex:1 1 auto}
        .pos-badge{
            flex:0 0 auto;
            display:inline-flex;
            align-items:center;
            justify-content:center;
            min-width:44px;
            height:34px;
            padding:0 12px;
            border-radius:999px;
            color:#fff;
            font-weight:950;
            font-size:14px;
            background: linear-gradient(135deg, var(--purple) 0%, #4b2a61 70%);
            box-shadow: 0 14px 28px rgba(67,40,85,.18);
        }
        .pos-badge.flash{box-shadow:0 0 0 4px rgba(160,232,208,.55) inset, 0 14px 28px rgba(67,40,85,.18)}
        .j-meta{width:100%;color:var(--muted);font-size:12px;margin-top:2px}

        .j-controls{display:grid;grid-template-columns: 1fr;gap:10px;align-items:center;margin-top:10px}
        .pos-input{display:flex;align-items:center;gap:6px;flex-wrap:nowrap}
        .pos-input input{width:86px;max-width:86px;text-align:center;font-weight:950}
        .bump{
            display:inline-flex;
            align-items:center;
            justify-content:center;
            width:42px;height:42px;
            border-radius:12px;
            border:1px solid rgba(67,40,85,.18);
            cursor:pointer;
            font-weight:950;
            font-size:16px;
            box-shadow: 0 10px 20px rgba(67,40,85,.10);
            transition: transform .08s ease, box-shadow .12s ease, filter .12s ease;
        }
        .bump:hover{transform: translateY(-1px); box-shadow: 0 14px 28px rgba(67,40,85,.14)}
        .bump.plus{
            background: linear-gradient(135deg, var(--purple) 0%, #4b2a61 70%);
            color:#fff;
            border-color: rgba(255,255,255,.18);
        }
        .bump.minus{
            background: rgba(160,232,208,.75);
            color: var(--purple);
            border-color: rgba(67,40,85,.22);
        }

        .row-actions{display:flex;gap:8px;justify-content:flex-end;flex-wrap:wrap}

        @media(min-width:480px){ .j-controls{grid-template-columns: auto 1fr auto} }

        .table-responsive{
            width:100%;
            overflow:auto;
            border:1px solid var(--border);
            border-radius:14px;
            background: rgba(255,255,255,.92);
            box-shadow: 0 14px 34px rgba(67,40,85,.08);
        }
        .table-responsive table{width:100%;min-width:720px;border-collapse:separate;border-spacing:0}
        .table-responsive th,.table-responsive td{padding:10px 12px;border-bottom:1px solid rgba(67,40,85,.12);text-align:center;font-size:14px}
        .table-responsive th{
            position:sticky;top:0;
            background: linear-gradient(180deg, rgba(160,232,208,.60), rgba(160,232,208,.28));
            color: var(--purple);
            z-index:1;
            border-bottom: 1px solid rgba(67,40,85,.18);
        }
        .table-responsive tr:nth-child(even) td{background: rgba(160,232,208,.12)}
        .table-responsive tr:hover td{background: rgba(160,232,208,.22)}

        .user-actions{display:flex;gap:6px;justify-content:center;flex-wrap:wrap}
    </style>
    <script>
        const CSRF = <?= json_encode($CSRF, JSON_UNESCAPED_UNICODE); ?>;

        async function apiUpdateOrder(id, newPos) {
            const fd = new FormData();
            fd.append('ajax', '1');
            fd.append('update_order', '1');
            fd.append('csrf_token', CSRF);
            fd.append(`order[${id}]`, String(newPos));

            const res = await fetch('dashboard.php', { method: 'POST', body: fd, credentials: 'same-origin' });
            if (!res.ok) throw new Error('Network');
            const data = await res.json();
            if (!data.ok) throw new Error(data.error || 'Помилка');
            return data;
        }

        async function apiRenameJournal(id, newName) {
            const fd = new FormData();
            fd.append('ajax', '1');
            fd.append('rename_journal', '1');
            fd.append('csrf_token', CSRF);
            fd.append('group_id', String(id));
            fd.append('new_name', newName);

            const res = await fetch('dashboard.php', { method: 'POST', body: fd, credentials: 'same-origin' });
            if (!res.ok) throw new Error('Network');
            const data = await res.json();
            if (!data.ok) throw new Error(data.error || 'Помилка');
            return data;
        }

        function flashBadge(badgeEl) {
            if (!badgeEl) return;
            badgeEl.classList.add('flash');
            setTimeout(() => badgeEl.classList.remove('flash'), 500);
        }

        function clampPos(n){ n = parseInt(n||'0',10)||0; return Math.max(1,n); }

        async function bumpPos(id, delta){
            const inp   = document.getElementById('ord-'+id);
            const badge = document.getElementById('badge-'+id);
            if(!inp) return;

            const next = clampPos((parseInt(inp.value||'0',10)||0) + delta);
            inp.value = next;
            if (badge) badge.textContent = '#'+next;

            try {
                await apiUpdateOrder(id, next);
                flashBadge(badge);
            } catch(e) {
                alert('Не вдалося зберегти позицію: ' + (e.message || 'Помилка'));
            }
        }

        let saveTimers = {};
        function onPosInputChange(id){
            const inp   = document.getElementById('ord-'+id);
            const badge = document.getElementById('badge-'+id);
            if(!inp) return;
            const next = clampPos(inp.value);
            inp.value = next;
            if (badge) badge.textContent = '#'+next;

            if (saveTimers[id]) clearTimeout(saveTimers[id]);
            saveTimers[id] = setTimeout(async () => {
                try {
                    await apiUpdateOrder(id, next);
                    flashBadge(badge);
                } catch(e) {
                    alert('Не вдалося зберегти позицію: ' + (e.message || 'Помилка'));
                }
            }, 200);
        }

        async function renameJournal(btnEl){
            const id   = parseInt(btnEl.dataset.id, 10);
            const cur  = btnEl.dataset.name || '';
            const next = prompt('Нова назва журналу:', cur);
            if (next === null) return;
            const trimmed = (next || '').trim();
            if (!trimmed || trimmed.length > 250) {
                alert('Некоректна назва (порожня або довша за 250 символів).');
                return;
            }
            try {
                const data = await apiRenameJournal(id, trimmed);
                const titleEl = document.getElementById('title-'+id);
                if (titleEl) titleEl.textContent = data.name;
                btnEl.dataset.name = trimmed;
            } catch(e) {
                alert('Не вдалося перейменувати: ' + (e.message || 'Помилка'));
            }
        }
    </script>
</head>
<body>

<?php require __DIR__ . '/../includes/header.php'; ?>

<main class="container">

    <?php
    $tabs = [
        ['href' => 'dashboard.php',        'label' => 'Журнали'],
        ['href' => '../journal/group_journal.php', 'label' => 'Управління журналами'],
        ['href' => 'dz/index.php',         'label' => 'Домашнє завдання'],
        ['href' => 'admin_students.php',   'label' => 'Учні'],
        ['href' => 'admin_father.php',     'label' => 'Батьки'],
        ['href' => 'admin_teachers.php',   'label' => 'Вчителі'],
        ['href' => 'admin_system.php',     'label' => 'Система'],
        ];
    ?>
    <nav class="admin-tabs" aria-label="Адмін навігація">
        <?php foreach ($tabs as $t):
            $href = (string)($t['href'] ?? '');
            $label = (string)($t['label'] ?? '');
            $active = (basename($href) === $current_file) ? 'active' : '';
        ?>
            <a class="<?= h($active) ?>" href="<?= h($href) ?>"><?= h($label) ?></a>
        <?php endforeach; ?>
    </nav>

    <section class="card">
        <h1>Вітаємо, <?= h($full_name); ?>!</h1>
        <p class="lead">Це ваша панель адміністратора.</p>
        <?php if (!empty($error)): ?><div class="alert error"><?= h($error); ?></div><?php endif; ?>
        <?php if (!empty($success)): ?><div class="alert success"><?= $success; ?></div><?php endif; ?>
    </section>

    <section class="card">
        <h2>Загальна інформація</h2>
        <div class="lead">Додаткова інформація</div>
        <div class="table-responsive" style="border:none;background:transparent;box-shadow:none">
            <table style="min-width:0;border:0">
                <tbody>
                <tr style="background:transparent;border:0">
                    <td style="text-align:left;border:0;padding:6px 0">Розмір бази даних:</td>
                    <td style="text-align:right;border:0;padding:6px 0"><strong><?= $db_size; ?> MB</strong></td>
                </tr>
                <tr style="background:transparent;border:0">
                    <td style="text-align:left;border:0;padding:6px 0">Версія PHP:</td>
                    <td style="text-align:right;border:0;padding:6px 0"><strong><?= h($php_version); ?></strong></td>
                </tr>
                <tr style="background:transparent;border:0">
                    <td style="text-align:left;border:0;padding:6px 0">Версія сайту:</td>
                    <td style="text-align:right;border:0;padding:6px 0"><strong><?= h($site_version); ?></strong></td>
                </tr>
                <tr style="background:transparent;border:0">
                    <td style="text-align:left;border:0;padding:6px 0">Розробник:</td>
                    <td style="text-align:right;border:0;padding:6px 0"><strong>SitePro</strong></td>
                </tr>
                </tbody>
            </table>
        </div>
    </section>

    <!-- Останні 10 користувачів -->
    <section class="card">
        <h2>Список користувачів (останні 10)</h2>
        <div class="table-responsive">
            <table>
                <thead>
                <tr><th>ID</th><th>ПІБ</th><th>Email</th><th>Роль</th><th>Журнал</th><th>Дії</th></tr>
                </thead>
                <tbody>
                <?php
                $result = $conn->query("SELECT u.id, u.full_name, u.email, u.role, g.group_name
                                        FROM users u
                                        LEFT JOIN `groups` g ON u.group_id = g.id
                                        ORDER BY u.id DESC
                                        LIMIT 10");
                if ($result && $result->num_rows) {
                    while ($row = $result->fetch_assoc()) {
                        $uid   = (int)$row['id'];
                        $uname = h($row['full_name']);
                        $uemail= h($row['email']);
                        $urole = h($row['role']);
                        $gname = $row['group_name'] ? h($row['group_name']) : 'Не вказано';
                        ?>
                        <tr>
                            <td><?= $uid ?></td>
                            <td><?= $uname ?></td>
                            <td><?= $uemail ?></td>
                            <td><?= $urole ?></td>
                            <td><?= $gname ?></td>
                            <td>
                                <div class="user-actions">
                                    <a href="edit_user.php?id=<?= $uid ?>" class="btn btn-sm">Редагувати</a>
                                    <a href="delete_user.php?id=<?= $uid ?>"
                                       class="btn btn-danger btn-sm"
                                       onclick="return confirm('Ви дійсно хочете видалити користувача &quot;<?= $uname; ?>&quot;?');">
                                        Видалити
                                    </a>
                                </div>
                            </td>
                        </tr>
                        <?php
                    }
                } else {
                    echo '<tr><td colspan="6">Користувачів не знайдено.</td></tr>';
                }
                ?>
                </tbody>
            </table>
        </div>
    </section>

    <!-- Додати журнал -->
    <section class="card">
        <h2>Додати журнал</h2>
        <form method="POST" action="">
            <input type="hidden" name="csrf_token" value="<?= h($CSRF); ?>">
            <label for="journal_name">Назва журналу (макс. 250 символів)</label>
            <input type="text" name="journal_name" id="journal_name" maxlength="250" required>
            <label for="course">Курс</label>
            <select name="course" id="course" required>
                <option value="1">1-й курс</option>
                <option value="2">2-й курс</option>
                <option value="3">3-й курс</option>
            </select>
            <div style="margin-top:10px">
                <button type="submit" name="create_journal" class="btn">Додати журнал</button>
            </div>
        </form>
    </section>

    <!-- Список журналів -->
    <section class="card">
        <h2>Список журналів</h2>
        <?php if ($groups_result && $groups_result->num_rows > 0): ?>
            <div class="journals">
                <?php while ($row = $groups_result->fetch_assoc()):
                    $gid    = (int)$row['id'];
                    $gname  = h($row['group_name']);
                    $pos    = (int)$row['order_position'];
                    $course = (int)$row['course'];
                    ?>
                    <div class="j-item" id="item-<?= $gid; ?>">
                        <div class="j-head">
                            <div class="j-title" id="title-<?= $gid; ?>"><?= $gname; ?></div>
                            <div class="pos-badge" id="badge-<?= $gid; ?>">#<?= $pos; ?></div>
                            <div class="j-meta">ID: <?= $gid; ?> • Курс: <?= $course; ?>-й</div>
                        </div>

                        <div class="j-controls">
                            <div class="pos-input">
                                <label for="ord-<?= $gid; ?>" style="margin:0">Позиція</label>
                                <button type="button" class="bump minus" onclick="bumpPos(<?= $gid; ?>, -1)">−</button>
                                <input type="number" id="ord-<?= $gid; ?>" value="<?= $pos; ?>" min="1" inputmode="numeric"
                                       oninput="onPosInputChange(<?= $gid; ?>)">
                                <button type="button" class="bump plus" onclick="bumpPos(<?= $gid; ?>, 1)">+</button>
                            </div>
                            <div></div>
                            <div class="row-actions">
                                <button type="button"
                                        class="btn btn-sm"
                                        data-id="<?= $gid; ?>"
                                        data-name="<?= $gname; ?>"
                                        onclick="renameJournal(this)">Редагувати</button>
                                <a href="dashboard.php?delete_journal=<?= $gid; ?>&csrf_token=<?= h($CSRF); ?>"
                                   class="btn btn-danger btn-sm"
                                   onclick="return confirm('Ви дійсно хочете видалити журнал &quot;<?= $gname; ?>&quot;? Усі користувачі цього журналу втратять прив’язку до нього.');">
                                    Видалити
                                </a>
                            </div>
                        </div>
                    </div>
                <?php endwhile; ?>
            </div>
        <?php else: ?>
            <p class="lead">Наразі немає створених журналів.</p>
        <?php endif; ?>
    </section>
</main>

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

</body>
</html>