<?php
declare(strict_types=1);

/**
 * /admin/posts/index.php
 * Адмін: список постів + дії:
 * - редагувати
 * - видаляти
 *
 * Додано:
 * - SEO noindex (адмінка) + X-Robots-Tag + canonical
 * - фільтри: пошук по тексту (q), автор (username)
 * - сортування: нові/старі (по created_at/id)
 * - ліміт: 50/100/200
 *
 * ФІКС:
 * - прибрано фатал TypeError від h(): тут використовуємо e() (приймає навіть масиви)
 * - LEFT JOIN users, щоб пости не зникали якщо юзер видалений
 * - логіка "як було": без пагінації, просто останні N постів
 *
 * ОНОВЛЕНО:
 * - у форму видалення додаємо hidden back (поточний URL з фільтрами), щоб повертало на ту ж сторінку
 * - у лінк редагування додаємо back (щоб після редагування теж верталось назад)
 */

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

/* ===== safe esc for this file (h() у тебе строго типізована) ===== */
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('posts', 'Пости', 'Посты', 'Posts');

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

$flash = admin_flash_take();

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

$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/posts/';
$qsKeep = [
    'q'     => $q,
    'u'     => $u,
    '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','u'] as $k) {
        if (isset($qv[$k]) && trim((string)$qv[$k]) === '') unset($qv[$k]);
    }
    $str = http_build_query($qv);
    return $str ? ($baseUrl . '?' . $str) : $baseUrl;
};

/* поточний URL (back), щоб після delete/edit вертало сюди ж */
$selfUrl = $build_url([]);
$selfUrlEnc = urlencode($selfUrl);

$posts = [];
try {
    $where  = [];
    $params = [];

    if ($q !== '') {
        $where[]  = "p.body LIKE ?";
        $params[] = '%' . $q . '%';
    }
    if ($u !== '') {
        $where[]  = "u.username = ?";
        $params[] = $u;
    }

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

    // LEFT JOIN: не втрачаємо пости при видаленому/битому user_id
    $sql = "
      SELECT p.id, p.body, p.created_at, u.username
      FROM posts p
      LEFT JOIN users u ON u.id = p.user_id
      $whereSql
      $orderSql
      LIMIT $limit
    ";

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

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('posts', 'Пости', 'Посты', 'Posts')) ?></h1>
      <a class="btn btn-sm btn-outline-secondary" href="/admin/">
        <?= e(admin_tt('admin_dashboard', 'Панель адміністратора', 'Панель администратора', 'Dashboard')) ?>
      </a>
    </div>

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

    <div class="card card-app p-3 mb-3">
      <form method="get" action="/admin/posts/" class="row g-2 align-items-end">
        <div class="col-lg-6 col-md-12">
          <label class="form-label small mb-1"><?= e(admin_tt('search', 'Пошук по тексту', 'Поиск по тексту', 'Search text')) ?></label>
          <input class="form-control form-control-sm" name="q" value="<?= e($q) ?>" placeholder="<?= e(admin_tt('search_ph','Наприклад: привіт','Например: привет','e.g. hello')) ?>">
        </div>

        <div class="col-lg-3 col-md-6">
          <label class="form-label small mb-1"><?= e(admin_tt('author', 'Автор (нік)', 'Автор (ник)', 'Author (username)')) ?></label>
          <input class="form-control form-control-sm" name="u" value="<?= e($u) ?>" placeholder="username">
        </div>

        <div class="col-lg-3 col-md-6">
          <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-lg-3 col-md-6">
          <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-lg-9 col-md-12 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/posts/"><?= e(admin_tt('reset','Скинути','Сбросить','Reset')) ?></a>
        </div>
      </form>
    </div>

    <div class="card card-app p-3">
      <div class="table-responsive">
        <table class="table table-sm align-middle mb-0">
          <thead>
            <tr>
              <th>ID</th>
              <th><?= e(admin_tt('username', 'Нік', 'Ник', 'Username')) ?></th>
              <th><?= e(admin_tt('text', 'Текст', 'Текст', 'Text')) ?></th>
              <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 (!$posts): ?>
              <tr><td colspan="5" class="text-muted small"><?= e(admin_tt('admin_no_data', 'Немає даних', 'Нет данных', 'No data')) ?></td></tr>
            <?php else: ?>
              <?php foreach ($posts as $p): ?>
                <?php
                  $pid = (int)($p['id'] ?? 0);
                  $uname = trim((string)($p['username'] ?? ''));
                  if ($uname === '') $uname = (string)admin_tt('unknown_user', 'Невідомо', 'Неизвестно', 'Unknown');
                ?>
                <tr>
                  <td><?= $pid ?></td>
                  <td><?= e($uname) ?></td>
                  <td><?= e(mb_strimwidth((string)($p['body'] ?? ''), 0, 140, '…')) ?></td>
                  <td class="text-muted small"><?= e((string)($p['created_at'] ?? '')) ?></td>
                  <td class="text-end">
                    <a class="btn btn-sm btn-outline-primary" href="/admin/posts/edit.php?id=<?= $pid ?>&back=<?= e($selfUrlEnc) ?>">
                      <?= e(admin_tt('edit', 'Редагувати', 'Редактировать', 'Edit')) ?>
                    </a>

                    <form method="post" action="/admin/posts/delete.php" class="d-inline"
                          onsubmit="return confirm('<?= e(admin_tt('admin_confirm_delete', 'Видалити?', 'Удалить?', 'Delete?')) ?>');">
                      <?= admin_csrf_field() ?>
                      <input type="hidden" name="id" value="<?= $pid ?>">
                      <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>
    </div>

  </div>

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

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