<?php
declare(strict_types=1);

namespace Celena\Core\Support;

use Celena\Core\Http\Request;

/**
 * Простая эвристика определения, находится ли посетитель в ЕС/ЕЭЗ/UK.
 * Приоритет сигналов:
 *   1. HTTP-заголовок `CF-IPCountry` (Cloudflare).
 *   2. HTTP-заголовок `X-Country-Code` (популярные CDN: Fastly, AWS).
 *   3. HTTP-заголовок `X-Vercel-IP-Country`.
 *   4. `Accept-Language` — если основной локаль из ЕС-списка, считаем ЕС.
 *
 * GDPR консервативен — если ничего не известно, возвращаем true (показать баннер).
 */
final class EuDetector
{
    /** EU + EEA + UK (GDPR/UK-GDPR применимы). */
    private const EU_COUNTRIES = [
        'AT','BE','BG','HR','CY','CZ','DK','EE','FI','FR','DE','GR','HU','IE','IT','LV','LT','LU',
        'MT','NL','PL','PT','RO','SK','SI','ES','SE',     // EU
        'IS','LI','NO',                                     // EEA
        'GB',                                               // UK
    ];

    /** Языковые коды, характерные для ЕС (грубая эвристика для fallback). */
    private const EU_LANGS = [
        'de','fr','es','it','pt','nl','pl','sv','da','fi','cs','sk','hu','ro','bg','hr','el',
        'et','lv','lt','mt','sl','ga','is','no','nb','nn',
    ];

    public static function isInEu(Request $request): bool
    {
        $headers = ['cf-ipcountry', 'x-country-code', 'x-vercel-ip-country'];
        foreach ($headers as $h) {
            $cc = strtoupper((string) $request->header($h));
            if ($cc !== '' && $cc !== 'XX') {
                return in_array($cc, self::EU_COUNTRIES, true);
            }
        }

        // Fallback: основной язык в Accept-Language
        $accept = (string) $request->header('accept-language');
        if ($accept !== '') {
            $first = strtolower(trim(explode(',', $accept)[0]));
            $first = explode(';', $first)[0];
            $lang  = explode('-', $first)[0];
            if (in_array($lang, self::EU_LANGS, true)) {
                return true;
            }
            // Если язык явно не-ЕС (ru, uk, kk, zh, ja, ko, en без региона) — считаем не ЕС.
            if (in_array($lang, ['ru','uk','kk','be','zh','ja','ko','ar','he','tr','vi','th','id','fa'], true)) {
                return false;
            }
        }

        // Ничего не знаем — показываем баннер (safe default для GDPR).
        return true;
    }
}
