"""
source_02.py — s02 · CHAKRAS DANS LA TÊTE — 3 VUES (SUPÉRIEURE/DROITE)
Série SOURCE ANNEXE FIABLE · généré depuis l'analyse gravée (Fable, 12 juil 2026).
Règle : zéro invention — tout champ provient de la planche ou d'un recoupement daté.
"""
from dataclasses import dataclass, field, asdict
import json

# ── SOCLE COMMUN (passe U6a — imbrication, GO Ben 13 juil 2026, 23h21) ────
# socle_corpus.py = clé de voûte du paquet corpus/ (types partagés · registre
# · GRAPHE des jonctions · VERDICTS D1-D6). Loi 2 du contrat : les jonctions
# CANONIQUES entre pièces (dNN/sNN) vivent UNE SEULE FOIS dans GRAPHE — la
# liste locale `jonctions` (cible/nature) reste une NOTE DE LECTURE de la
# planche (elle seule garde les liens hors-graphe, ex. talks datés).
# Loi 3 : aucun verdict recopié — le verdict D2 (Hamsa SOUS l'Agnya, version
# s02 retenue) fait foi dans VERDICTS["D2"], le texte local n'est qu'un écho.
ID_CORPUS = "s02"
try:
    from socle_corpus import GRAPHE, VERDICTS, SOURCES as REGISTRE_SOURCES
    JONCTIONS_SOCLE = [j for j in GRAPHE if ID_CORPUS in (j.a, j.b)]
    MODE_ILOT = False
except ImportError:  # exécution isolée : le module reste lisible en îlot
    GRAPHE, VERDICTS, REGISTRE_SOURCES = [], {}, {}
    JONCTIONS_SOCLE, MODE_ILOT = [], True

@dataclass
class Inscription:
    texte: str
    zone: str
    statut: str = "\U0001f7e2"

@dataclass
class Jonction:
    cible: str
    nature: str

@dataclass
class Source:
    sid: str = "s02"
    titre: str = "CHAKRAS DANS LA TÊTE — TROIS VUES (S/D)"
    type_source: str = "infographie moderne interactive (capture d'écran)"
    origine: str = "site Sahaja Yoga probablement italien (légende 'S/D > Sinistro/Destro')"
    auteur_shri_mataji: bool = False
    fiabilite: str = "\U0001f7e2 iconographie SY standard cohérente avec d01 · \U0001f7e1 capture indirecte, site source exact non identifié"

    inscriptions: list = field(default_factory=lambda: [
        Inscription("SAHASRARA", "légende — pastille multicolore · sommet du crâne"),
        Inscription("Ekadesha Rudra", "légende — magenta · bandeau de 11 pastilles sur le front"),
        Inscription("Agnya", "légende — violet · centre du front"),
        Inscription("Hamsa", "légende — bleu clair · placé SOUS l'Agnya sur cette planche"),
        Inscription("Vishuddhi", "légende — bleu foncé"),
        Inscription("Anahat", "légende — rouge-orangé"),
        Inscription("Nabhi", "légende — vert"),
        Inscription("Swadisthan", "légende — jaune"),
        Inscription("Mooladhara", "légende — rose"),
        Inscription("S/D > Sinistro/Destro", "légende — gauche/droite en italien"),
    ])

    caracteristiques: list = field(default_factory=lambda: [
        "3 vues tête fil de fer 3D : face · face inclinée · profil",
        "aspects gauche (S) / droit (D) des chakras du corps projetés sur le crâne",
        "Ekadesha Rudra = bandeau de 11 pastilles magenta sur le front",
        "usage : carte de DIAGNOSTIC des chakras sur le crâne",
        "nomenclature SY usuelle (Nabhi, Mooladhara, Anahat) — contraste avec s01",
    ])

    jonctions: list = field(default_factory=lambda: [
        Jonction("d01", "mêmes positions crâniennes — recoupement direct du profil de tête"),
        Jonction("d04", "complète la carte-mère corps entier par la projection tête"),
        Jonction("s08", "DIVERGENCE Hamsa RÉSOLUE (décision Ben, 12 juil 2026) : position retenue = SOUS l'Agnya (version s02) — verbatim s08 conservé en pièce minoritaire"),
    ])

    en_attente: list = field(default_factory=lambda: [
        "\U0001f7e1 site source exact non identifié (interface italienne)",
        "✅ RÉSOLU (décision Ben, 12 juil 2026) : Hamsa SOUS l'Agnya — version s02 retenue",
        "✅ CONFRONTÉE à d01 en passe U6a (13 juil) : CONCORDANTE — Sahasrara au sommet des deux côtés · latéralité S/D ↔ préfixes R./L. manuscrits de d01 · Hamsa SOUS l'Agnya des deux côtés (d01 : Hamsa plus bas que R. Agnya 🟡 sur le versant avant = écho manuscrit du verdict D2) · s02 ajoute Ekadesha Rudra + Mooladhara, absents de d01 (compléments, zéro contradiction)",
    ])

    def rapport(self) -> str:
        etat_socle = ("îlot (socle_corpus non chargé)" if MODE_ILOT
                      else f"imbriqué — {len(JONCTIONS_SOCLE)} jonction(s) canoniques au GRAPHE")
        return "\n".join([
            f"[{self.sid}] {self.titre}",
            f"  origine : {self.origine}",
            f"  de la main de Shri Mataji : {self.auteur_shri_mataji}",
            f"  fiabilité : {self.fiabilite}",
            f"  inscriptions : {len(self.inscriptions)} · jonctions : {len(self.jonctions)}",
            f"  SOCLE : {etat_socle}",
        ])

    def to_json(self) -> str:
        data = asdict(self)
        data["id_corpus"] = ID_CORPUS
        data["jonctions_canoniques"] = [asdict(j) for j in JONCTIONS_SOCLE]
        data["mode_ilot"] = MODE_ILOT
        return json.dumps(data, ensure_ascii=False, indent=2)

if __name__ == "__main__":
    print(Source().rapport())