<?php
declare(strict_types=1);

/**
 * /functional/group/index.php
 * Сторінка списку груп:
 * - Пошук по назві/тематике (якщо є колонка topic)
 * - Мої групи (якщо користувач залогінений)
 * - Загальний список (нові)
 *
 * Оновлено:
 * - SEO: каталог index індексується, але сторінки пошуку (?q=) — noindex + canonical на базову сторінку
 * - schema-flex: не падає якщо нема topic/created_at/updated_at/status
 * - пагінація (?p=)
 * - mbstring fallback для першої літери
 */

require_once __DIR__ . '/../../includes/start.php';
require_once __DIR__ . '/_lib.php';

$pdo = g_db();
$me  = g_me();

/* ===== helpers ===== */
function g_norm_spaces_local(string $s): string {
    $s = trim($s);
    $s = preg_replace('~\s+~u', ' ', $s) ?? $s;
    return trim($s);
}
function g_mb_len_local(string $s): int {
    if (function_exists('mb_strlen')) return (int)mb_strlen($s, 'UTF-8');
    return strlen($s);
}
function g_first_char(string $s): string {
    $s = trim($s);
    if ($s === '') return '?';
    if (function_exists('mb_substr')) return (string)mb_substr($s, 0, 1, 'UTF-8');
    return substr($s, 0, 1);
}

/* ===== input ===== */
$q = g_norm_spaces_local((string)($_GET['q'] ?? ''));
if (g_mb_len_local($q) > 80) {
    // обрізаємо, щоб не робити дуже важкий LIKE
    if (function_exists('mb_substr')) $q = (string)mb_substr($q, 0, 80, 'UTF-8');
    else $q = substr($q, 0, 80);
}

$p = (int)($_GET['p'] ?? 1);
if ($p < 1) $p = 1;

$perPage = 30;
$offset  = ($p - 1) * $perPage;

/* ===== schema ===== */
$hasGroups = g_table_exists($pdo, 'groups') && g_table_exists($pdo, 'group_members');

if (!$hasGroups) {
    $title = g_t('Групи', 'Группы', 'Groups');
    $meta_robots = 'noindex, nofollow, noarchive, nosnippet';
    if (!headers_sent()) {
        header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    }
    require __DIR__ . '/../../includes/header.php';
    ?>
    <div class="container my-4">
      <div class="alert alert-warning">
        <?= g_h(g_t(
          'Модуль груп ще не підключений до БД. Запусти SQL-міграцію (таблиці groups/group_members + group_id у posts).',
          'Модуль групп ещё не подключен к БД. Запусти SQL-миграцию (таблицы groups/group_members + group_id в posts).',
          'Groups module is not connected to DB yet. Run SQL migration (groups/group_members + group_id in posts).'
        )) ?>
      </div>
    </div>
    <?php
    require __DIR__ . '/../../includes/footer.php';
    exit;
}

/* columns */
$g_has_topic     = g_column_exists($pdo, 'groups', 'topic');
$g_has_created   = g_column_exists($pdo, 'groups', 'created_at');
$g_has_updated   = g_column_exists($pdo, 'groups', 'updated_at');
$gm_has_status   = g_column_exists($pdo, 'group_members', 'status');

/* =========================
   SEO (перед header)
   - каталог: index
   - пошук (q): noindex
========================= */
$title = g_t('Групи', 'Группы', 'Groups');

$meta_desc = g_t(
  'Групи VMEREGI: пошук за назвою та тематикою, список усіх груп і ваші групи.',
  'Группы VMEREGI: поиск по названию и тематике, список всех групп и ваши группы.',
  'VMEREGI groups: search by name/topic, browse all groups and your groups.'
);

$canonical = function_exists('abs_url') ? abs_url('/functional/group/index.php') : '/functional/group/index.php';

/* noindex для сторінок результатів пошуку */
if ($q !== '') {
    $meta_robots = 'noindex, nofollow, noarchive, nosnippet';
    if (!headers_sent()) {
        header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    }
} else {
    // якщо у header.php логіка така, що meta robots ставиться лише коли задано — залишаємо порожнім
    $meta_robots = '';
}

/* header */
require __DIR__ . '/../../includes/header.php';

/* ===== My groups ===== */
$myGroups = [];
if ($me && (int)($me['id'] ?? 0) > 0) {
    $orderCol = $g_has_updated ? 'g.updated_at' : ($g_has_created ? 'g.created_at' : 'g.id');
    $orderDir = 'DESC';

    $whereStatus = $gm_has_status ? " AND gm.status='active' " : "";

    $st = $pdo->prepare("
        SELECT g.*
        FROM `groups` g
        JOIN group_members gm ON gm.group_id = g.id
        WHERE gm.user_id = ?
        {$whereStatus}
        ORDER BY {$orderCol} {$orderDir}
        LIMIT 24
    ");
    $st->execute([(int)$me['id']]);
    $myGroups = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];
}

/* ===== All groups: build WHERE ===== */
$params = [];
$where = " WHERE 1=1 ";

if ($q !== '') {
    if ($g_has_topic) {
        $where .= " AND (g.name LIKE ? OR g.topic LIKE ?) ";
        $like = '%' . $q . '%';
        $params[] = $like;
        $params[] = $like;
    } else {
        $where .= " AND (g.name LIKE ?) ";
        $params[] = '%' . $q . '%';
    }
}

/* ===== total count for pagination ===== */
$total = 0;
try {
    $stC = $pdo->prepare("SELECT COUNT(*) FROM `groups` g {$where}");
    $stC->execute($params);
    $total = (int)$stC->fetchColumn();
} catch (Throwable $e) {
    $total = 0;
}

/* ===== members_count subquery ===== */
$membersCountSql = $gm_has_status
    ? "(SELECT COUNT(*) FROM group_members gm WHERE gm.group_id=g.id AND gm.status='active')"
    : "(SELECT COUNT(*) FROM group_members gm WHERE gm.group_id=g.id)";

/* ===== order ===== */
$orderCol = $g_has_created ? 'g.created_at' : 'g.id';
$orderDir = 'DESC';

/* ===== fetch page ===== */
$groups = [];
try {
    $sql = "
        SELECT g.*,
               {$membersCountSql} AS members_count
        FROM `groups` g
        {$where}
        ORDER BY {$orderCol} {$orderDir}
        LIMIT {$perPage} OFFSET {$offset}
    ";
    $st = $pdo->prepare($sql);
    $st->execute($params);
    $groups = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];
} catch (Throwable $e) {
    $groups = [];
}

/* pagination calc */
$totalPages = (int)max(1, (int)ceil($total / $perPage));
if ($p > $totalPages) $p = $totalPages;

$baseUrl = '/functional/group/index.php';
$queryBase = [];
if ($q !== '') $queryBase['q'] = $q;

function g_build_url(string $base, array $params): string {
    if (!$params) return $base;
    return $base . '?' . http_build_query($params);
}
?>

<link rel="stylesheet" href="/css/group.css?v=4">

<div class="container my-4">
  <div class="d-flex flex-wrap align-items-center justify-content-between gap-2 mb-3">
    <h1 class="h4 m-0"><?= g_h($title) ?></h1>
    <div class="d-flex gap-2">
      <?php if ($me): ?>
        <a class="btn btn-sm btn-primary" href="/functional/group/create.php"><?= g_h(g_t('Створити групу', 'Создать группу', 'Create group')) ?></a>
      <?php else: ?>
        <a class="btn btn-sm btn-outline-secondary" href="/login.php"><?= g_h(g_t('Увійти', 'Войти', 'Log in')) ?></a>
      <?php endif; ?>
    </div>
  </div>

  <form class="row g-2 mb-3" method="get" action="/functional/group/index.php">
    <div class="col-12 col-md-8">
      <input class="form-control" type="text" name="q" value="<?= g_h($q) ?>"
             placeholder="<?= g_h(g_t('Пошук по назві або тематиці...', 'Поиск по названию или тематике...', 'Search by name or topic...')) ?>">
    </div>
    <div class="col-12 col-md-4 d-grid gap-2">
      <button class="btn btn-outline-primary" type="submit"><?= g_h(g_t('Знайти', 'Найти', 'Search')) ?></button>
      <?php if ($q !== ''): ?>
        <a class="btn btn-outline-secondary" href="/functional/group/index.php"><?= g_h(g_t('Очистити', 'Очистить', 'Clear')) ?></a>
      <?php endif; ?>
    </div>
  </form>

  <?php if ($me && $myGroups): ?>
    <div class="card mb-3">
      <div class="card-body">
        <div class="fw-bold mb-2"><?= g_h(g_t('Мої групи', 'Мои группы', 'My groups')) ?></div>
        <div class="g-group-grid">
          <?php foreach ($myGroups as $g0): ?>
            <a class="g-group-tile" href="<?= g_h(g_group_url($g0)) ?>">
              <div class="g-tile-avatar">
                <?php if (!empty($g0['avatar_path'])): ?>
                  <img src="<?= g_h((string)$g0['avatar_path']) ?>" alt="">
                <?php else: ?>
                  <div class="g-avatar-ph"><?= g_h(g_first_char((string)($g0['name'] ?? ''))) ?></div>
                <?php endif; ?>
              </div>
              <div class="g-tile-info">
                <div class="g-tile-name"><?= g_h((string)($g0['name'] ?? '')) ?></div>
                <?php if ($g_has_topic && !empty($g0['topic'])): ?>
                  <div class="g-tile-meta"><?= g_h((string)$g0['topic']) ?></div>
                <?php endif; ?>
              </div>
            </a>
          <?php endforeach; ?>
        </div>
      </div>
    </div>
  <?php endif; ?>

  <div class="card">
    <div class="card-body">
      <div class="d-flex align-items-center justify-content-between flex-wrap gap-2 mb-2">
        <div class="fw-bold"><?= g_h(g_t('Усі групи', 'Все группы', 'All groups')) ?></div>
        <div class="text-muted small">
          <?= (int)$total ?> <?= g_h(g_t('всього', 'всего', 'total')) ?>
        </div>
      </div>

      <?php if (!$groups): ?>
        <div class="text-muted"><?= g_h(g_t('Нічого не знайдено.', 'Ничего не найдено.', 'Nothing found.')) ?></div>
      <?php else: ?>
        <div class="g-group-list">
          <?php foreach ($groups as $g0): ?>
            <a class="g-group-row" href="<?= g_h(g_group_url($g0)) ?>">
              <div class="g-row-avatar">
                <?php if (!empty($g0['avatar_path'])): ?>
                  <img src="<?= g_h((string)$g0['avatar_path']) ?>" alt="">
                <?php else: ?>
                  <div class="g-avatar-ph"><?= g_h(g_first_char((string)($g0['name'] ?? ''))) ?></div>
                <?php endif; ?>
              </div>
              <div class="g-row-main">
                <div class="g-row-title"><?= g_h((string)($g0['name'] ?? '')) ?></div>
                <div class="g-row-meta">
                  <?php if ($g_has_topic && !empty($g0['topic'])): ?>
                    <span><?= g_h((string)$g0['topic']) ?></span>
                    <span class="mx-2">•</span>
                  <?php endif; ?>
                  <span><?= (int)($g0['members_count'] ?? 0) ?> <?= g_h(g_t('учасників', 'участников', 'members')) ?></span>
                </div>
              </div>
            </a>
          <?php endforeach; ?>
        </div>

        <?php if ($totalPages > 1): ?>
          <nav class="mt-3" aria-label="Groups pagination">
            <ul class="pagination mb-0 flex-wrap">
              <?php
                $prevParams = $queryBase;
                $nextParams = $queryBase;
                $prevParams['p'] = max(1, $p - 1);
                $nextParams['p'] = min($totalPages, $p + 1);

                $prevUrl = g_build_url($baseUrl, $prevParams);
                $nextUrl = g_build_url($baseUrl, $nextParams);
              ?>
              <li class="page-item <?= $p <= 1 ? 'disabled' : '' ?>">
                <a class="page-link" href="<?= g_h($prevUrl) ?>"><?= g_h(g_t('Назад', 'Назад', 'Prev')) ?></a>
              </li>

              <li class="page-item disabled">
                <span class="page-link">
                  <?= (int)$p ?> / <?= (int)$totalPages ?>
                </span>
              </li>

              <li class="page-item <?= $p >= $totalPages ? 'disabled' : '' ?>">
                <a class="page-link" href="<?= g_h($nextUrl) ?>"><?= g_h(g_t('Далі', 'Далее', 'Next')) ?></a>
              </li>
            </ul>
          </nav>
        <?php endif; ?>

      <?php endif; ?>
    </div>
  </div>
</div>

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