<?php

declare(strict_types=1);

/**
 * lib/i18n.php — Multi-idioma de la UI del panel.
 *
 * El HTML está escrito en español (PANEL_LANG_SOURCE) y NO se traduce. Para el
 * resto de idiomas se carga un catálogo `lang/<code>.php` (mapa "texto español"
 * => "traducción") que se aplica sobre el HTML ya renderizado mediante un buffer
 * de salida, tocando SOLO nodos de texto exactos y los atributos
 * title/placeholder/aria-label: nunca código PHP, JavaScript ni otros atributos.
 *
 * Idioma inicial (PANEL_LANG_DEFAULT) = inglés, porque este panel es para un
 * cliente de UK. El usuario puede cambiarlo con el selector (?lang=xx, en sesión).
 *
 * Añadir un idioma = soltar `lang/<code>.php` y registrarlo en panel_langs().
 */

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

/** Idioma en que está escrito el HTML fuente (nunca se traduce). */
const PANEL_LANG_SOURCE = 'es';
/** Idioma que ve el usuario por defecto hasta que elija otro (cliente UK). */
const PANEL_LANG_DEFAULT = 'en';

/** Idiomas disponibles: code => nombre nativo. */
function panel_langs(): array
{
    return [
        'en' => 'English',
        'es' => 'Español',
    ];
}

// Cambio de idioma vía ?lang=xx, persistido en sesión.
if (isset($_GET['lang']) && array_key_exists((string) $_GET['lang'], panel_langs())) {
    $_SESSION['panel_lang'] = (string) $_GET['lang'];
}

/** Idioma activo del panel (validado). */
function panel_lang(): string
{
    $l = (string) ($_SESSION['panel_lang'] ?? PANEL_LANG_DEFAULT);
    return array_key_exists($l, panel_langs()) ? $l : PANEL_LANG_DEFAULT;
}

/** Catálogo español => traducción del idioma activo ([] cuando es el idioma fuente). */
function panel_catalog(): array
{
    static $cache = null;
    if ($cache !== null) {
        return $cache;
    }
    $lang = panel_lang();
    $file = __DIR__ . '/../lang/' . $lang . '.php';
    $cache = ($lang !== PANEL_LANG_SOURCE && is_file($file)) ? (array) require $file : [];
    return $cache;
}

/** Traduce una cadena suelta (para textos generados desde PHP). */
function t(string $es): string
{
    $c = panel_catalog();
    return $c[$es] ?? $es;
}

/**
 * Traduce el HTML renderizado: nodos de texto exactos + atributos visibles.
 * No modifica atributos de código, scripts ni marcado.
 */
function translate_html(string $html): string
{
    $c = panel_catalog();
    if (!$c) {
        return $html;
    }
    // Nodos de texto entre > y < (coincidencia exacta tras trim).
    $html = preg_replace_callback('/>([^<>]+)</u', static function (array $m) use ($c): string {
        $key = trim($m[1]);
        if ($key === '' || !isset($c[$key])) {
            return $m[0];
        }
        return '>' . str_replace($key, $c[$key], $m[1]) . '<';
    }, $html);
    // Atributos visibles al usuario.
    $html = preg_replace_callback('/(title|placeholder|aria-label)="([^"<>]+)"/u', static function (array $m) use ($c): string {
        $key = trim($m[2]);
        return isset($c[$key]) ? $m[1] . '="' . $c[$key] . '"' : $m[0];
    }, $html);
    return $html;
}

/** Abre el buffer de traducción (llamar antes de emitir HTML). */
function i18n_begin(): void
{
    ob_start();
}

/** Cierra el buffer, traduce y emite. */
function i18n_end(): void
{
    $html = ob_get_clean();
    echo translate_html($html !== false ? $html : '');
}

/** Selector de idioma (Bootstrap dropdown) para la cabecera. */
function lang_switcher_html(): string
{
    $current = panel_lang();
    $script = htmlspecialchars(basename($_SERVER['SCRIPT_NAME'] ?? 'dashboard.php'), ENT_QUOTES);
    $out = '<div class="dropdown me-2">'
        . '<button class="btn px-2" type="button" data-bs-toggle="dropdown" aria-expanded="false" title="Idioma">'
        . '<i class="la la-language"></i> <span class="text-uppercase small">' . htmlspecialchars($current, ENT_QUOTES) . '</span>'
        . '</button><ul class="dropdown-menu dropdown-menu-end">';
    foreach (panel_langs() as $code => $name) {
        $active = $code === $current ? ' active' : '';
        $out .= '<li><a class="dropdown-item' . $active . '" href="' . $script . '?lang=' . urlencode($code) . '">'
            . htmlspecialchars($name, ENT_QUOTES) . '</a></li>';
    }
    return $out . '</ul></div>';
}
