<?php
declare(strict_types=1);

/**
 * /admin/comments/
 * Адмін: перегляд/пошук коментарів.
 * - список з пагінацією
 * - фільтр по тексту/користувачу/посту
 * - редагування / видалення
 * - показ кількості вкладень
 *
 * Додано:
 * - SEO noindex (адмінка) + X-Robots-Tag + canonical
 * - сортування: нові -> старі (desc, default) / старі -> нові (asc)
 * - фільтр по ніку користувача (user=nickname) + кнопки швидкого переходу
 */

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();

if (!function_exists('h')) {
    function h(?string $s): string { return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); }
}

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

/* =========================
   CSRF (єдине джерело — $_SESSION['csrf_token'])
   - не покладаємось на різні назви функцій у _csrf.php
========================= */
if (session_status() !== PHP_SESSION_ACTIVE) session_start();

function vm_csrf_token(): string {
    if (session_status() !== PHP_SESSION_ACTIVE) session_start();
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return (string)$_SESSION['csrf_token'];
}

$lang = (string)($_SESSION['lang'] ?? 'uk');
if (!in_array($lang, ['uk','ru','en'], true)) $lang = 'uk';
$T = function(string $uk, string $ru, string $en) use ($lang): string {
    return $lang === 'ru' ? $ru : ($lang === 'en' ? $en : $uk);
};

$title = $T('Адмін — коментарі', 'Админ — комментарии', 'Admin — comments');

$q       = trim((string)($_GET['q'] ?? ''));
$postId  = (int)($_GET['post_id'] ?? 0);
$userId  = (int)($_GET['user_id'] ?? 0);

/* NEW: filter by username */
$userNick = trim((string)($_GET['user'] ?? ''));

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

$page    = max(1, (int)($_GET['page'] ?? 1));
$perPage = 30;
$offset  = ($page - 1) * $perPage;

$where = [];
$args  = [];

if ($q !== '') {
    $where[] = "(c.body LIKE ? OR u.username LIKE ? OR u.email LIKE ?)";
    $like = "%{$q}%";
    $args[] = $like; $args[] = $like; $args[] = $like;
}
if ($postId > 0) { $where[] = "c.post_id = ?"; $args[] = $postId; }
if ($userId > 0) { $where[] = "c.user_id = ?"; $args[] = $userId; }

/* username filter has priority alongside others */
if ($userNick !== '') {
    $where[] = "u.username = ?";
    $args[] = $userNick;
}

$wsql = $where ? ("WHERE " . implode(" AND ", $where)) : "";

/* total */
$stTotal = $pdo->prepare("
    SELECT COUNT(*)
    FROM comments c
    JOIN users u ON u.id = c.user_id
    {$wsql}
");
$stTotal->execute($args);
$total = (int)$stTotal->fetchColumn();
$pages = max(1, (int)ceil($total / $perPage));

/* rows */
$orderDir = strtoupper($sort); // ASC|DESC
$st = $pdo->prepare("
    SELECT
      c.*,
      u.username,
      u.email,
      (SELECT COUNT(*) FROM comment_attachments ca WHERE ca.comment_id = c.id) AS attachments_cnt
    FROM comments c
    JOIN users u ON u.id = c.user_id
    {$wsql}
    ORDER BY c.id {$orderDir}
    LIMIT {$perPage} OFFSET {$offset}
");
$st->execute($args);
$rows = $st->fetchAll(PDO::FETCH_ASSOC);

/* helpers */
function admin_url_with(array $add): string {
    $params = $_GET;
    foreach ($add as $k => $v) {
        if ($v === null) unset($params[$k]);
        else $params[$k] = $v;
    }
    $qs = http_build_query($params);
    return '/admin/comments/' . ($qs ? ('?' . $qs) : '');
}

require_once __DIR__ . '/../../includes/header.php';
?>
<div class="container py-3">
  <div class="row g-3">
    <div class="col-lg-9">
      <div class="card card-app p-3">
        <div class="d-flex align-items-center justify-content-between gap-2 flex-wrap">
          <h1 class="h5 m-0"><?= h($T('Коментарі', 'Комментарии', 'Comments')) ?></h1>
          <div class="text-muted small">
            <?= h($T('Всього:', 'Всего:', 'Total:')) ?> <?= (int)$total ?>
          </div>
        </div>

        <form class="row g-2 mt-2" method="get" action="/admin/comments/">
          <div class="col-12 col-md-6">
            <input class="form-control" name="q" value="<?= h($q) ?>" placeholder="<?= h($T('Пошук: текст/username/email', 'Поиск: текст/username/email', 'Search: text/username/email')) ?>">
          </div>

          <div class="col-6 col-md-3">
            <input class="form-control" name="user" value="<?= h($userNick) ?>" placeholder="<?= h($T('Нік користувача', 'Ник пользователя', 'Username')) ?>">
          </div>

          <div class="col-6 col-md-3">
            <select class="form-select" name="sort" title="<?= h($T('Сортування', 'Сортировка', 'Sorting')) ?>">
              <option value="desc" <?= $sort==='desc'?'selected':'' ?>><?= h($T('Нові → старі', 'Новые → старые', 'Newest → oldest')) ?></option>
              <option value="asc"  <?= $sort==='asc'?'selected':'' ?>><?= h($T('Старі → нові', 'Старые → новые', 'Oldest → newest')) ?></option>
            </select>
          </div>

          <div class="col-6 col-md-3">
            <input class="form-control" type="number" name="post_id" value="<?= $postId > 0 ? (int)$postId : '' ?>" placeholder="<?= h($T('ID поста', 'ID поста', 'Post ID')) ?>">
          </div>
          <div class="col-6 col-md-3">
            <input class="form-control" type="number" name="user_id" value="<?= $userId > 0 ? (int)$userId : '' ?>" placeholder="<?= h($T('ID юзера', 'ID юзера', 'User ID')) ?>">
          </div>

          <div class="col-12 d-flex gap-2">
            <button class="btn btn-primary" type="submit"><?= h($T('Знайти', 'Найти', 'Search')) ?></button>
            <a class="btn btn-outline-secondary" href="/admin/comments/"><?= h($T('Скинути', 'Сбросить', 'Reset')) ?></a>
          </div>
        </form>

        <div class="table-responsive mt-3">
          <table class="table align-middle">
            <thead>
              <tr>
                <th style="width:90px;">ID</th>
                <th><?= h($T('Автор', 'Автор', 'Author')) ?></th>
                <th style="width:110px;"><?= h($T('Пост', 'Пост', 'Post')) ?></th>
                <th><?= h($T('Текст', 'Текст', 'Text')) ?></th>
                <th style="width:140px;"><?= h($T('Дата', 'Дата', 'Date')) ?></th>
                <th style="width:190px;"><?= h($T('Дії', 'Действия', 'Actions')) ?></th>
              </tr>
            </thead>
            <tbody>
            <?php if (!$rows): ?>
              <tr><td colspan="6" class="text-muted"><?= h($T('Нічого не знайдено.', 'Ничего не найдено.', 'Nothing found.')) ?></td></tr>
            <?php else: ?>
              <?php foreach ($rows as $r): ?>
                <?php
                  $cid = (int)$r['id'];
                  $body = (string)($r['body'] ?? '');
                  $bodyShort = mb_strlen($body) > 140 ? (mb_substr($body, 0, 140) . '…') : $body;
                  $attCnt = (int)($r['attachments_cnt'] ?? 0);
                  $uname = (string)($r['username'] ?? '');
                  $backUrl = '/admin/comments/' . (!empty($_SERVER['QUERY_STRING']) ? ('?' . (string)$_SERVER['QUERY_STRING']) : '');
                ?>
                <tr>
                  <td class="text-muted">#<?= $cid ?></td>
                  <td>
                    <div class="fw-semibold">@<?= h($uname) ?></div>
                    <div class="text-muted small"><?= h((string)$r['email']) ?> · ID <?= (int)$r['user_id'] ?></div>

                    <?php if ($uname !== ''): ?>
                      <div class="mt-1">
                        <a class="btn btn-sm btn-outline-secondary py-0" href="<?= h(admin_url_with(['user' => $uname, 'user_id' => null, 'page' => 1])) ?>">
                          <?= h($T('Показати всі коментарі', 'Показать все комментарии', 'Show all comments')) ?>
                        </a>
                      </div>
                    <?php endif; ?>
                  </td>
                  <td>
                    <a class="text-decoration-none" href="/admin/post_edit.php?id=<?= (int)$r['post_id'] ?>">#<?= (int)$r['post_id'] ?></a>
                    <?php if ((int)$r['parent_id'] > 0): ?>
                      <div class="text-muted small"><?= h($T('відповідь', 'ответ', 'reply')) ?> → #<?= (int)$r['parent_id'] ?></div>
                    <?php endif; ?>
                  </td>
                  <td>
                    <div><?= h($bodyShort) ?></div>
                    <?php if ($attCnt > 0): ?>
                      <div class="text-muted small"><?= h($T('Вкладень:', 'Вложений:', 'Attachments:')) ?> <?= $attCnt ?></div>
                    <?php endif; ?>
                  </td>
                  <td class="text-muted small"><?= h((string)$r['created_at']) ?></td>
                  <td>
                    <div class="d-flex gap-2 flex-wrap">
                      <a class="btn btn-sm btn-outline-primary" href="/admin/comments/edit.php?id=<?= $cid ?>&amp;back=<?= rawurlencode($backUrl) ?>">
                        <?= h($T('Редагувати', 'Редактировать', 'Edit')) ?>
                      </a>

                      <form method="post" action="/admin/comments/delete.php"
                            onsubmit="return confirm('<?= h($T('Видалити коментар?', 'Удалить комментарий?', 'Delete comment?')) ?>');">
                        <input type="hidden" name="csrf_token" value="<?= h(vm_csrf_token()) ?>">
                        <input type="hidden" name="id" value="<?= $cid ?>">
                        <input type="hidden" name="back" value="<?= h($backUrl) ?>">
                        <button class="btn btn-sm btn-outline-danger" type="submit">
                          <?= h($T('Видалити', 'Удалить', 'Delete')) ?>
                        </button>
                      </form>
                    </div>
                  </td>
                </tr>
              <?php endforeach; ?>
            <?php endif; ?>
            </tbody>
          </table>
        </div>

        <?php if ($pages > 1): ?>
          <nav class="mt-2">
            <ul class="pagination mb-0 flex-wrap">
              <?php
                $prev = max(1, $page - 1);
                $next = min($pages, $page + 1);
              ?>
              <li class="page-item <?= $page <= 1 ? 'disabled' : '' ?>">
                <a class="page-link" href="<?= h(admin_url_with(['page' => $prev])) ?>">&laquo;</a>
              </li>

              <?php
                $start = max(1, $page - 3);
                $end   = min($pages, $page + 3);
                for ($p = $start; $p <= $end; $p++):
              ?>
                <li class="page-item <?= $p === $page ? 'active' : '' ?>">
                  <a class="page-link" href="<?= h(admin_url_with(['page' => $p])) ?>"><?= $p ?></a>
                </li>
              <?php endfor; ?>

              <li class="page-item <?= $page >= $pages ? 'disabled' : '' ?>">
                <a class="page-link" href="<?= h(admin_url_with(['page' => $next])) ?>">&raquo;</a>
              </li>
            </ul>
          </nav>
        <?php endif; ?>

      </div>
    </div>

    <div class="col-lg-3">
      <?php admin_sidebar('comments'); ?>
    </div>
  </div>
</div>
<?php require_once __DIR__ . '/../../includes/footer.php'; ?>
