"""Dépendances partagées du générateur de config app mobile · réutilisation stricte (#5).

On NE réimplémente rien qui existe déjà dans le mandat :
  - `validator` (validateur JSON-Schema draft-07 maison) et `branding` (tokens de
    marque #4 + devises #10) sont importés du livrable Publiciste, source unique.
  - la résolution RBAC → rôles par portail est importée du builder des Workspaces
    (`frontend/portails/wslib/builder.py`) : l'app mobile s'ancre sur EXACTEMENT la
    même surface RBAC que les Workspaces et le Chat OTOIA — aucune logique dupliquée.

Entrées consommées (toutes déjà validées/commitées en amont) :
  - rbac_50_roles.json                     (contrat RBAC · portails_business + rôles)
  - frontend/portails/portails_spec.json   (labels + icônes des 5 portails · mise en page)
  - seo/seo_spec.json                      (langues trilingues FR/EN/ES · source unique)
"""

from __future__ import annotations

import json
import os
import sys

_HERE = os.path.dirname(os.path.abspath(__file__))
_MOBILE = os.path.dirname(_HERE)                                 # mobile/app_config/
_MOBILE_ROOT = os.path.normpath(os.path.join(_MOBILE, ".."))     # mobile/
_DELIVERABLES = os.path.normpath(os.path.join(_MOBILE_ROOT, "..")) # 05_deliverables_mvp/
_PUBLICISTE = os.path.join(_DELIVERABLES, "publiciste")
_PORTAILS = os.path.join(_DELIVERABLES, "frontend", "portails")
_RBAC_DIR = os.path.join(_DELIVERABLES, "rbac")
_SEO = os.path.join(_DELIVERABLES, "seo")

# Réutilisation : validateur + branding Publiciste, builder des Workspaces.
for _p in (_PUBLICISTE, _PORTAILS):
    if _p not in sys.path:
        sys.path.insert(0, _p)

from lib import branding  # type: ignore  # noqa: E402
from lib import validator as maison  # type: ignore  # noqa: E402
from wslib import builder as portails_builder  # type: ignore  # noqa: E402

# Chemins des contrats/entrées.
SPEC_PATH = os.path.join(_MOBILE, "mobile_spec.json")
SCHEMA_PATH = os.path.join(_MOBILE, "mobile.schema.json")
CONTRACT_PATH = os.path.join(_RBAC_DIR, "rbac_50_roles.json")
PORTAILS_SPEC_PATH = os.path.join(_PORTAILS, "portails_spec.json")
SEO_SPEC_PATH = os.path.join(_SEO, "seo_spec.json")


def load_json(path: str) -> object:
    with open(path, encoding="utf-8") as fh:
        return json.load(fh)


def load_spec() -> dict:
    return load_json(SPEC_PATH)


def load_contract() -> dict:
    return load_json(CONTRACT_PATH)


def load_portails_spec() -> dict:
    return load_json(PORTAILS_SPEC_PATH)


def load_langs() -> tuple[list[str], str]:
    """Langues + langue par défaut DÉRIVÉES du seo_spec (source unique · #5)."""
    seo = load_json(SEO_SPEC_PATH)
    site = seo["site"]
    return list(site["langs"]), site["default_lang"]


def validate(instance, schema: dict) -> list[str]:
    return list(maison.validate(instance, schema))


# Réexport : surface RBAC des rôles par portail = celle des Workspaces (source unique).
roles_by_portail = portails_builder.roles_by_portail

__all__ = [
    "branding",
    "load_json",
    "load_spec",
    "load_contract",
    "load_portails_spec",
    "load_langs",
    "validate",
    "roles_by_portail",
    "SPEC_PATH",
    "SCHEMA_PATH",
    "CONTRACT_PATH",
    "PORTAILS_SPEC_PATH",
    "SEO_SPEC_PATH",
]
