<?php
declare(strict_types=1);

/**
 * /set_lang.php
 * Перемикач мови:
 * - приймає ?lang=uk|en|ru
 * - зберігає в session + cookie
 * - редіректить на ?to=... (тільки локальний шлях)
 *
 * SEO-ОНОВЛЕНО:
 * - більше НЕ додає lang у фінальний URL
 * - фінальний URL очищається від lang і шумових параметрів
 * - endpoint лишається noindex
 */

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

if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0', true);
    header('Pragma: no-cache', true);
}

$cfg = app_config();
$allowed = $cfg['app']['langs'] ?? ['uk','en','ru'];
if (!is_array($allowed) || !$allowed) $allowed = ['uk','en','ru'];

$allowed = array_values(array_unique(array_map(static function($v){
    return strtolower(trim((string)$v));
}, $allowed)));
$allowed = array_values(array_intersect($allowed, ['uk','ru','en']));
if (!$allowed) $allowed = ['uk','ru','en'];

$default = strtolower(trim((string)($cfg['app']['default_lang'] ?? 'uk')));
if (!in_array($default, $allowed, true)) $default = 'uk';

$new = strtolower(trim((string)($_GET['lang'] ?? '')));
if (!in_array($new, $allowed, true)) {
    $new = $default;
}

$_SESSION['lang'] = $new;

function is_https_request(): bool
{
    $cfv = (string)($_SERVER['HTTP_CF_VISITOR'] ?? '');
    if ($cfv !== '') {
        $j = json_decode($cfv, true);
        if (is_array($j) && isset($j['scheme']) && is_string($j['scheme'])) {
            return strtolower(trim($j['scheme'])) === 'https';
        }
    }

    $xfp = (string)($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '');
    if ($xfp !== '') {
        $first = strtolower(trim(explode(',', $xfp)[0]));
        if ($first === 'https') return true;
    }

    $xfs = strtolower(trim((string)($_SERVER['HTTP_X_FORWARDED_SSL'] ?? '')));
    if ($xfs === 'on' || $xfs === '1' || $xfs === 'true') return true;

    $https = strtolower(trim((string)($_SERVER['HTTPS'] ?? '')));
    return ($https !== '' && $https !== 'off' && $https !== '0');
}

$isHttps = is_https_request();

$currentCookieLang = (string)($_COOKIE['lang'] ?? '');
if ($currentCookieLang !== $new) {
    $cookieOpts = [
        'expires'  => time() + 3600 * 24 * 365,
        'path'     => '/',
        'secure'   => $isHttps,
        'httponly' => true,
        'samesite' => 'Lax',
    ];
    setcookie('lang', $new, $cookieOpts);
}

function strip_noise_and_lang_from_local_url(string $url): string
{
    $url = trim($url);
    if ($url === '') return '/';

    $parts = parse_url($url);
    if (!is_array($parts)) return '/';

    $path = (string)($parts['path'] ?? '/');
    if ($path === '') $path = '/';

    $qs = [];
    if (!empty($parts['query'])) {
        parse_str((string)$parts['query'], $qs);
        if (!is_array($qs)) $qs = [];
    }

    $removeExact = [
        'lang','to',
        'debug_flash','clear_flash','show_ok',
        'pjax','ajax','_t','ts','nonce','token',
        '_nrd','_nid',
        'gclid','fbclid','yclid','ymclid','gbraid','wbraid',
        '_ga','_gid','_gac','_gl','mc_cid','mc_eid',
        'ref','refid','source','src','spm','from','igshid'
    ];

    foreach (array_keys($qs) as $k) {
        $lk = strtolower((string)$k);

        if (str_starts_with($lk, 'utm_') || in_array($lk, $removeExact, true)) {
            unset($qs[$k]);
        }
    }

    if (!empty($qs)) ksort($qs);

    $out = $path;
    if (!empty($qs)) {
        $out .= '?' . http_build_query($qs);
    }

    if (!empty($parts['fragment'])) {
        $out .= '#' . (string)$parts['fragment'];
    }

    return $out;
}

$toRaw = (string)($_GET['to'] ?? '/');
$toDecoded = rawurldecode($toRaw);
$toLocal = safe_local_path($toDecoded, '/');
$to = strip_noise_and_lang_from_local_url($toLocal);
if ($to === '') $to = '/';

header('Location: ' . $to, true, 302);
exit;