<?php
declare(strict_types=1);

/**
 * /functional/group/toggle_closed.php
 * Перемикає стан groups.is_closed (закрити/відкрити групу).
 * Доступ: власник/адмін групи (g_can_manage_group).
 * POST: id, csrf, back(optional)
 *
 * Оновлено:
 * - SEO: noindex + no-store (endpoint)
 * - require_login() якщо є
 * - строгий POST + CSRF
 * - back тільки локальний (safe_local_path / fallback)
 * - schema-flex: updated_at якщо існує
 * - атомарний toggle: is_closed = 1 - is_closed
 */

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

/* SEO: endpoint не індексуємо */
if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    header('Cache-Control: no-store, max-age=0', true);
}

/* login */
if (function_exists('require_login')) {
    require_login();
}

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

if (!$me) {
    redirect('/login.php');
}

/* method */
if (!function_exists('is_post')) {
    function is_post(): bool {
        return (string)($_SERVER['REQUEST_METHOD'] ?? '') === 'POST';
    }
}

if (!is_post()) {
    http_response_code(405);
    echo "Method Not Allowed";
    exit;
}

if (!g_table_exists($pdo, 'groups')) {
    http_response_code(500);
    echo "DB schema missing: groups";
    exit;
}

/* safe back */
$backRaw = trim((string)($_POST['back'] ?? ''));
if ($backRaw === '') $backRaw = '/functional/group/index.php';

if (function_exists('safe_local_path')) {
    $back = safe_local_path($backRaw, '/functional/group/index.php');
} else {
    // fallback: тільки відносні шляхи всередині сайту
    $back = $backRaw;
    if ($back === '' || $back[0] !== '/' || str_starts_with($back, '//') || preg_match('~^https?://~i', $back)) {
        $back = '/functional/group/index.php';
    }
}

/* csrf */
$token = (string)($_POST['csrf'] ?? '');
$csrfOk = false;

if (function_exists('csrf_check')) {
    $csrfOk = (bool)csrf_check($token);
} else {
    $csrfOk = g_csrf_check($token);
}

if (!$csrfOk) {
    if (function_exists('flash_set')) {
        flash_set('err', 'CSRF');
    }
    $sep = (strpos($back, '?') !== false) ? '&' : '?';
    redirect($back . $sep . 'm=csrf');
}

/* group id */
$gid = (int)($_POST['id'] ?? 0);
if ($gid <= 0) {
    $sep = (strpos($back, '?') !== false) ? '&' : '?';
    redirect($back . $sep . 'm=bad_id');
}

$g = g_group_get($pdo, $gid);
if (!$g) {
    $sep = (strpos($back, '?') !== false) ? '&' : '?';
    redirect($back . $sep . 'm=not_found');
}

if (!g_column_exists($pdo, 'groups', 'is_closed')) {
    $sep = (strpos($back, '?') !== false) ? '&' : '?';
    redirect($back . $sep . 'm=no_col');
}

if (!g_can_manage_group($me, $g)) {
    http_response_code(403);
    echo "Forbidden";
    exit;
}

/* toggle */
try {
    $hasUpdatedAt = g_column_exists($pdo, 'groups', 'updated_at');

    if ($hasUpdatedAt) {
        $st = $pdo->prepare("UPDATE `groups` SET is_closed = 1 - is_closed, updated_at=? WHERE id=? LIMIT 1");
        $st->execute([g_now(), $gid]);
    } else {
        $st = $pdo->prepare("UPDATE `groups` SET is_closed = 1 - is_closed WHERE id=? LIMIT 1");
        $st->execute([$gid]);
    }

    if (function_exists('flash_set')) {
        flash_set('ok', g_t('Збережено.', 'Сохранено.', 'Saved.'));
    }

    $sep = (strpos($back, '?') !== false) ? '&' : '?';
    redirect($back . $sep . 'm=ok');

} catch (Throwable $e) {
    error_log('[group toggle_closed] ' . $e->getMessage());

    if (function_exists('flash_set')) {
        flash_set('err', g_t('Помилка збереження.', 'Ошибка сохранения.', 'Save error.'));
    }

    $sep = (strpos($back, '?') !== false) ? '&' : '?';
    redirect($back . $sep . 'm=err');
}