"""Generation de la carte hreflang (balises `alternate` multilingues + x-default).

Pour chaque page (accueil + une par projet) : une alternate par langue du site
plus un `x-default` pointant vers la langue par defaut. La `canonical` de chaque
page est l'URL de la langue par defaut. URLs construites depuis `site.base_url`
et `site.path_prefix` — deterministe, aucune horloge.
"""

from __future__ import annotations

from . import deps


def _build_url(base: str, prefix: str, rel: str) -> str:
    """base + prefixe de langue + chemin relatif, slashs normalises.

    rel == "" -> page d'accueil (slash final conserve)."""
    pre = prefix.strip("/")
    segs = [s for s in (pre, rel.strip("/")) if s]
    path = "/".join(segs)
    if not rel:
        return base + "/" + (path + "/" if path else "")
    return base + "/" + path


def _page(base: str, prefixes: dict, langs: list, default: str, xdef: str,
          name: str, rel: str) -> dict:
    alternates = [{"hreflang": lang, "href": _build_url(base, prefixes[lang], rel)}
                  for lang in langs]
    alternates.append({"hreflang": "x-default",
                       "href": _build_url(base, prefixes[xdef], rel)})
    return {
        "page": name,
        "canonical": _build_url(base, prefixes[default], rel),
        "alternates": alternates,
    }


def generate(spec: dict, master: dict) -> dict:
    site = spec["site"]
    base = site["base_url"].rstrip("/")
    prefixes = site["path_prefix"]
    langs = site["langs"]
    default = site["default_lang"]
    xdef = site["x_default_lang"]

    pages = [_page(base, prefixes, langs, default, xdef, "home", "")]
    for p in master["projets"]:
        slug = deps.slugify(p["nom"])
        pages.append(_page(base, prefixes, langs, default, xdef,
                           p["code"], f"projets/{slug}"))

    return {"base_url": base, "x_default_lang": xdef, "pages": pages}
