<?php
/**
 * I18n — Çoklu dil sistemi.
 *
 * Dil tespit önceliği:
 *   1) ?lang=tr  ile manuel seçim (oturuma kaydedilir)
 *   2) Oturumda kayıtlı dil
 *   3) Tarayıcı Accept-Language başlığı (Türkiye'den gelenler için tr-TR)
 *   4) IP coğrafi tespiti (Cloudflare CF-IPCountry başlığı veya ip-api.com fallback)
 *   5) LANG_DEFAULT
 */

class Lang
{
    private static array $strings = [];
    private static string $current = LANG_DEFAULT;

    /** Ülke kodlarını dile eşle */
    private const COUNTRY_TO_LANG = [
        'TR' => 'tr',
        'DE' => 'de', 'AT' => 'de', 'CH' => 'de',
        'ES' => 'es', 'MX' => 'es', 'AR' => 'es', 'CO' => 'es', 'CL' => 'es',
        'FR' => 'fr', 'BE' => 'fr',
        'PT' => 'pt', 'BR' => 'pt',
        'US' => 'en', 'GB' => 'en', 'CA' => 'en', 'AU' => 'en', 'NZ' => 'en', 'IE' => 'en',
    ];

    public static function init(): void
    {
        $lang = self::detectLanguage();
        self::load($lang);
    }

    public static function load(string $lang): void
    {
        if (!in_array($lang, LANG_AVAILABLE, true)) {
            $lang = LANG_DEFAULT;
        }
        $file = APP_PATH . '/lang/' . $lang . '.php';
        if (!is_file($file)) {
            $file = APP_PATH . '/lang/' . LANG_DEFAULT . '.php';
        }
        self::$strings = require $file;
        self::$current = $lang;
        $_SESSION['lang'] = $lang;
    }

    public static function get(string $key, array $replace = []): string
    {
        $text = self::$strings[$key] ?? $key;
        foreach ($replace as $k => $v) {
            $text = str_replace('{' . $k . '}', (string)$v, $text);
        }
        return $text;
    }

    public static function current(): string
    {
        return self::$current;
    }

    public static function available(): array
    {
        return LANG_AVAILABLE;
    }

    private static function detectLanguage(): string
    {
        // 1) Manuel seçim
        if (isset($_GET['lang']) && in_array($_GET['lang'], LANG_AVAILABLE, true)) {
            return $_GET['lang'];
        }
        // 2) Session
        if (isset($_SESSION['lang']) && in_array($_SESSION['lang'], LANG_AVAILABLE, true)) {
            return $_SESSION['lang'];
        }
        // 3) Tarayıcı Accept-Language
        if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
            $browserLangs = self::parseAcceptLanguage($_SERVER['HTTP_ACCEPT_LANGUAGE']);
            foreach ($browserLangs as $bl) {
                $short = substr($bl, 0, 2);
                if (in_array($short, LANG_AVAILABLE, true)) {
                    return $short;
                }
            }
        }
        // 4) IP'den ülke tespiti
        $country = self::detectCountry();
        if ($country && isset(self::COUNTRY_TO_LANG[$country])) {
            $lang = self::COUNTRY_TO_LANG[$country];
            if (in_array($lang, LANG_AVAILABLE, true)) {
                return $lang;
            }
        }
        return LANG_DEFAULT;
    }

    private static function parseAcceptLanguage(string $header): array
    {
        $langs = [];
        foreach (explode(',', $header) as $part) {
            $part = trim($part);
            if ($part === '') continue;
            $bits = explode(';', $part);
            $langs[] = strtolower(trim($bits[0]));
        }
        return $langs;
    }

    private static function detectCountry(): ?string
    {
        // Cloudflare hosting kullananlar için
        if (!empty($_SERVER['HTTP_CF_IPCOUNTRY'])) {
            return strtoupper($_SERVER['HTTP_CF_IPCOUNTRY']);
        }
        // CDN-Country header
        if (!empty($_SERVER['HTTP_X_COUNTRY_CODE'])) {
            return strtoupper($_SERVER['HTTP_X_COUNTRY_CODE']);
        }
        // ip-api.com ücretsiz fallback (cache'lenmiş)
        $ip = self::clientIP();
        if (!$ip || self::isPrivateIP($ip)) return null;

        $cacheKey = 'lang_country_' . $ip;
        if (isset($_SESSION[$cacheKey])) {
            return $_SESSION[$cacheKey] ?: null;
        }

        $ctx = stream_context_create(['http' => ['timeout' => 1]]);
        $resp = @file_get_contents("http://ip-api.com/json/{$ip}?fields=countryCode", false, $ctx);
        if ($resp) {
            $data = json_decode($resp, true);
            $cc = $data['countryCode'] ?? '';
            $_SESSION[$cacheKey] = $cc;
            return $cc ?: null;
        }
        $_SESSION[$cacheKey] = '';
        return null;
    }

    private static function clientIP(): ?string
    {
        foreach (['HTTP_CF_CONNECTING_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'REMOTE_ADDR'] as $k) {
            if (!empty($_SERVER[$k])) {
                $ip = explode(',', $_SERVER[$k])[0];
                return trim($ip);
            }
        }
        return null;
    }

    private static function isPrivateIP(string $ip): bool
    {
        return !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
    }
}

// Kısayol fonksiyon
function __(string $key, array $replace = []): string
{
    return Lang::get($key, $replace);
}
