<?php
declare(strict_types=1);

/**
 * /admin/groups/toggle_closed.php
 * Адмін: закрити/відкрити групу (groups.is_closed).
 *
 * ОНОВЛЕНО:
 * - backUrl: пріоритет POST back (передаємо з /admin/groups/), fallback referer
 * - safe back (тільки /admin/*)
 * - нормалізація to -> 0/1
 * - перевірка існування групи
 */

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

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

$pdo = db();

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

/* ===== fallbacks (якщо десь ще старі хелпери) ===== */
if (!function_exists('admin_safe_back')) {
    function admin_safe_back(string $p, string $fallback = '/admin/groups/'): string {
        $p = trim($p);
        if ($p === '') return $fallback;
        if ($p[0] !== '/') return $fallback;
        if (str_contains($p, "\0")) return $fallback;
        if (str_contains($p, '..')) return $fallback;
        if (preg_match('~^//~', $p)) return $fallback;
        if (!preg_match('~^/admin/~', $p)) return $fallback;
        return $p;
    }
}

if (!function_exists('admin_groups_back_from_referer')) {
    function admin_groups_back_from_referer(string $fallback = '/admin/groups/'): string {
        $ref = (string)($_SERVER['HTTP_REFERER'] ?? '');
        if ($ref === '') return $fallback;

        $parts = parse_url($ref);
        if (!$parts) return $fallback;

        $path = (string)($parts['path'] ?? '');
        if (!in_array($path, ['/admin/groups/', '/admin/groups.php'], true)) return $fallback;

        $q = (string)($parts['query'] ?? '');
        $candidate = $q !== '' ? ($fallback . '?' . $q) : $fallback;

        return admin_safe_back($candidate, $fallback);
    }
}

/* ===== backUrl: POST back -> referer -> default ===== */
$defaultBack = '/admin/groups/';
$backRaw = (string)($_POST['back'] ?? '');
$backUrl = ($backRaw !== '')
    ? admin_safe_back($backRaw, $defaultBack)
    : admin_groups_back_from_referer($defaultBack);

/* ===== method ===== */
if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') {
    http_response_code(405);
    exit('Method Not Allowed');
}

/* ===== csrf ===== */
if (!admin_csrf_verify()) {
    admin_flash_set('danger', admin_tt('csrf_bad', 'CSRF помилка', 'CSRF ошибка', 'CSRF error'));
    header('Location: ' . $backUrl);
    exit;
}

/* ===== input ===== */
$id = (int)($_POST['id'] ?? 0);
$to = (int)($_POST['to'] ?? 0);
$to = $to ? 1 : 0;

if ($id <= 0) {
    admin_flash_set('danger', admin_tt('admin_bad_id', 'Невірний ID', 'Неверный ID', 'Bad ID'));
    header('Location: ' . $backUrl);
    exit;
}

/* ===== schema checks ===== */
if (!admin_table_exists($pdo, 'groups') || !admin_column_exists($pdo, 'groups', 'is_closed')) {
    admin_flash_set(
        'warning',
        admin_tt('admin_need_closed_col', 'Потрібна колонка groups.is_closed', 'Нужна колонка groups.is_closed', 'Need groups.is_closed')
    );
    header('Location: ' . $backUrl);
    exit;
}

/* ===== ensure group exists ===== */
try {
    $st = $pdo->prepare("SELECT id, is_closed FROM `groups` WHERE id=? LIMIT 1");
    $st->execute([$id]);
    $g = $st->fetch(PDO::FETCH_ASSOC);

    if (!$g) {
        admin_flash_set('danger', admin_tt('admin_not_found', 'Не знайдено', 'Не найдено', 'Not found'));
        header('Location: ' . $backUrl);
        exit;
    }
} catch (Throwable $e) {
    admin_flash_set('danger', admin_tt('admin_save_error', 'Помилка збереження', 'Ошибка сохранения', 'Save error'));
    header('Location: ' . $backUrl);
    exit;
}

/* ===== update ===== */
try {
    $st = $pdo->prepare("UPDATE `groups` SET is_closed=? WHERE id=? LIMIT 1");
    $st->execute([$to, $id]);

    admin_flash_set(
        'success',
        $to
            ? admin_tt('admin_group_closed', 'Групу закрито', 'Группа закрыта', 'Group closed')
            : admin_tt('admin_group_opened', 'Групу відкрито', 'Группа открыта', 'Group opened')
    );
} catch (Throwable $e) {
    admin_flash_set('danger', admin_tt('admin_save_error', 'Помилка збереження', 'Ошибка сохранения', 'Save error'));
}

header('Location: ' . $backUrl);
exit;