"""Réutilisation des briques déjà livrées (workflow #5 · zéro duplication).

L'audit 5D ne redéfinit rien qui existe ailleurs dans le mandat. On importe —
jamais on ne duplique — :
  - `validate`        : le validateur JSON-Schema maison du Publiciste (draft-07,
                        sous-ensemble) → valider le rapport SANS pip, le gate CI
                        Gitea Actions tournant sans réseau (CLAUDE.md #2).
  - `is_filled`       : la notion partagée de « champ réellement rempli » (un
                        placeholder ou un `null` n'est PAS rempli) — au cœur de
                        l'anti-invention #6.
  - `RoleResolver`    : la table `role_id → nom de rôle Frappe` du module CRM,
                        seule autorité de nommage des rôles (contrat RBAC).
  - `roles_targeting` : la lecture des rôles RBAC qui visent un DocType, déjà
                        écrite pour le générateur CONFOTUR.

Import par `sys.path` (idiome des modules voisins) — une seule source de vérité.
"""

from __future__ import annotations

import os
import sys

_HERE = os.path.dirname(os.path.abspath(__file__))
# qa/audit_5d/qalib → 05_deliverables_mvp
_DELIVERABLES = os.path.normpath(os.path.join(_HERE, "..", "..", ".."))

_GEN = os.path.join(_DELIVERABLES, "faisabilite", "generator")
_PUB = os.path.join(_DELIVERABLES, "publiciste")
_WF = os.path.join(_DELIVERABLES, "crm", "workflow_vente")
_CONF = os.path.join(_DELIVERABLES, "legal", "confotur")

for _p in (_GEN, _PUB, _WF, _CONF):
    if _p not in sys.path:
        sys.path.insert(0, _p)

from genlib import model  # type: ignore  # noqa: E402
from lib import validator  # type: ignore  # noqa: E402
from wflib.rbac import RoleResolver  # type: ignore  # noqa: E402
from cflib import rbac_scan  # type: ignore  # noqa: E402

is_filled = model.is_filled
validate = validator.validate
roles_targeting = rbac_scan.roles_targeting
load_contract = rbac_scan.load_contract

__all__ = [
    "is_filled", "validate", "RoleResolver", "roles_targeting", "load_contract",
]
