"""
El catálogo de textos, leído desde el servidor.

Existe por un solo motivo, y conviene que siga siendo uno: **el CSV de cobertura
se arma acá**. Lleva una columna legible —el estado que informó Google, dicho en
palabras— y esa columna tiene que salir en el idioma de la cuenta. El resto del
producto compone sus frases en el cliente, que es donde vive el catálogo; un
archivo que se genera del lado del servidor, y a veces en un worker sin nadie
mirando, no tiene ese cliente delante.

No es una segunda fuente de verdad: lee **los mismos** `frontend/locales/*.json`
que instala la pantalla. Escribir acá una traducción propia dejaría dos
redacciones del mismo estado, y la del archivo sería justamente la que nadie
revisa.

Se lee una vez por idioma y queda en memoria. Los catálogos son parte del código
—cambian con un despliegue, no en caliente— así que releerlos en cada fila del
CSV serían miles de aperturas de archivo para obtener siempre lo mismo.
"""

import json
from functools import lru_cache
from pathlib import Path

from django.conf import settings

from apps.accounts.models import Language
from apps.core.tables import slug

#: Dónde viven los catálogos. Es la carpeta que consume el cliente, no una copia.
LOCALES_DIR = Path(settings.BASE_DIR) / 'frontend' / 'locales'


def text(key: str, language: str = Language.EN) -> str:
    """
    El texto de una clave en el idioma pedido.

    Cae al inglés ante una clave que ese idioma todavía no tiene, y devuelve la
    clave cruda si no está en ninguno. Es lo contrario de lo que hace `t()` en el
    cliente, que falla fuerte, y a propósito: allá una clave faltante se ve en la
    pantalla y se corrige; acá reventaría una exportación de cien mil filas por
    una palabra. El test que compara los catálogos entre sí es lo que evita que
    esa tolerancia se vuelva costumbre.
    """
    entries = catalog(language)
    if key in entries:
        return entries[key]

    return catalog(Language.EN).get(key, key)


@lru_cache(maxsize=len(Language.values))
def catalog(language: str) -> dict[str, str]:
    """El catálogo de un idioma, leído del disco una sola vez."""
    path = LOCALES_DIR / f'{slug(language)}.json'
    if not path.exists():
        return {}
    return json.loads(path.read_text(encoding='utf-8'))
