<?php
// Prevent direct access
if (count(get_included_files()) === 1) {
    http_response_code(403);
    exit('Forbidden');
}

require_once __DIR__ . '/countries.php';

/**
 * Helpers de formato y contexto por país para uso en vistas y agente.
 * Nunca convierte entre monedas — cada negocio opera en su moneda local.
 */
class PaisHelper {

    /**
     * Formatea un monto en la moneda del país.
     * PaisHelper::moneda(1500.5, 'NI')  → "C$ 1,500.50"
     * PaisHelper::moneda(350, 'HN')     → "L 350.00"
     */
    public static function moneda(float $monto, string $pais, int $decimales = 2): string {
        $c = Countries::get($pais);
        $simbolo = $c['simbolo'] ?? '$';
        return $simbolo . ' ' . number_format($monto, $decimales);
    }

    /** Símbolo de moneda del país. */
    public static function simbolo(string $pais): string {
        return Countries::get($pais)['simbolo'] ?? '$';
    }

    /** ISO 4217 de la moneda del país. */
    public static function monedaIso(string $pais): string {
        return Countries::get($pais)['currency'] ?? 'USD';
    }

    /** Zona horaria IANA del país (o la del tenant si la sobreescribió). */
    public static function timezone(string $pais, ?string $tenantTz = null): string {
        if ($tenantTz && @timezone_open($tenantTz)) {
            return $tenantTz;
        }
        return Countries::get($pais)['tz'] ?? 'America/Managua';
    }

    /**
     * Perfil de voz de Vale para el país.
     * es-CA → voseo centroamericano
     * es-US → tuteo neutro (US Latino)
     * en-US → inglés profesional
     *
     * Si el tenant tiene locale='en', fuerza en-US.
     */
    public static function perfilVoz(string $pais, string $locale = 'es'): string {
        if ($locale === 'en') return 'en-US';
        return Countries::get($pais)['perfil_voz'] ?? 'es-CA';
    }

    /**
     * Instrucción de registro para inyectar al system prompt del agente.
     * Reemplaza la regla de voseo hardcodeada en la Constitución global.
     */
    public static function instruccionRegistro(string $pais, string $locale = 'es'): string {
        $perfil = self::perfilVoz($pais, $locale);
        return match ($perfil) {
            'es-CA' => 'Usá voseo suave centroamericano (vos/te/tu). Gramática correcta, sin modismos forzados. Cálido y claro.',
            'es-US' => 'Usá tuteo neutro (tú/te/tu). Sin regionalismos ni voseo. Cálido y profesional.',
            'en-US' => 'Use warm, professional American English. Clear and concise.',
            default  => 'Usá voseo suave centroamericano.',
        };
    }

    /**
     * Hora actual en la zona horaria del tenant.
     * Útil para "Abierto ahora" y slots de Calendar.
     */
    public static function ahoraEn(string $pais, ?string $tenantTz = null): \DateTime {
        $tz = self::timezone($pais, $tenantTz);
        return new \DateTime('now', new \DateTimeZone($tz));
    }

    /**
     * Detecta el país a partir de un número de teléfono (con o sin +).
     * Retorna código ISO o 'NI' como fallback.
     */
    public static function detectarPaisDeTelefono(string $telefono): string {
        return Countries::detectFromPhone($telefono) ?? 'NI';
    }

    /**
     * Nombre legible del país en español.
     */
    public static function nombre(string $pais): string {
        return Countries::get($pais)['nombre'] ?? Countries::get($pais)['name'] ?? $pais;
    }

    /**
     * Tier de costo de WhatsApp ('ca' = bajo, 'us' = alto).
     * Útil para márgenes y pricing de planes.
     */
    public static function waTier(string $pais): string {
        return Countries::get($pais)['wa_tier'] ?? 'ca';
    }
}
