"""Libellés FR/EN/ES du dossier financier bancable (fixes · sourcés CLAUDE.md).

Les trois langues du dossier bancable sont IMPOSÉES par le Portail Bancables 4Big
(`PORTAIL_BANCABLES_4BIG.md` : « Boutons langues FR 🇨🇦 · EN 🇺🇸 · ES 🇩🇴 »).
Chaque colonne de ce dictionnaire est une traduction FIXE de libellés de gabarit :
aucun libellé ne provient du brief, donc aucune donnée projet n'est traduite « à
la volée » (ce qui serait une invention #6). Les seules chaînes libres du dossier
(positionnement commercial) proviennent du brief, langue par langue, et restent en
placeholder si absentes — jamais traduites automatiquement.
"""

from __future__ import annotations

# Ordre canonique des langues (drapeaux = ceux du Portail Bancables 4Big).
LANGS = ["fr", "en", "es"]
LANG_FLAG = {"fr": "🇨🇦", "en": "🇺🇸", "es": "🇩🇴"}
LANG_NOM = {"fr": "Français", "en": "English", "es": "Español"}

LABELS: dict[str, dict[str, str]] = {
    "fr": {
        "doc_title": "Dossier financier bancable",
        "confidential": (
            "⚠️ CONFIDENTIEL — diffusion restreinte. Document destiné aux "
            "personnes ressource (banquiers, notaires, investisseurs, CPA/UAF, "
            "ministères). Ne pas indexer, ne pas rediffuser."
        ),
        "synthetic": (
            "⚠️ FIXTURE SYNTHÉTIQUE — données fictives de test. NE JAMAIS "
            "publier ni transmettre (CLAUDE.md #6)."
        ),
        "sec_positioning": "1. Positionnement",
        "sec_sourced": "2. Données financières sourcées",
        "sec_typologies": "3. Grille tarifaire par typologie",
        "sec_derived": "4. Agrégats & emplois — calculs traçables",
        "sec_canonical": "5. Paramètres canoniques OTO",
        "lbl_cout_construction": "Coût de construction total",
        "lbl_revenu_brut": "Revenu brut de vente projeté",
        "lbl_marge": "Marge projetée",
        "lbl_taux": "Taux de conversion USD↔DOP",
        "lbl_regime_fiscal": "Régime fiscal",
        "lbl_total_unites": "Total d'unités (Σ quantités typologies)",
        "lbl_valeur_catalogue_usd": "Valeur catalogue du programme (USD)",
        "lbl_valeur_catalogue_dop": "Valeur catalogue du programme (DOP)",
        "lbl_point_equilibre_unites": "Point d'équilibre pré-vente (en unités)",
        "lbl_edition": "Frais d'édition documentaire",
        "lbl_marketing": "Budget marketing",
        "lbl_point_equilibre_pct": "Point d'équilibre pré-vente",
        "lbl_devises": "Devises",
        "lbl_paiement": "Moyen de paiement",
        "lbl_format_doc": "Format des documents",
        "th_typologie": "Typologie",
        "th_quantite": "Nb unités",
        "th_prix_usd": "Prix « à partir de » (USD)",
        "th_prix_dop": "Prix (DOP)",
        "th_soustotal": "Sous-total catalogue (USD)",
        "note_calcule": "calculé",
        "note_fixe": "fixe",
        "note_missing": "Champs 🔴 manquants (non inventés · #6)",
        "note_taux_source": "source",
        "note_generated": "Projet",
        "word_units": "unités",
        "word_rounded": "arrondi supérieur",
        "word_base": "base à confirmer (non documentée · #9)",
        "word_none": "à confirmer (faisabilité en cours)",
    },
    "en": {
        "doc_title": "Bankable financial dossier",
        "confidential": (
            "⚠️ CONFIDENTIAL — restricted distribution. Intended for resource "
            "persons (bankers, notaries, investors, CPA/UAF, ministries). Do not "
            "index, do not redistribute."
        ),
        "synthetic": (
            "⚠️ SYNTHETIC FIXTURE — fictional test data. NEVER publish or share "
            "(CLAUDE.md #6)."
        ),
        "sec_positioning": "1. Positioning",
        "sec_sourced": "2. Sourced financial data",
        "sec_typologies": "3. Price grid by unit type",
        "sec_derived": "4. Aggregates & uses of funds — traceable computations",
        "sec_canonical": "5. OTO canonical parameters",
        "lbl_cout_construction": "Total construction cost",
        "lbl_revenu_brut": "Projected gross sales revenue",
        "lbl_marge": "Projected margin",
        "lbl_taux": "USD↔DOP conversion rate",
        "lbl_regime_fiscal": "Tax regime",
        "lbl_total_unites": "Total units (Σ unit-type quantities)",
        "lbl_valeur_catalogue_usd": "Programme catalogue value (USD)",
        "lbl_valeur_catalogue_dop": "Programme catalogue value (DOP)",
        "lbl_point_equilibre_unites": "Pre-sale break-even (in units)",
        "lbl_edition": "Document edition fee",
        "lbl_marketing": "Marketing budget",
        "lbl_point_equilibre_pct": "Pre-sale break-even",
        "lbl_devises": "Currencies",
        "lbl_paiement": "Payment method",
        "lbl_format_doc": "Document format",
        "th_typologie": "Unit type",
        "th_quantite": "Units",
        "th_prix_usd": "Price “from” (USD)",
        "th_prix_dop": "Price (DOP)",
        "th_soustotal": "Catalogue subtotal (USD)",
        "note_calcule": "computed",
        "note_fixe": "fixed",
        "note_missing": "Missing 🔴 fields (never invented · #6)",
        "note_taux_source": "source",
        "note_generated": "Project",
        "word_units": "units",
        "word_rounded": "rounded up",
        "word_base": "base to be confirmed (undocumented · #9)",
        "word_none": "to be confirmed (feasibility in progress)",
    },
    "es": {
        "doc_title": "Expediente financiero bancable",
        "confidential": (
            "⚠️ CONFIDENCIAL — distribución restringida. Destinado a personas "
            "recurso (banqueros, notarios, inversionistas, CPA/UAF, ministerios). "
            "No indexar, no redistribuir."
        ),
        "synthetic": (
            "⚠️ DATOS SINTÉTICOS — datos ficticios de prueba. NUNCA publicar ni "
            "compartir (CLAUDE.md #6)."
        ),
        "sec_positioning": "1. Posicionamiento",
        "sec_sourced": "2. Datos financieros con fuente",
        "sec_typologies": "3. Tabla de precios por tipología",
        "sec_derived": "4. Agregados y usos — cálculos trazables",
        "sec_canonical": "5. Parámetros canónicos OTO",
        "lbl_cout_construction": "Costo total de construcción",
        "lbl_revenu_brut": "Ingreso bruto de ventas proyectado",
        "lbl_marge": "Margen proyectado",
        "lbl_taux": "Tasa de conversión USD↔DOP",
        "lbl_regime_fiscal": "Régimen fiscal",
        "lbl_total_unites": "Total de unidades (Σ cantidades por tipología)",
        "lbl_valeur_catalogue_usd": "Valor de catálogo del programa (USD)",
        "lbl_valeur_catalogue_dop": "Valor de catálogo del programa (DOP)",
        "lbl_point_equilibre_unites": "Punto de equilibrio de preventa (en unidades)",
        "lbl_edition": "Cargo de edición documental",
        "lbl_marketing": "Presupuesto de marketing",
        "lbl_point_equilibre_pct": "Punto de equilibrio de preventa",
        "lbl_devises": "Monedas",
        "lbl_paiement": "Medio de pago",
        "lbl_format_doc": "Formato de documentos",
        "th_typologie": "Tipología",
        "th_quantite": "Unidades",
        "th_prix_usd": "Precio «desde» (USD)",
        "th_prix_dop": "Precio (DOP)",
        "th_soustotal": "Subtotal catálogo (USD)",
        "note_calcule": "calculado",
        "note_fixe": "fijo",
        "note_missing": "Campos 🔴 faltantes (nunca inventados · #6)",
        "note_taux_source": "fuente",
        "note_generated": "Proyecto",
        "word_units": "unidades",
        "word_rounded": "redondeo superior",
        "word_base": "base por confirmar (no documentada · #9)",
        "word_none": "por confirmar (factibilidad en curso)",
    },
}


def t(lang: str, key: str) -> str:
    """Libellé traduit. Lève KeyError si la clé n'existe pas (bug de gabarit)."""
    return LABELS[lang][key]
