<?php
declare(strict_types=1);

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

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

$pdo = db();
$me  = current_user();
$meId = (int)($me['id'] ?? 0);
$meRole = trim((string)($me['role'] ?? ''));

$title = admin_tt('admin_restrictions', 'Блокування акаунтів', 'Блокировки аккаунтов', 'Account restrictions');
$meta_robots = 'noindex, nofollow, noarchive, nosnippet';
$meta_desc = '';
$canonical = function_exists('abs_url') ? abs_url('/admin/restrictions/') : '/admin/restrictions/';
if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
}

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

if (!function_exists('restr_load_user')) {
    function restr_load_user(PDO $pdo, int $userId): ?array
    {
        if ($userId <= 0) {
            return null;
        }

        $st = $pdo->prepare("SELECT id, username, email, first_name, last_name, role, avatar_path FROM users WHERE id = ? LIMIT 1");
        $st->execute([$userId]);
        $row = $st->fetch(PDO::FETCH_ASSOC) ?: null;
        return $row ?: null;
    }
}

if (!function_exists('restr_display_name')) {
    function restr_display_name(array $u): string
    {
        $name = trim((string)(($u['first_name'] ?? '') . ' ' . ($u['last_name'] ?? '')));
        if ($name !== '') {
            return $name;
        }
        return trim((string)($u['username'] ?? ''));
    }
}

if (!function_exists('restr_avatar')) {
    function restr_avatar(array $u): string
    {
        $p = trim((string)($u['avatar_path'] ?? ''));
        return $p !== '' ? $p : '/assets/img/avatar-placeholder.png';
    }
}

if (!function_exists('restr_back_url')) {
    function restr_back_url(string $fallback = '/admin/restrictions/'): string
    {
        $raw = trim((string)($_GET['back'] ?? $_POST['back'] ?? ''));
        if ($raw === '' && isset($_SERVER['HTTP_REFERER'])) {
            $raw = trim((string)$_SERVER['HTTP_REFERER']);
        }

        if ($raw === '') {
            return $fallback;
        }

        if (preg_match('~^https?://~i', $raw)) {
            $p = parse_url($raw);
            $path = (string)($p['path'] ?? '/');
            $query = isset($p['query']) && $p['query'] !== '' ? ('?' . $p['query']) : '';
            $raw = $path . $query;
        }

        if ($raw === '' || $raw[0] !== '/' || str_starts_with($raw, '//')) {
            return $fallback;
        }

        return $raw;
    }
}

if (!function_exists('restr_sanitize_local_url')) {
    function restr_sanitize_local_url(string $raw, string $fallback = '/admin/restrictions/'): string
    {
        $raw = trim($raw);
        if ($raw === '') {
            return $fallback;
        }

        if (preg_match('~^https?://~i', $raw)) {
            $p = parse_url($raw);
            $path = (string)($p['path'] ?? '/');
            $query = isset($p['query']) && $p['query'] !== '' ? ('?' . $p['query']) : '';
            $raw = $path . $query;
        }

        if ($raw === '' || $raw[0] !== '/' || str_starts_with($raw, '//')) {
            return $fallback;
        }

        return $raw;
    }
}

if (!function_exists('restr_page_url')) {
    function restr_page_url(array $changes = []): string
    {
        $params = $_GET;

        foreach ($changes as $key => $value) {
            if ($value === null || $value === '') {
                unset($params[$key]);
            } else {
                $params[$key] = $value;
            }
        }

        $query = http_build_query($params);
        return '/admin/restrictions/' . ($query !== '' ? ('?' . $query) : '');
    }
}

if (!function_exists('restr_target_forbidden')) {
    function restr_target_forbidden(string $actorRole, ?array $targetUser): bool
    {
        if (!$targetUser) {
            return false;
        }

        $targetRole = trim((string)($targetUser['role'] ?? 'user'));
        return $actorRole === 'moderator' && in_array($targetRole, ['admin', 'moderator'], true);
    }
}

if (!function_exists('restr_datetime_date_value')) {
    function restr_datetime_date_value(?string $raw): string
    {
        $raw = trim((string)$raw);
        if ($raw === '') {
            return '';
        }

        $ts = strtotime($raw);
        if ($ts === false || $ts <= 0) {
            return '';
        }

        return date('Y-m-d', $ts);
    }
}

if (!function_exists('restr_datetime_time_value')) {
    function restr_datetime_time_value(?string $raw): string
    {
        $raw = trim((string)$raw);
        if ($raw === '') {
            return '';
        }

        $ts = strtotime($raw);
        if ($ts === false || $ts <= 0) {
            return '';
        }

        return date('H:i', $ts);
    }
}

if (!function_exists('restr_join_date_time')) {
    function restr_join_date_time(?string $date, ?string $time): ?string
    {
        $date = trim((string)$date);
        $time = trim((string)$time);

        if ($date === '') {
            return null;
        }

        if ($time === '') {
            $time = '23:59';
        }

        return $date . ' ' . $time . ':00';
    }
}

if (!function_exists('restr_cleanup_active_rows')) {
    function restr_cleanup_active_rows(PDO $pdo): void
    {
        ar_ensure_schema($pdo);

        try {
            $pdo->exec("UPDATE user_account_restrictions SET posts_blocked_until = NULL WHERE posts_blocked_until IS NOT NULL AND posts_blocked_until <= NOW()");
            $pdo->exec("UPDATE user_account_restrictions SET comments_blocked_until = NULL WHERE comments_blocked_until IS NOT NULL AND comments_blocked_until <= NOW()");
            $pdo->exec("UPDATE user_account_restrictions SET messages_blocked_until = NULL WHERE messages_blocked_until IS NOT NULL AND messages_blocked_until <= NOW()");
            $pdo->exec("DELETE FROM user_account_restrictions WHERE is_banned_forever = 0 AND posts_blocked_until IS NULL AND comments_blocked_until IS NULL AND messages_blocked_until IS NULL");
        } catch (Throwable $e) {
        }
    }
}

if (!function_exists('restr_active_where_sql')) {
    function restr_active_where_sql(string $alias = 'r'): string
    {
        return '('
            . $alias . '.is_banned_forever = 1'
            . ' OR ' . $alias . '.posts_blocked_until IS NOT NULL'
            . ' OR ' . $alias . '.comments_blocked_until IS NOT NULL'
            . ' OR ' . $alias . '.messages_blocked_until IS NOT NULL'
            . ')';
    }
}

if (!function_exists('restr_state_badges')) {
    function restr_state_badges(array $state): array
    {
        $badges = [];

        if (!empty($state['ban_forever'])) {
            $badges[] = [
                'class' => 'text-bg-danger',
                'text'  => admin_tt('forever_ban', 'Назавжди', 'Навсегда', 'Forever'),
            ];
        }

        if (!empty($state['posts_until'])) {
            $badges[] = [
                'class' => 'text-bg-warning',
                'text'  => admin_tt('posts', 'Пости', 'Посты', 'Posts') . ' — ' . ar_format_until((string)$state['posts_until']),
            ];
        }

        if (!empty($state['comments_until'])) {
            $badges[] = [
                'class' => 'text-bg-warning',
                'text'  => admin_tt('comments', 'Коментарі', 'Комментарии', 'Comments') . ' — ' . ar_format_until((string)$state['comments_until']),
            ];
        }

        if (!empty($state['messages_until'])) {
            $badges[] = [
                'class' => 'text-bg-warning',
                'text'  => admin_tt('private_messages', 'Повідомлення', 'Сообщения', 'Messages') . ' — ' . ar_format_until((string)$state['messages_until']),
            ];
        }

        return $badges;
    }
}

$q = trim((string)($_GET['q'] ?? ''));
$userId = (int)($_GET['user_id'] ?? $_POST['user_id'] ?? 0);
$backUrl = restr_back_url();
$selfUrl = restr_page_url();
$blockedPage = max(1, (int)($_GET['bp'] ?? 1));
$blockedPerPage = 5;
$targetUser = $userId > 0 ? restr_load_user($pdo, $userId) : null;
$searchRows = [];

if ($targetUser && restr_target_forbidden($meRole, $targetUser)) {
    flash_set('err', admin_tt(
        'restr_forbidden_target',
        'Модератор не може керувати блокуваннями адміністратора або іншого модератора.',
        'Модератор не может управлять блокировками администратора или другого модератора.',
        'Moderator cannot manage restrictions for an admin or another moderator.'
    ));
    header('Location: /admin/restrictions/');
    exit;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    admin_csrf_verify();

    $redirectTo = restr_sanitize_local_url((string)($_POST['redirect_to'] ?? ''), $selfUrl);

    $targetUserId = (int)($_POST['user_id'] ?? 0);
    $targetUser = restr_load_user($pdo, $targetUserId);

    if (!$targetUser) {
        flash_set('err', admin_tt('user_not_found', 'Користувача не знайдено.', 'Пользователь не найден.', 'User not found.'));
        header('Location: ' . $redirectTo);
        exit;
    }

    if (restr_target_forbidden($meRole, $targetUser)) {
        http_response_code(403);
        echo 'Forbidden';
        exit;
    }

    $currentState = ar_get_state($pdo, (int)$targetUser['id']);

    $data = [
        'posts_blocked_until'    => $currentState['posts_until'] ?? null,
        'comments_blocked_until' => $currentState['comments_until'] ?? null,
        'messages_blocked_until' => $currentState['messages_until'] ?? null,
        'is_banned_forever'      => !empty($currentState['ban_forever']) ? 1 : 0,
        'reason'                 => (string)($currentState['reason'] ?? ''),
    ];

    $action = trim((string)($_POST['action'] ?? 'save_all'));

    if ($action === 'clear_all') {
        $data = [
            'posts_blocked_until'    => null,
            'comments_blocked_until' => null,
            'messages_blocked_until' => null,
            'is_banned_forever'      => 0,
            'reason'                 => '',
        ];

        ar_set_state($pdo, (int)$targetUser['id'], $data, $meId);

        flash_set('ok', admin_tt('restrictions_cleared', 'Усі блокування знято.', 'Все блокировки сняты.', 'All restrictions cleared.'));
        header('Location: ' . $redirectTo);
        exit;
    }

    if ($action === 'clear_posts') {
        $data['posts_blocked_until'] = null;
        ar_set_state($pdo, (int)$targetUser['id'], $data, $meId);

        flash_set('ok', admin_tt(
            'posts_unblocked_early',
            'Обмеження на пости знято достроково.',
            'Ограничение на посты снято досрочно.',
            'Post restriction removed early.'
        ));
        header('Location: ' . $redirectTo);
        exit;
    }

    if ($action === 'clear_comments') {
        $data['comments_blocked_until'] = null;
        ar_set_state($pdo, (int)$targetUser['id'], $data, $meId);

        flash_set('ok', admin_tt(
            'comments_unblocked_early',
            'Обмеження на коментарі знято достроково.',
            'Ограничение на комментарии снято досрочно.',
            'Comment restriction removed early.'
        ));
        header('Location: ' . $redirectTo);
        exit;
    }

    if ($action === 'clear_messages') {
        $data['messages_blocked_until'] = null;
        ar_set_state($pdo, (int)$targetUser['id'], $data, $meId);

        flash_set('ok', admin_tt(
            'messages_unblocked_early',
            'Обмеження на повідомлення знято достроково.',
            'Ограничение на сообщения снято досрочно.',
            'Message restriction removed early.'
        ));
        header('Location: ' . $redirectTo);
        exit;
    }

    $data = [
        'posts_blocked_until' => restr_join_date_time(
            (string)($_POST['posts_blocked_date'] ?? ''),
            (string)($_POST['posts_blocked_time'] ?? '')
        ),
        'comments_blocked_until' => restr_join_date_time(
            (string)($_POST['comments_blocked_date'] ?? ''),
            (string)($_POST['comments_blocked_time'] ?? '')
        ),
        'messages_blocked_until' => restr_join_date_time(
            (string)($_POST['messages_blocked_date'] ?? ''),
            (string)($_POST['messages_blocked_time'] ?? '')
        ),
        'is_banned_forever' => !empty($_POST['is_banned_forever']) ? 1 : 0,
        'reason' => (string)($_POST['reason'] ?? ''),
    ];

    ar_set_state($pdo, (int)$targetUser['id'], $data, $meId);

    flash_set('ok', admin_tt('restrictions_saved', 'Блокування збережено.', 'Блокировки сохранены.', 'Restrictions saved.'));
    header('Location: ' . $redirectTo);
    exit;
}

if ($targetUser) {
    $q = trim((string)($targetUser['username'] ?? ''));
} elseif ($q !== '') {
    try {
        if (ctype_digit($q)) {
            $exact = restr_load_user($pdo, (int)$q);
            if ($exact && !restr_target_forbidden($meRole, $exact)) {
                header('Location: /admin/restrictions/?user_id=' . (int)$exact['id'] . '&back=' . rawurlencode($backUrl));
                exit;
            }
        }

        $like = '%' . $q . '%';
        $sql = "
            SELECT id, username, email, first_name, last_name, role, avatar_path
            FROM users
            WHERE (
                username LIKE ?
                OR email LIKE ?
                OR CONCAT(COALESCE(first_name,''), ' ', COALESCE(last_name,'')) LIKE ?
            )
        ";

        $params = [$like, $like, $like];

        if ($meRole === 'moderator') {
            $sql .= " AND role NOT IN ('admin', 'moderator')";
        }

        $sql .= " ORDER BY id DESC LIMIT 30";

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

$state = $targetUser ? ar_get_state($pdo, (int)$targetUser['id']) : [];

restr_cleanup_active_rows($pdo);

$blockedTotal = 0;
$blockedRows = [];
try {
    $countSql = "
        SELECT COUNT(*)
        FROM user_account_restrictions r
        INNER JOIN users u ON u.id = r.user_id
        WHERE " . restr_active_where_sql('r');

    if ($meRole === 'moderator') {
        $countSql .= " AND u.role NOT IN ('admin', 'moderator')";
    }

    $blockedTotal = (int)$pdo->query($countSql)->fetchColumn();
} catch (Throwable $e) {
    $blockedTotal = 0;
}

$blockedPages = max(1, (int)ceil($blockedTotal / $blockedPerPage));
if ($blockedPage > $blockedPages) {
    $blockedPage = $blockedPages;
}
$blockedOffset = max(0, ($blockedPage - 1) * $blockedPerPage);

try {
    $listSql = "
        SELECT
            u.id,
            u.username,
            u.email,
            u.first_name,
            u.last_name,
            u.role,
            u.avatar_path,
            r.posts_blocked_until,
            r.comments_blocked_until,
            r.messages_blocked_until,
            r.is_banned_forever,
            r.reason,
            r.updated_at
        FROM user_account_restrictions r
        INNER JOIN users u ON u.id = r.user_id
        WHERE " . restr_active_where_sql('r');

    if ($meRole === 'moderator') {
        $listSql .= " AND u.role NOT IN ('admin', 'moderator')";
    }

    $listSql .= "
        ORDER BY
            r.is_banned_forever DESC,
            r.updated_at DESC,
            r.id DESC
        LIMIT " . (int)$blockedPerPage . " OFFSET " . (int)$blockedOffset;

    $st = $pdo->query($listSql);
    $blockedRows = $st ? ($st->fetchAll(PDO::FETCH_ASSOC) ?: []) : [];
} catch (Throwable $e) {
    $blockedRows = [];
}

require __DIR__ . '/../../includes/header.php';
?>
<style>
  .restr-card{border:1px solid rgba(15,23,42,.08);border-radius:22px;background:#fff;box-shadow:0 12px 30px rgba(15,23,42,.05)}
  .restr-card + .restr-card{margin-top:16px}
  .restr-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
  .restr-user{display:flex;gap:14px;align-items:center}
  .restr-user-ava{width:74px;height:74px;border-radius:20px;overflow:hidden;background:#f1f5f9;flex:0 0 74px}
  .restr-user-ava img{width:100%;height:100%;object-fit:cover}
  .restr-user-name{font-weight:800;font-size:1.08rem;color:#0f172a}
  .restr-user-meta{color:#64748b;font-size:.95rem;line-height:1.35}
  .restr-badges{display:flex;gap:8px;flex-wrap:wrap}
  .restr-summary-list{margin:0;padding-left:1.2rem}
  .restr-summary-list li + li{margin-top:6px}
  .restr-search-item{display:flex;align-items:center;gap:12px;padding:12px 0;border-top:1px solid rgba(15,23,42,.08)}
  .restr-search-item:first-child{border-top:0;padding-top:0}
  .restr-search-ava{width:48px;height:48px;border-radius:14px;overflow:hidden;background:#f1f5f9;flex:0 0 48px}
  .restr-search-ava img{width:100%;height:100%;object-fit:cover}
  .restr-actions{display:flex;gap:10px;flex-wrap:wrap}
  .restr-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
  .restr-block{border:1px solid rgba(15,23,42,.08);border-radius:18px;padding:18px;background:#fff}
  .restr-block-title{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}
  .restr-block-title h3{font-size:1rem;font-weight:800;margin:0}
  .restr-block-status{font-size:.82rem}
  .restr-block-note{font-size:.92rem;color:#64748b;min-height:22px}
  .restr-inputs{display:grid;grid-template-columns:minmax(0,1fr) 132px;gap:10px;margin-top:12px}
  .restr-input-label{display:block;font-size:.84rem;font-weight:700;color:#475569;margin-bottom:6px}
  .restr-mini-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}
  .restr-ban-card{border:1px solid rgba(15,23,42,.08);border-radius:18px;padding:18px;background:#fff}
  .restr-list-item{display:flex;gap:12px;align-items:flex-start;padding:16px 0;border-top:1px solid rgba(15,23,42,.08)}
  .restr-list-item:first-child{border-top:0;padding-top:0}
  .restr-list-ava{width:56px;height:56px;border-radius:16px;overflow:hidden;background:#f1f5f9;flex:0 0 56px}
  .restr-list-ava img{width:100%;height:100%;object-fit:cover}
  .restr-list-main{min-width:0;flex:1 1 auto}
  .restr-list-title{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .restr-list-name{font-weight:800;color:#0f172a}
  .restr-list-meta{font-size:.92rem;color:#64748b;margin-top:2px}
  .restr-list-badges{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
  .restr-list-reason{margin-top:10px;color:#475569;font-size:.94rem}
  .restr-list-actions{display:flex;gap:10px;flex-wrap:wrap}
  .restr-pagination{display:flex;gap:8px;flex-wrap:wrap;margin-top:18px}
  .restr-pagination .btn{min-width:42px}
  @media (max-width: 1199.98px){
    .restr-grid{grid-template-columns:1fr}
  }
  @media (max-width: 767.98px){
    .restr-inputs{grid-template-columns:1fr}
    .restr-list-item{flex-direction:column}
    .restr-list-actions{width:100%}
  }
</style>

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

    <div class="restr-card p-3 p-lg-4">
      <div class="restr-head mb-3">
        <div>
          <h1 class="h4 mb-1"><?= h($title) ?></h1>
          <div class="text-muted"><?= h(admin_tt(
              'restrictions_hint',
              'Тут можна окремо обмежити пости, коментарі, приватні повідомлення або заблокувати акаунт назавжди.',
              'Здесь можно отдельно ограничить посты, комментарии, личные сообщения или заблокировать аккаунт навсегда.',
              'Here you can separately restrict posts, comments, private messages or permanently block an account.'
          )) ?></div>
        </div>
        <?php if ($backUrl !== '/admin/restrictions/'): ?>
          <a class="btn btn-outline-secondary" href="<?= h($backUrl) ?>">← <?= h(admin_tt('back', 'Назад', 'Назад', 'Back')) ?></a>
        <?php endif; ?>
      </div>

      <form method="get" class="row g-2 align-items-end">
        <div class="col-md-8">
          <label class="form-label"><?= h(admin_tt('find_user', 'Знайти користувача', 'Найти пользователя', 'Find user')) ?></label>
          <input class="form-control" type="text" name="q" value="<?= h($q) ?>" placeholder="ID / username / email / ім'я">
          <?php if ($backUrl !== '/admin/restrictions/'): ?>
            <input type="hidden" name="back" value="<?= h($backUrl) ?>">
          <?php endif; ?>
          <?php if ($blockedPage > 1): ?>
            <input type="hidden" name="bp" value="<?= (int)$blockedPage ?>">
          <?php endif; ?>
        </div>
        <div class="col-md-4 d-grid">
          <button class="btn btn-primary" type="submit"><?= h(admin_tt('search', 'Знайти', 'Найти', 'Search')) ?></button>
        </div>
      </form>
    </div>

    <?php if (!$targetUser && $searchRows): ?>
      <div class="restr-card p-3 p-lg-4">
        <div class="fw-semibold mb-2"><?= h(admin_tt('results', 'Результати пошуку', 'Результаты поиска', 'Search results')) ?></div>
        <?php foreach ($searchRows as $row): ?>
          <div class="restr-search-item">
            <div class="restr-search-ava"><img src="<?= h(restr_avatar($row)) ?>" alt=""></div>
            <div class="flex-grow-1">
              <div class="fw-semibold"><?= h(restr_display_name($row)) ?></div>
              <div class="text-muted small">@<?= h((string)($row['username'] ?? '')) ?> · <?= h((string)($row['email'] ?? '')) ?> · <?= h((string)($row['role'] ?? 'user')) ?></div>
            </div>
            <a class="btn btn-outline-danger btn-sm" href="/admin/restrictions/?user_id=<?= (int)$row['id'] ?>&back=<?= rawurlencode($backUrl) ?>"><?= h(admin_tt('open', 'Відкрити', 'Открыть', 'Open')) ?></a>
          </div>
        <?php endforeach; ?>
      </div>
    <?php endif; ?>

    <?php if ($targetUser): ?>
      <div class="restr-card p-3 p-lg-4">
        <div class="restr-head mb-3">
          <div class="restr-user">
            <div class="restr-user-ava"><img src="<?= h(restr_avatar($targetUser)) ?>" alt=""></div>
            <div>
              <div class="restr-user-name"><?= h(restr_display_name($targetUser)) ?></div>
              <div class="restr-user-meta">@<?= h((string)($targetUser['username'] ?? '')) ?> · <?= h((string)($targetUser['email'] ?? '')) ?></div>
              <div class="restr-user-meta"><?= h(admin_tt('role', 'Роль', 'Роль', 'Role')) ?>: <?= h((string)($targetUser['role'] ?? 'user')) ?></div>
            </div>
          </div>
          <div class="restr-badges">
            <?php if (!empty($state['ban_forever'])): ?>
              <span class="badge text-bg-danger"><?= h(admin_tt('forever_ban_long', 'Заблоковано назавжди', 'Заблокирован навсегда', 'Permanently blocked')) ?></span>
            <?php elseif (!empty($state['has_any'])): ?>
              <span class="badge text-bg-warning"><?= h(admin_tt('temporary_limits', 'Є активні обмеження', 'Есть активные ограничения', 'Active restrictions')) ?></span>
            <?php else: ?>
              <span class="badge text-bg-success"><?= h(admin_tt('no_limits', 'Блокувань немає', 'Блокировок нет', 'No restrictions')) ?></span>
            <?php endif; ?>
          </div>
        </div>

        <?php if (!empty($state['has_any'])): ?>
          <div class="alert alert-light border mb-3">
            <div class="fw-semibold mb-2"><?= h(admin_tt('current_state', 'Поточний стан', 'Текущее состояние', 'Current state')) ?></div>

            <?php if (!empty($state['ban_forever'])): ?>
              <div><?= h(ar_action_error($state, 'posts')) ?></div>
            <?php else: ?>
              <ul class="restr-summary-list">
                <?php foreach (($state['items'] ?? []) as $item): ?>
                  <li><?= h((string)($item['label'] ?? '')) ?> — <?= h((string)($item['until_fmt'] ?? '')) ?></li>
                <?php endforeach; ?>
              </ul>
            <?php endif; ?>

            <?php if (trim((string)($state['reason'] ?? '')) !== ''): ?>
              <div class="mt-2 text-muted"><strong><?= h(ar_t('Причина', 'Причина', 'Reason')) ?>:</strong> <?= h((string)$state['reason']) ?></div>
            <?php endif; ?>
          </div>
        <?php endif; ?>

        <form method="post" class="vstack gap-3">
          <?= admin_csrf_field() ?>
          <input type="hidden" name="user_id" value="<?= (int)$targetUser['id'] ?>">
          <input type="hidden" name="back" value="<?= h($backUrl) ?>">
          <input type="hidden" name="redirect_to" value="<?= h($selfUrl) ?>">

          <div class="restr-grid">
            <div class="restr-block">
              <div class="restr-block-title">
                <h3><?= h(admin_tt('block_posts_until', 'Пости', 'Посты', 'Posts')) ?></h3>
                <?php if (!empty($state['posts_until'])): ?>
                  <span class="badge text-bg-warning restr-block-status"><?= h(admin_tt('active', 'Активно', 'Активно', 'Active')) ?></span>
                <?php else: ?>
                  <span class="badge text-bg-light text-dark restr-block-status"><?= h(admin_tt('not_active', 'Не активно', 'Не активно', 'Inactive')) ?></span>
                <?php endif; ?>
              </div>
              <div class="restr-block-note">
                <?php if (!empty($state['posts_until'])): ?>
                  <?= h(admin_tt('until', 'До', 'До', 'Until')) ?>: <?= h(ar_format_until((string)$state['posts_until'])) ?>
                <?php else: ?>
                  <?= h(admin_tt('posts_no_limit', 'Публікація постів не обмежена.', 'Публикация постов не ограничена.', 'Posting is not restricted.')) ?>
                <?php endif; ?>
              </div>
              <div class="restr-inputs">
                <div>
                  <label class="restr-input-label"><?= h(admin_tt('date', 'Дата', 'Дата', 'Date')) ?></label>
                  <input class="form-control" type="date" name="posts_blocked_date" value="<?= h(restr_datetime_date_value((string)($state['posts_until'] ?? ''))) ?>">
                </div>
                <div>
                  <label class="restr-input-label"><?= h(admin_tt('time', 'Час', 'Время', 'Time')) ?></label>
                  <input class="form-control" type="time" name="posts_blocked_time" value="<?= h(restr_datetime_time_value((string)($state['posts_until'] ?? ''))) ?>">
                </div>
              </div>
              <div class="restr-mini-actions">
                <button class="btn btn-outline-secondary btn-sm" type="submit" name="action" value="clear_posts" <?= empty($state['posts_until']) ? 'disabled' : '' ?> onclick="return confirm('<?= h(admin_tt('confirm_clear_posts', 'Зняти обмеження на пости?', 'Снять ограничение на посты?', 'Remove post restriction?')) ?>');">
                  <?= h(admin_tt('clear_posts', 'Зняти блок постів', 'Снять блок постов', 'Clear posts block')) ?>
                </button>
              </div>
            </div>

            <div class="restr-block">
              <div class="restr-block-title">
                <h3><?= h(admin_tt('block_comments_until', 'Коментарі', 'Комментарии', 'Comments')) ?></h3>
                <?php if (!empty($state['comments_until'])): ?>
                  <span class="badge text-bg-warning restr-block-status"><?= h(admin_tt('active', 'Активно', 'Активно', 'Active')) ?></span>
                <?php else: ?>
                  <span class="badge text-bg-light text-dark restr-block-status"><?= h(admin_tt('not_active', 'Не активно', 'Не активно', 'Inactive')) ?></span>
                <?php endif; ?>
              </div>
              <div class="restr-block-note">
                <?php if (!empty($state['comments_until'])): ?>
                  <?= h(admin_tt('until', 'До', 'До', 'Until')) ?>: <?= h(ar_format_until((string)$state['comments_until'])) ?>
                <?php else: ?>
                  <?= h(admin_tt('comments_no_limit', 'Коментарі не обмежені.', 'Комментарии не ограничены.', 'Comments are not restricted.')) ?>
                <?php endif; ?>
              </div>
              <div class="restr-inputs">
                <div>
                  <label class="restr-input-label"><?= h(admin_tt('date', 'Дата', 'Дата', 'Date')) ?></label>
                  <input class="form-control" type="date" name="comments_blocked_date" value="<?= h(restr_datetime_date_value((string)($state['comments_until'] ?? ''))) ?>">
                </div>
                <div>
                  <label class="restr-input-label"><?= h(admin_tt('time', 'Час', 'Время', 'Time')) ?></label>
                  <input class="form-control" type="time" name="comments_blocked_time" value="<?= h(restr_datetime_time_value((string)($state['comments_until'] ?? ''))) ?>">
                </div>
              </div>
              <div class="restr-mini-actions">
                <button class="btn btn-outline-secondary btn-sm" type="submit" name="action" value="clear_comments" <?= empty($state['comments_until']) ? 'disabled' : '' ?> onclick="return confirm('<?= h(admin_tt('confirm_clear_comments', 'Зняти обмеження на коментарі?', 'Снять ограничение на комментарии?', 'Remove comment restriction?')) ?>');">
                  <?= h(admin_tt('clear_comments', 'Зняти блок коментарів', 'Снять блок комментариев', 'Clear comments block')) ?>
                </button>
              </div>
            </div>

            <div class="restr-block">
              <div class="restr-block-title">
                <h3><?= h(admin_tt('block_messages_until', 'Приватні повідомлення', 'Личные сообщения', 'Private messages')) ?></h3>
                <?php if (!empty($state['messages_until'])): ?>
                  <span class="badge text-bg-warning restr-block-status"><?= h(admin_tt('active', 'Активно', 'Активно', 'Active')) ?></span>
                <?php else: ?>
                  <span class="badge text-bg-light text-dark restr-block-status"><?= h(admin_tt('not_active', 'Не активно', 'Не активно', 'Inactive')) ?></span>
                <?php endif; ?>
              </div>
              <div class="restr-block-note">
                <?php if (!empty($state['messages_until'])): ?>
                  <?= h(admin_tt('until', 'До', 'До', 'Until')) ?>: <?= h(ar_format_until((string)$state['messages_until'])) ?>
                <?php else: ?>
                  <?= h(admin_tt('messages_no_limit', 'Приватні повідомлення не обмежені.', 'Личные сообщения не ограничены.', 'Private messages are not restricted.')) ?>
                <?php endif; ?>
              </div>
              <div class="restr-inputs">
                <div>
                  <label class="restr-input-label"><?= h(admin_tt('date', 'Дата', 'Дата', 'Date')) ?></label>
                  <input class="form-control" type="date" name="messages_blocked_date" value="<?= h(restr_datetime_date_value((string)($state['messages_until'] ?? ''))) ?>">
                </div>
                <div>
                  <label class="restr-input-label"><?= h(admin_tt('time', 'Час', 'Время', 'Time')) ?></label>
                  <input class="form-control" type="time" name="messages_blocked_time" value="<?= h(restr_datetime_time_value((string)($state['messages_until'] ?? ''))) ?>">
                </div>
              </div>
              <div class="restr-mini-actions">
                <button class="btn btn-outline-secondary btn-sm" type="submit" name="action" value="clear_messages" <?= empty($state['messages_until']) ? 'disabled' : '' ?> onclick="return confirm('<?= h(admin_tt('confirm_clear_messages', 'Зняти обмеження на повідомлення?', 'Снять ограничение на сообщения?', 'Remove message restriction?')) ?>');">
                  <?= h(admin_tt('clear_messages', 'Зняти блок повідомлень', 'Снять блок сообщений', 'Clear messages block')) ?>
                </button>
              </div>
            </div>
          </div>

          <div class="restr-ban-card">
            <div class="row g-3">
              <div class="col-lg-7">
                <div class="form-check form-switch m-0">
                  <input class="form-check-input" type="checkbox" role="switch" id="banForever" name="is_banned_forever" value="1" <?= !empty($state['ban_forever']) ? 'checked' : '' ?>>
                  <label class="form-check-label fw-semibold" for="banForever">
                    <?= h(admin_tt(
                        'ban_forever_label',
                        'Заблокувати назавжди',
                        'Заблокировать навсегда',
                        'Permanently block'
                    )) ?>
                  </label>
                </div>
                <div class="text-muted small mt-2">
                  <?= h(admin_tt(
                      'ban_forever_help',
                      'Людина зможе зайти лише у свій профіль і до власного контенту для завантаження.',
                      'Человек сможет зайти только в свой профиль и к собственному контенту для скачивания.',
                      'The user will only be able to access their profile and own content for download.'
                  )) ?>
                </div>
              </div>
              <div class="col-lg-5">
                <label class="form-label"><?= h(admin_tt('reason', 'Причина блокування', 'Причина блокировки', 'Reason')) ?></label>
                <textarea class="form-control" name="reason" rows="4" maxlength="2000" placeholder="<?= h(admin_tt('reason_placeholder', 'Опишіть причину для користувача', 'Опишите причину для пользователя', 'Describe the reason shown to the user')) ?>"><?= h((string)($state['reason'] ?? '')) ?></textarea>
              </div>
            </div>
          </div>

          <div class="restr-actions">
            <button class="btn btn-danger" type="submit" name="action" value="save_all"><?= h(admin_tt('save_limits', 'Зберегти блокування', 'Сохранить блокировки', 'Save restrictions')) ?></button>
            <button class="btn btn-outline-secondary" type="submit" name="action" value="clear_all" onclick="return confirm('<?= h(admin_tt('confirm_clear', 'Зняти всі блокування?', 'Снять все блокировки?', 'Clear all restrictions?')) ?>');"><?= h(admin_tt('clear_all', 'Зняти всі блокування', 'Снять все блокировки', 'Clear all restrictions')) ?></button>
            <a class="btn btn-outline-primary" href="/profile/?id=<?= (int)$targetUser['id'] ?>"><?= h(admin_tt('open_profile', 'Відкрити профіль', 'Открыть профиль', 'Open profile')) ?></a>
          </div>
        </form>
      </div>
    <?php elseif ($q !== '' && !$searchRows): ?>
      <div class="restr-card p-3 p-lg-4 text-muted">
        <?= h(admin_tt('nothing_found', 'Нічого не знайдено.', 'Ничего не найдено.', 'Nothing found.')) ?>
      </div>
    <?php endif; ?>

    <div class="restr-card p-3 p-lg-4">
      <div class="restr-head mb-3">
        <div>
          <div class="h5 mb-1"><?= h(admin_tt('blocked_users_block', 'Заблоковані', 'Заблокированные', 'Blocked users')) ?></div>
          <div class="text-muted small">
            <?= h(admin_tt(
                'blocked_users_hint',
                'Тут показані акаунти з активними тимчасовими обмеженнями або перманентним баном. По 5 користувачів на сторінці.',
                'Здесь показаны аккаунты с активными временными ограничениями или перманентным баном. По 5 пользователей на странице.',
                'Accounts with active temporary restrictions or permanent bans are shown here. 5 users per page.'
            )) ?>
          </div>
        </div>
        <span class="badge text-bg-light text-dark"><?= h(admin_tt('total', 'Всього', 'Всего', 'Total')) ?>: <?= (int)$blockedTotal ?></span>
      </div>

      <?php if ($blockedRows): ?>
        <?php foreach ($blockedRows as $row): ?>
          <?php
            $rowState = ar_get_state($pdo, (int)$row['id']);
            $rowBadges = restr_state_badges($rowState);
          ?>
          <div class="restr-list-item">
            <div class="restr-list-ava">
              <img src="<?= h(restr_avatar($row)) ?>" alt="">
            </div>

            <div class="restr-list-main">
              <div class="restr-list-title">
                <div class="restr-list-name"><?= h(restr_display_name($row)) ?></div>
                <?php if (!empty($rowState['ban_forever'])): ?>
                  <span class="badge text-bg-danger"><?= h(admin_tt('forever_ban', 'Назавжди', 'Навсегда', 'Forever')) ?></span>
                <?php endif; ?>
              </div>
              <div class="restr-list-meta">@<?= h((string)($row['username'] ?? '')) ?> · <?= h((string)($row['email'] ?? '')) ?> · <?= h((string)($row['role'] ?? 'user')) ?></div>

              <?php if ($rowBadges): ?>
                <div class="restr-list-badges">
                  <?php foreach ($rowBadges as $badge): ?>
                    <span class="badge <?= h((string)$badge['class']) ?>"><?= h((string)$badge['text']) ?></span>
                  <?php endforeach; ?>
                </div>
              <?php endif; ?>

              <?php if (trim((string)($rowState['reason'] ?? '')) !== ''): ?>
                <div class="restr-list-reason">
                  <strong><?= h(admin_tt('reason', 'Причина', 'Причина', 'Reason')) ?>:</strong>
                  <?= h((string)$rowState['reason']) ?>
                </div>
              <?php endif; ?>
            </div>

            <div class="restr-list-actions">
              <a class="btn btn-outline-primary btn-sm" href="/admin/restrictions/?user_id=<?= (int)$row['id'] ?>&bp=<?= (int)$blockedPage ?>"><?= h(admin_tt('open', 'Відкрити', 'Открыть', 'Open')) ?></a>

              <form method="post" class="m-0">
                <?= admin_csrf_field() ?>
                <input type="hidden" name="user_id" value="<?= (int)$row['id'] ?>">
                <input type="hidden" name="redirect_to" value="<?= h($selfUrl) ?>">
                <button class="btn btn-outline-danger btn-sm" type="submit" name="action" value="clear_all" onclick="return confirm('<?= h(admin_tt('confirm_clear', 'Зняти всі блокування?', 'Снять все блокировки?', 'Clear all restrictions?')) ?>');">
                  <?= h(admin_tt('unblock_now', 'Розблокувати', 'Разблокировать', 'Unblock')) ?>
                </button>
              </form>
            </div>
          </div>
        <?php endforeach; ?>

        <?php if ($blockedPages > 1): ?>
          <div class="restr-pagination">
            <?php if ($blockedPage > 1): ?>
              <a class="btn btn-outline-secondary btn-sm" href="<?= h(restr_page_url(['bp' => $blockedPage - 1])) ?>">←</a>
            <?php endif; ?>

            <?php for ($p = 1; $p <= $blockedPages; $p++): ?>
              <?php if ($p === $blockedPage): ?>
                <span class="btn btn-primary btn-sm disabled"><?= $p ?></span>
              <?php else: ?>
                <a class="btn btn-outline-secondary btn-sm" href="<?= h(restr_page_url(['bp' => $p])) ?>"><?= $p ?></a>
              <?php endif; ?>
            <?php endfor; ?>

            <?php if ($blockedPage < $blockedPages): ?>
              <a class="btn btn-outline-secondary btn-sm" href="<?= h(restr_page_url(['bp' => $blockedPage + 1])) ?>">→</a>
            <?php endif; ?>
          </div>
        <?php endif; ?>
      <?php else: ?>
        <div class="text-muted">
          <?= h(admin_tt(
              'blocked_users_empty',
              'Зараз немає активних блокувань.',
              'Сейчас нет активных блокировок.',
              'There are no active restrictions right now.'
          )) ?>
        </div>
      <?php endif; ?>
    </div>

  </div>

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

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