import os
import random

import yaml

from .config import settings

_cache = {"mtime": 0.0, "data": {}}


class _Safe(dict):
    def __missing__(self, key):
        return ""


def load() -> dict:
    try:
        mtime = os.path.getmtime(settings.templates_path)
        if mtime != _cache["mtime"]:
            with open(settings.templates_path, encoding="utf-8") as fh:
                _cache["data"] = yaml.safe_load(fh) or {}
            _cache["mtime"] = mtime
    except OSError as exc:
        print(f"[templates] cannot read {settings.templates_path}: {exc}", flush=True)
    return _cache["data"]


def exists(event: str) -> bool:
    return event in load()


def render(event: str, locale: str, variables: dict) -> str | None:
    entry = load().get(event)
    if not entry:
        return None
    lang = (locale or settings.default_locale).split("_")[0].split("-")[0].lower()
    variants = entry.get(lang) or entry.get(settings.default_locale) or entry.get("en")
    if not variants:
        return None
    if isinstance(variants, str):
        variants = [variants]
    data = _Safe({"site": settings.site_name})
    data.update({k: "" if v is None else str(v) for k, v in (variables or {}).items()})
    return random.choice(variants).format_map(data).strip()


def cloud_template(event: str) -> tuple[str | None, list]:
    entry = load().get(event) or {}
    return entry.get("cloud_template"), entry.get("cloud_params") or []
