<?php
declare(strict_types=1);

/**
 * /admin/groups/
 * Адмін: список груп + дії:
 * - закрити/відкрити (is_closed)
 * - видалити
 *
 * Додано:
 * - SEO noindex (адмінка) + X-Robots-Tag + canonical
 * - фільтри: пошук по назві (q), власник (owner), статус (open/closed) якщо є is_closed
 * - сортування: нові/старі (created_at/id)
 * - ліміт: 50/100/200
 *
 * ОНОВЛЕНО:
 * - e() замість h() (уніфікація адмінки)
 * - LEFT JOIN users (групи не зникають при видаленому owner)
 * - back у форми toggle/delete (повертає на ту ж сторінку з фільтрами)
 */

require_once __DIR__ . '/../../includes/start.php';
require_role(['admin']);

require_once __DIR__ . '/../_helpers.php';
require_once __DIR__ . '/../_sidebar.php';
require_once __DIR__ . '/../_csrf.php';

$pdo = db();

/* fallback e() якщо раптом _helpers ще не оновлений */
if (!function_exists('e')) {
    function e($v): string {
        if ($v === null) return '';
        if (is_array($v)) {
            $v = json_encode($v, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        } elseif (is_object($v)) {
            $v = method_exists($v, '__toString')
                ? (string)$v
                : json_encode($v, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        } else {
            $v = (string)$v;
        }
        if ($v === false) $v = '';
        return htmlspecialchars((string)$v, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
    }
}

$title = admin_tt('groups', 'Групи', 'Группы', 'Groups');

/* =========================
   SEO: адмінка НЕ індексується
========================= */
$meta_robots = 'noindex, nofollow, noarchive, nosnippet';
$meta_desc   = '';
$canonical   = function_exists('abs_url') ? abs_url('/admin/groups/') : '/admin/groups/';
if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
}

$flash = admin_flash_take();
if (is_array($flash)) {
    $flash['type'] = is_string($flash['type'] ?? null) ? (string)$flash['type'] : 'info';
    $flash['msg']  = is_string($flash['msg'] ?? null) ? (string)$flash['msg'] : '';
}

$hasGroups = admin_table_exists($pdo, 'groups');
$hasClosed = $hasGroups && admin_column_exists($pdo, 'groups', 'is_closed');

/* ===== filters & sorting ===== */
$q     = isset($_GET['q']) ? trim((string)$_GET['q']) : '';
$owner = isset($_GET['owner']) ? trim((string)$_GET['owner']) : '';

$status = isset($_GET['status']) ? trim((string)$_GET['status']) : 'all';
if (!in_array($status, ['all','open','closed'], true)) $status = 'all';

$sort = isset($_GET['sort']) ? trim((string)$_GET['sort']) : 'desc';
if (!in_array($sort, ['asc','desc'], true)) $sort = 'desc';

$limit = isset($_GET['limit']) ? (int)($_GET['limit']) : 200;
if (!in_array($limit, [50,100,200], true)) $limit = 200;

$baseUrl = '/admin/groups/';
$qsKeep = [
    'q'      => $q,
    'owner'  => $owner,
    'status' => $status,
    'sort'   => $sort,
    'limit'  => (string)$limit,
];

$build_url = function(array $overrides = []) use ($baseUrl, $qsKeep): string {
    $qv = $qsKeep;

    foreach ($overrides as $k => $v) {
        if ($v === null) unset($qv[$k]);
        else $qv[$k] = (string)$v;
    }

    foreach (['q','owner'] as $k) {
        if (isset($qv[$k]) && trim((string)$qv[$k]) === '') unset($qv[$k]);
    }

    if (isset($qv['status']) && $qv['status'] === 'all') unset($qv['status']);

    $str = http_build_query($qv);
    return $str ? ($baseUrl . '?' . $str) : $baseUrl;
};

$selfUrl = $build_url([]); // back

$rows = [];
if ($hasGroups) {
    try {
        $sel = "g.id, g.name, g.slug, g.created_at, u.username AS owner_username";
        if ($hasClosed) $sel .= ", g.is_closed";

        $where = [];
        $params = [];

        if ($q !== '') {
            $where[]  = "g.name LIKE ?";
            $params[] = '%' . $q . '%';
        }
        if ($owner !== '') {
            $where[]  = "u.username = ?";
            $params[] = $owner;
        }
        if ($hasClosed && $status !== 'all') {
            if ($status === 'open') $where[] = "g.is_closed = 0";
            if ($status === 'closed') $where[] = "g.is_closed = 1";
        }

        $whereSql = $where ? ('WHERE ' . implode(' AND ', $where)) : '';
        $orderSql = "ORDER BY g.created_at " . strtoupper($sort) . ", g.id " . strtoupper($sort);

        // LEFT JOIN users: не втрачаємо групи при видаленому owner_user_id
        $sql = "
            SELECT $sel
            FROM `groups` g
            LEFT JOIN users u ON u.id = g.owner_user_id
            $whereSql
            $orderSql
            LIMIT $limit
        ";

        $st = $pdo->prepare($sql);
        $st->execute($params);
        $rows = $st->fetchAll() ?: [];
    } catch (Throwable $e) {
        $rows = [];
    }
}

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

<div class="row g-3">
  <div class="col-lg-9">

    <div class="d-flex align-items-center justify-content-between mb-2">
      <h1 class="h4 mb-0"><?= e(admin_tt('groups', 'Групи', 'Группы', 'Groups')) ?></h1>
      <a class="btn btn-sm btn-outline-secondary" href="/admin/"><?= e(admin_tt('admin_dashboard', 'Дашборд', 'Дашборд', 'Dashboard')) ?></a>
    </div>

    <?php if ($flash && ($flash['msg'] ?? '') !== ''): ?>
      <div class="alert alert-<?= e($flash['type'] ?? 'info') ?>"><?= e($flash['msg'] ?? '') ?></div>
    <?php endif; ?>

    <div class="card card-app p-3 mb-3">
      <?php if (!$hasGroups): ?>
        <div class="text-muted"><?= e(admin_tt('admin_groups_missing', 'Таблиця groups відсутня', 'Таблица groups отсутствует', 'groups table missing')) ?></div>
      <?php else: ?>
        <form method="get" action="/admin/groups.php" class="row g-2 align-items-end">
          <div class="col-md-5">
            <label class="form-label small mb-1"><?= e(admin_tt('search', 'Пошук по назві', 'Поиск по названию', 'Search name')) ?></label>
            <input class="form-control form-control-sm" name="q" value="<?= e($q) ?>" placeholder="<?= e(admin_tt('search_ph','Наприклад: музика','Например: музыка','e.g. music')) ?>">
          </div>

          <div class="col-md-3">
            <label class="form-label small mb-1"><?= e(admin_tt('owner', 'Власник (нік)', 'Владелец (ник)', 'Owner (username)')) ?></label>
            <input class="form-control form-control-sm" name="owner" value="<?= e($owner) ?>" placeholder="username">
          </div>

          <div class="col-md-2">
            <label class="form-label small mb-1"><?= e(admin_tt('status', 'Статус', 'Статус', 'Status')) ?></label>
            <select class="form-select form-select-sm" name="status" <?= $hasClosed ? '' : 'disabled' ?>>
              <option value="all" <?= $status==='all'?'selected':'' ?>><?= e(admin_tt('filter_all','Всі','Все','All')) ?></option>
              <option value="open" <?= $status==='open'?'selected':'' ?>><?= e(admin_tt('open','Відкриті','Открытые','Open')) ?></option>
              <option value="closed" <?= $status==='closed'?'selected':'' ?>><?= e(admin_tt('closed','Закриті','Закрытые','Closed')) ?></option>
            </select>
          </div>

          <div class="col-md-2">
            <label class="form-label small mb-1"><?= e(admin_tt('sort_created','Сортування','Сортировка','Sort')) ?></label>
            <select class="form-select form-select-sm" name="sort">
              <option value="desc" <?= $sort==='desc'?'selected':'' ?>><?= e(admin_tt('sort_new','Спочатку нові','Сначала новые','Newest first')) ?></option>
              <option value="asc"  <?= $sort==='asc'?'selected':'' ?>><?= e(admin_tt('sort_old','Спочатку старі','Сначала старые','Oldest first')) ?></option>
            </select>
          </div>

          <div class="col-md-2">
            <label class="form-label small mb-1"><?= e(admin_tt('limit','Ліміт','Лимит','Limit')) ?></label>
            <select class="form-select form-select-sm" name="limit">
              <?php foreach ([50,100,200] as $n): ?>
                <option value="<?= (int)$n ?>" <?= $limit===$n?'selected':'' ?>><?= (int)$n ?></option>
              <?php endforeach; ?>
            </select>
          </div>

          <div class="col-md-10 d-flex gap-2">
            <button class="btn btn-sm btn-primary" type="submit"><?= e(admin_tt('apply','Застосувати','Применить','Apply')) ?></button>
            <a class="btn btn-sm btn-outline-secondary" href="/admin/groups.php"><?= e(admin_tt('reset','Скинути','Сбросить','Reset')) ?></a>
          </div>

          <?php if (!$hasClosed): ?>
            <div class="col-12 text-muted small mt-1">
              <?= e(admin_tt(
                'admin_need_closed_col',
                'Щоб працював фільтр/кнопка “Закрити групу” — додай колонку groups.is_closed.',
                'Чтобы работал фильтр/кнопка “Закрыть группу” — добавь колонку groups.is_closed.',
                'To enable status filter and close/open actions, add groups.is_closed.'
              )) ?>
            </div>
          <?php endif; ?>
        </form>
      <?php endif; ?>
    </div>

    <div class="card card-app p-3">
      <?php if ($hasGroups): ?>
        <div class="table-responsive">
          <table class="table table-sm align-middle mb-0">
            <thead>
              <tr>
                <th>ID</th>
                <th><?= e(admin_tt('name', 'Назва', 'Название', 'Name')) ?></th>
                <th>Slug</th>
                <th><?= e(admin_tt('owner', 'Власник', 'Владелец', 'Owner')) ?></th>
                <?php if ($hasClosed): ?><th><?= e(admin_tt('status', 'Статус', 'Статус', 'Status')) ?></th><?php endif; ?>
                <th>
                  <?= e(admin_tt('created', 'Створено', 'Создано', 'Created')) ?>
                  <a class="ms-1 text-decoration-none" href="<?= e($build_url(['sort' => $sort === 'desc' ? 'asc' : 'desc'])) ?>" title="<?= e(admin_tt('toggle_sort','Перемкнути','Переключить','Toggle')) ?>">
                    <?= $sort === 'desc' ? '↓' : '↑' ?>
                  </a>
                </th>
                <th class="text-end"><?= e(admin_tt('admin_actions', 'Дії', 'Действия', 'Actions')) ?></th>
              </tr>
            </thead>
            <tbody>
              <?php if (!$rows): ?>
                <tr><td colspan="<?= $hasClosed ? 7 : 6 ?>" class="text-muted small"><?= e(admin_tt('admin_no_data', 'Немає даних', 'Нет данных', 'No data')) ?></td></tr>
              <?php else: ?>
                <?php foreach ($rows as $g): ?>
                  <?php
                    $gid = (int)($g['id'] ?? 0);
                    $isClosed = $hasClosed ? (int)($g['is_closed'] ?? 0) : 0;

                    $ownerName = trim((string)($g['owner_username'] ?? ''));
                    if ($ownerName === '') $ownerName = (string)admin_tt('unknown_user', 'Невідомо', 'Неизвестно', 'Unknown');
                  ?>
                  <tr>
                    <td><?= $gid ?></td>
                    <td><?= e((string)($g['name'] ?? '')) ?></td>
                    <td class="text-muted small"><?= e((string)($g['slug'] ?? '')) ?></td>
                    <td><?= e($ownerName) ?></td>

                    <?php if ($hasClosed): ?>
                      <td>
                        <?php if ($isClosed === 1): ?>
                          <span class="badge text-bg-warning"><?= e(admin_tt('closed', 'Закрита', 'Закрыта', 'Closed')) ?></span>
                        <?php else: ?>
                          <span class="badge text-bg-success"><?= e(admin_tt('open', 'Відкрита', 'Открыта', 'Open')) ?></span>
                        <?php endif; ?>
                      </td>
                    <?php endif; ?>

                    <td class="text-muted small"><?= e((string)($g['created_at'] ?? '')) ?></td>

                    <td class="text-end">
                      <?php if ($hasClosed): ?>
                        <form method="post" action="/admin/groups/toggle_closed.php" class="d-inline">
                          <?= admin_csrf_field() ?>
                          <input type="hidden" name="id" value="<?= $gid ?>">
                          <input type="hidden" name="to" value="<?= $isClosed ? 0 : 1 ?>">
                          <input type="hidden" name="back" value="<?= e($selfUrl) ?>">
                          <button class="btn btn-sm btn-outline-secondary">
                            <?= e($isClosed ? admin_tt('open', 'Відкрити', 'Открыть', 'Open') : admin_tt('close', 'Закрити', 'Закрыть', 'Close')) ?>
                          </button>
                        </form>
                      <?php endif; ?>

                      <form method="post" action="/admin/groups/delete.php" class="d-inline"
                            onsubmit="return confirm('<?= e(admin_tt('admin_confirm_delete', 'Видалити групу?', 'Удалить группу?', 'Delete group?')) ?>');">
                        <?= admin_csrf_field() ?>
                        <input type="hidden" name="id" value="<?= $gid ?>">
                        <input type="hidden" name="back" value="<?= e($selfUrl) ?>">
                        <button class="btn btn-sm btn-outline-danger">
                          <?= e(admin_tt('delete', 'Видалити', 'Удалить', 'Delete')) ?>
                        </button>
                      </form>
                    </td>
                  </tr>
                <?php endforeach; ?>
              <?php endif; ?>
            </tbody>
          </table>
        </div>

        <?php if (!$hasClosed): ?>
          <div class="text-muted small mt-2">
            <?= e(admin_tt(
              'admin_need_closed_col_sql',
              'Щоб працювало “Закрити групу” — додай колонку groups.is_closed (SQL нижче).',
              'Чтобы работало “Закрыть группу” — добавь колонку groups.is_closed (SQL ниже).',
              'To use “Close group”, add groups.is_closed column (SQL below).'
            )) ?>
            <pre class="mt-2 mb-0"><code>ALTER TABLE `groups` ADD COLUMN is_closed TINYINT(1) NOT NULL DEFAULT 0, ADD INDEX idx_groups_closed (is_closed);</code></pre>
          </div>
        <?php endif; ?>

      <?php endif; ?>
    </div>

  </div>

  <div class="col-lg-3">
    <?php admin_sidebar('groups'); ?>
  </div>
</div>

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