<?php
declare(strict_types=1);

/**
 * /logout.php
 * Вихід з акаунта.
 *
 * ПОВЕДІНКА:
 * - GET: показує сторінку підтвердження (кнопка -> POST з CSRF)
 * - POST: робить logout (CSRF обов'язковий)
 *
 * Причина: захист від CSRF-логаута через зовнішні посилання/картинки.
 */

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

/* SEO: logout page should not be indexed */
$meta_robots = 'noindex, nofollow, noarchive, nosnippet';
$meta_desc   = '';
$canonical   = function_exists('abs_url') ? abs_url('/logout.php') : '/logout.php';
if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    header('Cache-Control: no-store', true);
}

/* fallback helpers */
if (!function_exists('h')) {
    function h(?string $s): string { return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); }
}
if (!function_exists('redirect_303')) {
    function redirect_303(string $to): void {
        if (!headers_sent()) {
            header('Location: ' . $to, true, 303);
        } else {
            echo '<meta http-equiv="refresh" content="0;url=' . htmlspecialchars($to, ENT_QUOTES, 'UTF-8') . '">';
            echo '<script>location.href=' . json_encode($to) . ';</script>';
        }
        exit;
    }
}
if (!function_exists('norm_local_url')) {
    function norm_local_url(string $raw): string {
        $raw = trim($raw);
        if ($raw === '') return '';

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

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

        return $raw;
    }
}
if (!function_exists('logout_public_back')) {
    function logout_public_back(string $raw): string {
        $back = norm_local_url($raw);
        if ($back === '') {
            return '/';
        }

        $path = (string)parse_url($back, PHP_URL_PATH);
        if ($path === '') {
            $path = '/';
        }

        $blockedPrefixes = [
            '/admin',
            '/messages',
            '/profile/setting',
            '/functional/reclama',
            '/functional/files',
            '/functional/search',
            '/functional/games',
            '/games',
        ];
        foreach ($blockedPrefixes as $prefix) {
            if (str_starts_with($path, $prefix)) {
                return '/';
            }
        }

        $blockedExact = ['/login.php', '/register.php', '/logout.php', '/set_lang.php'];
        if (in_array($path, $blockedExact, true)) {
            return '/';
        }

        return $back;
    }
}

/* safe back */
$back = logout_public_back((string)($_POST['back'] ?? ($_GET['back'] ?? '')));

$title = t('logout');

if (($_SERVER['REQUEST_METHOD'] ?? '') === 'POST') {
    if (!csrf_check(post_str('csrf'))) {
        flash_set('err', t('bad_csrf'));
        redirect_303($back);
    }

    logout_user();
    flash_set('ok', t('logout') . ' OK');
    redirect_303($back);
}

/* GET => show confirm page */
require __DIR__ . '/includes/header.php';
?>

<div class="row justify-content-center">
  <div class="col-md-7 col-lg-6">
    <div class="card card-app p-4">
      <h1 class="h4 mb-2"><?= h(t('logout')) ?></h1>

      <div class="alert alert-warning mb-3">
        <?= h(t('confirm')) ?>?
      </div>

      <form method="post" class="d-flex gap-2 flex-wrap">
        <?= csrf_field() ?>
        <input type="hidden" name="back" value="<?= h($back) ?>">
        <button class="btn btn-danger" type="submit"><?= h(t('logout')) ?></button>
        <a class="btn btn-outline-secondary" href="<?= h($back) ?>"><?= h(t('cancel') ?: 'Cancel') ?></a>
      </form>
    </div>
  </div>
</div>

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