<?php
declare(strict_types=1);

/**
 * /includes/i18n.php
 * Відповідає за:
 * - поточну мову додатку (lang())
 * - встановлення мови (set_lang())
 * - переклади (t())
 *
 * SEO-ОНОВЛЕНО:
 * - lang=... більше НЕ є індексованою частиною canonical URL
 * - якщо користувач/бот відкриває публічну сторінку з ?lang=..., мову зберігаємо в session/cookie
 *   і робимо 301 на чистий URL без lang
 * - підтримуються лише uk/en/ru
 */

if (!function_exists('i18n_allowed_langs')) {
    function i18n_allowed_langs(): array
    {
        $cfg = function_exists('app_config') ? 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']));
        return $allowed ?: ['uk', 'ru', 'en'];
    }
}

if (!function_exists('i18n_default_lang')) {
    function i18n_default_lang(array $allowed): string
    {
        $cfg = function_exists('app_config') ? app_config() : [];
        $def = strtolower(trim((string)($cfg['app']['default_lang'] ?? 'uk')));
        return in_array($def, $allowed, true) ? $def : 'uk';
    }
}

if (!function_exists('i18n_normalize_lang')) {
    function i18n_normalize_lang(?string $lang, array $allowed, string $fallback): string
    {
        $lang = strtolower(trim((string)$lang));
        return in_array($lang, $allowed, true) ? $lang : $fallback;
    }
}

if (!function_exists('i18n_is_https_request')) {
    function i18n_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');
    }
}

if (!function_exists('i18n_set_cookie')) {
    function i18n_set_cookie(string $lang): void
    {
        $currentCookieLang = (string)($_COOKIE['lang'] ?? '');
        if ($currentCookieLang === $lang) return;

        $opts = [
            'expires'  => time() + 3600 * 24 * 365,
            'path'     => '/',
            'secure'   => i18n_is_https_request(),
            'httponly' => true,
            'samesite' => 'Lax',
        ];
        setcookie('lang', $lang, $opts);
    }
}

if (!function_exists('i18n_strip_noise_params')) {
    function i18n_strip_noise_params(string $url): string
    {
        $url = trim($url);
        if ($url === '') return '/';

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

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

        $qs = [];
        if (!empty($p['query'])) {
            parse_str((string)$p['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($p['fragment'])) {
            $out .= '#' . (string)$p['fragment'];
        }

        return $out;
    }
}

if (!function_exists('i18n_should_clean_lang_redirect')) {
    function i18n_should_clean_lang_redirect(): bool
    {
        if (PHP_SAPI === 'cli') return false;
        if (headers_sent()) return false;

        $method = strtoupper((string)($_SERVER['REQUEST_METHOD'] ?? 'GET'));
        if ($method !== 'GET') return false;

        $path = (string)parse_url((string)($_SERVER['REQUEST_URI'] ?? '/'), PHP_URL_PATH);
        if ($path === '') $path = '/';

        if ($path === '/set_lang.php') return false;

        return true;
    }
}

$__i18nAllowed = i18n_allowed_langs();
$__i18nDefault = i18n_default_lang($__i18nAllowed);

$__langFromGet = array_key_exists('lang', $_GET)
    ? i18n_normalize_lang((string)($_GET['lang'] ?? ''), $__i18nAllowed, $__i18nDefault)
    : '';

$__langFromSession = i18n_normalize_lang(
    (string)(($_SESSION['lang'] ?? '') ?: ''),
    $__i18nAllowed,
    $__i18nDefault
);

$__langFromCookie = i18n_normalize_lang(
    (string)(($_COOKIE['lang'] ?? '') ?: ''),
    $__i18nAllowed,
    $__i18nDefault
);

$__resolvedLang = $__langFromGet !== ''
    ? $__langFromGet
    : ($__langFromSession !== '' ? $__langFromSession : $__langFromCookie);

if ($__resolvedLang === '') {
    $__resolvedLang = $__i18nDefault;
}

$GLOBALS['_APP_LANG'] = $__resolvedLang;

if (session_status() === PHP_SESSION_ACTIVE) {
    $_SESSION['lang'] = $__resolvedLang;
}
i18n_set_cookie($__resolvedLang);

/**
 * Якщо відкрили сторінку з ?lang=... — фіксуємо мову в cookie/session
 * і віддаємо 301 на чистий URL без lang.
 */
if (array_key_exists('lang', $_GET) && i18n_should_clean_lang_redirect()) {
    $target = i18n_strip_noise_params((string)($_SERVER['REQUEST_URI'] ?? '/'));
    if ($target === '') $target = '/';

    header('Location: ' . $target, true, 301);
    exit;
}

if (!function_exists('set_lang')) {
    function set_lang(string $lang): void
    {
        $allowed  = i18n_allowed_langs();
        $fallback = i18n_default_lang($allowed);
        $lang     = i18n_normalize_lang($lang, $allowed, $fallback);

        $GLOBALS['_APP_LANG'] = $lang;

        if (session_status() === PHP_SESSION_ACTIVE) {
            $_SESSION['lang'] = $lang;
        }

        i18n_set_cookie($lang);
    }
}

if (!function_exists('lang')) {
    function lang(): string
    {
        $l = (string)($GLOBALS['_APP_LANG'] ?? 'uk');
        $l = strtolower(trim($l));
        if (!in_array($l, ['uk', 'ru', 'en'], true)) $l = 'uk';
        return $l;
    }
}

if (!function_exists('t')) {
    function t(string $key): string
    {
        static $dict = null;

        if (!is_array($dict)) {
            $dict = [
                'uk' => [
                    'site' => 'VMEREGI',
                    'home' => 'Головна',
                    'feed' => 'Стрічка',
                    'admin' => 'Адмінка',
                    'login' => 'Вхід',
                    'register' => 'Реєстрація',
                    'logout' => 'Вийти',

                    'confirm' => 'Підтвердити',
                    'cancel' => 'Скасувати',

                    'groups' => 'Групи',
                    'audio' => 'Аудіо',
                    'users' => 'Користувачі',
                    'search' => 'Пошук',

                    'email' => 'Email',
                    'username' => "Нікнейм",
                    'password' => 'Пароль',
                    'repeat_password' => 'Повторіть пароль',
                    'have_account' => 'Вже є акаунт?',
                    'no_account' => 'Немає акаунту?',
                    'welcome_title' => 'VMEREGI - перша українська соціальна мережа',
                    'welcome_text' => 'Друзі, спілкування, групи та пости.',
                    'create_post' => 'Написати пост',
                    'post_placeholder' => 'Що у вас нового?',
                    'publish' => 'Опублікувати',
                    'latest_posts' => 'Останні пости',
                    'only_for_logged' => 'Потрібен вхід.',
                    'bad_csrf' => 'Помилка безпеки (CSRF).',
                    'bad_login' => 'Невірний email або пароль.',
                    'bad_register' => 'Перевірте поля реєстрації.',
                    'email_taken' => 'Такий email вже зареєстрований.',
                    'username_taken' => 'Такий нікнейм вже зайнятий.',
                    'password_short' => 'Пароль має бути мінімум 6 символів.',
                    'password_mismatch' => 'Паролі не співпадають.',

                    'activation_title' => 'Активація',
                    'activation_subject' => 'Активація акаунта VMEREGI',
                    'activation_sent' => 'Ми надіслали лист з активацією на вашу пошту. Відкрийте лист і натисніть “Активувати”.',
                    'activation_mail_title' => 'Активація акаунта',
                    'activation_mail_text' => 'Щоб активувати акаунт, натисніть кнопку нижче:',
                    'activation_button' => 'Активувати',
                    'activation_link_fallback' => 'Якщо кнопка не працює — відкрийте це посилання:',
                    'activation_ok' => 'Акаунт активовано. Ласкаво просимо!',
                    'activation_bad' => 'Посилання активації недійсне або вже використане.',
                    'activation_need' => 'Акаунт не активований. Перевірте пошту і активуйте акаунт.',
                    'mail_fail' => 'Не вдалося надіслати лист. Спробуйте пізніше або перевірте SMTP.',

                    'attach_files' => 'Прикріпити файли',
                    'poll_add' => 'Додати опитування',
                    'poll_question' => 'Питання',
                    'poll_options' => 'Варіанти (1–10)',
                    'poll_add_option' => 'Додати варіант',
                    'poll_vote' => 'Проголосувати',
                    'poll_total_votes' => 'Всього голосів',
                    'like' => 'Лайк',
                    'dislike' => 'Дизлайк',
                    'post_empty' => 'Пост порожній (немає тексту/файлів/опитування).',
                    'comment_empty' => 'Коментар порожній (немає тексту/файлів).',
                    'upload_bad' => 'Не вдалося завантажити файл.',
                    'upload_type_bad' => 'Неприпустимий тип файлу.',
                    'upload_too_big' => 'Файл завеликий.',
                    'download' => 'Завантажити',

                    'comments' => 'Коментарі',
                    'write_comment' => 'Написати коментар…',
                    'reply' => 'Відповісти',
                    'send' => 'Надіслати',

                    'admin_dashboard' => 'Панель адміністратора',
                    'stats' => 'Статистика',
                    'posts' => 'Пости',
                    'total_users' => 'Всього користувачів',
                    'total_posts' => 'Всього постів',
                ],

                'en' => [
                    'site' => 'VMEREGI',
                    'home' => 'Home',
                    'feed' => 'Feed',
                    'admin' => 'Admin',
                    'login' => 'Login',
                    'register' => 'Register',
                    'logout' => 'Logout',

                    'confirm' => 'Confirm',
                    'cancel' => 'Cancel',

                    'groups' => 'Groups',
                    'audio' => 'Audio',
                    'users' => 'Users',
                    'search' => 'Search',

                    'email' => 'Email',
                    'username' => 'Username',
                    'password' => 'Password',
                    'repeat_password' => 'Repeat password',
                    'have_account' => 'Already have an account?',
                    'no_account' => "Don't have an account?",
                    'welcome_title' => 'VMEREGI - the first Ukrainian social network',
                    'welcome_text' => 'Friends, messaging, groups and posts.',
                    'create_post' => 'Create post',
                    'post_placeholder' => "What's new?",
                    'publish' => 'Publish',
                    'latest_posts' => 'Latest posts',
                    'only_for_logged' => 'Login required.',
                    'bad_csrf' => 'Security error (CSRF).',
                    'bad_login' => 'Wrong email or password.',
                    'bad_register' => 'Check registration fields.',
                    'email_taken' => 'Email is already registered.',
                    'username_taken' => 'Username is already taken.',
                    'password_short' => 'Password must be at least 6 characters.',
                    'password_mismatch' => 'Passwords do not match.',

                    'activation_title' => 'Activation',
                    'activation_subject' => 'Activate your VMEREGI account',
                    'activation_sent' => 'We sent an activation email. Open it and click “Activate”.',
                    'activation_mail_title' => 'Account activation',
                    'activation_mail_text' => 'To activate your account, click the button below:',
                    'activation_button' => 'Activate',
                    'activation_link_fallback' => "If the button doesn't work, open this link:",
                    'activation_ok' => 'Account activated. Welcome!',
                    'activation_bad' => 'Activation link is invalid or already used.',
                    'activation_need' => 'Account is not activated yet. Check your email and activate it.',
                    'mail_fail' => 'Failed to send email. Please try later or check SMTP settings.',

                    'attach_files' => 'Attach files',
                    'poll_add' => 'Add poll',
                    'poll_question' => 'Question',
                    'poll_options' => 'Options (1–10)',
                    'poll_add_option' => 'Add option',
                    'poll_vote' => 'Vote',
                    'poll_total_votes' => 'Total votes',
                    'like' => 'Like',
                    'dislike' => 'Dislike',
                    'post_empty' => 'Empty post (no text/files/poll).',
                    'comment_empty' => 'Empty comment (no text/files).',
                    'upload_bad' => 'Failed to upload file.',
                    'upload_type_bad' => 'File type not allowed.',
                    'upload_too_big' => 'File is too large.',
                    'download' => 'Download',

                    'comments' => 'Comments',
                    'write_comment' => 'Write a comment…',
                    'reply' => 'Reply',
                    'send' => 'Send',

                    'admin_dashboard' => 'Admin dashboard',
                    'stats' => 'Stats',
                    'posts' => 'Posts',
                    'total_users' => 'Total users',
                    'total_posts' => 'Total posts',
                ],

                'ru' => [
                    'site' => 'VMEREGI',
                    'home' => 'Главная',
                    'feed' => 'Лента',
                    'admin' => 'Админка',
                    'login' => 'Вход',
                    'register' => 'Регистрация',
                    'logout' => 'Выйти',

                    'confirm' => 'Подтвердить',
                    'cancel' => 'Отмена',

                    'groups' => 'Группы',
                    'audio' => 'Аудио',
                    'users' => 'Пользователи',
                    'search' => 'Поиск',

                    'email' => 'Email',
                    'username' => 'Никнейм',
                    'password' => 'Пароль',
                    'repeat_password' => 'Повторите пароль',
                    'have_account' => 'Уже есть аккаунт?',
                    'no_account' => 'Нет аккаунта?',
                    'welcome_title' => 'VMEREGI - первая украинская социальная сеть',
                    'welcome_text' => 'Друзья, общение, группы и посты.',
                    'create_post' => 'Написать пост',
                    'post_placeholder' => 'Что у вас нового?',
                    'publish' => 'Опубликовать',
                    'latest_posts' => 'Последние посты',
                    'only_for_logged' => 'Нужен вход.',
                    'bad_csrf' => 'Ошибка безопасности (CSRF).',
                    'bad_login' => 'Неверный email или пароль.',
                    'bad_register' => 'Проверьте поля регистрации.',
                    'email_taken' => 'Такой email уже зарегистрирован.',
                    'username_taken' => 'Такой никнейм уже занят.',
                    'password_short' => 'Пароль минимум 6 символов.',
                    'password_mismatch' => 'Пароли не совпадают.',

                    'activation_title' => 'Активация',
                    'activation_subject' => 'Активация аккаунта VMEREGI',
                    'activation_sent' => 'Мы отправили письмо с активацией. Откройте письмо и нажмите “Активировать”.',
                    'activation_mail_title' => 'Активация аккаунта',
                    'activation_mail_text' => 'Чтобы активировать аккаунт, нажмите кнопку ниже:',
                    'activation_button' => 'Активировать',
                    'activation_link_fallback' => 'Если кнопка не работает — откройте эту ссылку:',
                    'activation_ok' => 'Аккаунт активирован. Добро пожаловать!',
                    'activation_bad' => 'Ссылка активации недействительна или уже использована.',
                    'activation_need' => 'Аккаунт не активирован. Проверьте почту и активируйте аккаунт.',
                    'mail_fail' => 'Не удалось отправить письмо. Попробуйте позже или проверьте SMTP.',

                    'attach_files' => 'Прикрепить файлы',
                    'poll_add' => 'Добавить опрос',
                    'poll_question' => 'Вопрос',
                    'poll_options' => 'Варианты (1–10)',
                    'poll_add_option' => 'Добавить вариант',
                    'poll_vote' => 'Проголосовать',
                    'poll_total_votes' => 'Всего голосов',
                    'like' => 'Лайк',
                    'dislike' => 'Дизлайк',
                    'post_empty' => 'Пустой пост (нет текста/файлов/опроса).',
                    'comment_empty' => 'Пустой комментарий (нет текста/файлов).',
                    'upload_bad' => 'Не удалось загрузить файл.',
                    'upload_type_bad' => 'Недопустимый тип файла.',
                    'upload_too_big' => 'Файл слишком большой.',
                    'download' => 'Скачать',

                    'comments' => 'Комментарии',
                    'write_comment' => 'Написать комментарий…',
                    'reply' => 'Ответить',
                    'send' => 'Отправить',

                    'admin_dashboard' => 'Панель администратора',
                    'stats' => 'Статистика',
                    'posts' => 'Посты',
                    'total_users' => 'Всего пользователей',
                    'total_posts' => 'Всего постов',
                ],
            ];
        }

        $l = lang();
        return (string)($dict[$l][$key] ?? $dict['uk'][$key] ?? $key);
    }
}