import os
import json
from functools import lru_cache
from flask import session


def _base_dir():
    return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


@lru_cache(maxsize=1)
def _load_translations():
    translations = {}
    for lang in ["es", "en"]:
        path = os.path.join(_base_dir(), "i18n", f"{lang}.json")
        try:
            with open(path, "r", encoding="utf-8") as f:
                translations[lang] = json.load(f)
        except Exception:
            translations[lang] = {}
    return translations


def _get_nested(dct, path):
    cur = dct
    for part in path.split('.'):
        if isinstance(cur, dict) and part in cur:
            cur = cur[part]
        else:
            return None
    return cur


def t(key: str, default: str | None = None, lang: str | None = None):
    """Translate a dotted key using session['lang'] with fallbacks.
    default: returned if no translation found.
    lang: override language (optional).
    """
    translations = _load_translations()
    lng = lang or session.get('lang', 'es')
    for candidate in [lng, 'es', 'en']:
        val = _get_nested(translations.get(candidate, {}), key)
        if val is not None:
            return val
    return default or key

