"""
source_09.py — s09 · MUSICOTHÉRAPIE — RAGAS & INSTRUMENTS PAR CHAKRA
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 U6b — imbrication, GO Ben 13 juil 2026, 23h29) ────
# 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 : ici le talk daté
# 1983-02-02 Delhi, source primaire de la citation, pas une pièce dNN/sNN).
# Loi 3 : aucun verdict recopié — pointer VERDICTS[id].
ID_CORPUS = "s09"
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 = "s09"
    titre: str = "MUSICOTHÉRAPIE — RAGAS & INSTRUMENTS PAR CHAKRA ET CANAL"
    type_source: str = "tableau de musicothérapie SY — ragas/instruments par chakra et canal (LEFT/CENTER/RIGHT)"
    origine: str = "compilation dévotionnelle francophone ('et' français dans le tableau) · photo Shri Mataji à l'harmonium en en-tête"
    auteur_shri_mataji: bool = False
    fiabilite: str = "\U0001f7e2 citation de Shri Mataji datée et sourcée (Vishuddhi, Delhi, 2 fév. 1983) · \U0001f7e1 tableau = compilation non officielle, orthographes fluctuantes (Bishmillah, Ramnat)"

    inscriptions: list = field(default_factory=lambda: [
        Inscription("…Music … has come out of God's love for us… in India, is based on AUM, and is "
                    "scientific…", "citation en-tête — verbatim"),
        Inscription('"Vishuddhi Chakra" Delhi, India, 2nd February 1983', "source de la citation"),
        Inscription("LEFT · CENTER · RIGHT", "colonnes du tableau — les 3 canaux"),
    ])

    table_ragas: dict = field(default_factory=lambda: {
        "Mooladhara": "Raga Shyam Kalyan — shennai (Ustad Bishmillah Khan, D)",
        "Swadhistan": "G: Raga Gurjari Todi, sarangi · C/D: Raga Yaman, sarangi, Pandit Ram Narayan",
        "Nabhi": "G: Raga Bhatyaar, violon, Kala Ramnat · C/D: Raga Abhogi, santoor, Pandit Shiv Kumar Sharma",
        "Void": "Raga Malkhauns, sitar (Vilayat Khan, D)",
        "Anahata": "G: Raga Bhairav, vocal, Gabriel Ion · C/D: Raga Durga, vocal, Rajan Sajan Mishra",
        "Vishuddhi": "Raga Jaijaiwanti — flûte, Pt. Hariprasad Chaurasia (D)",
        "Agnya": "G: Raga Bageshri, mohan vina, Pandit Vishwa Mohan Bhat · C/D: Raga Bhoopali, sarangi et violon, Ram Narayan et Krishnamurti",
        "Sahasrara": "G: Raga Bhairavi, sitar, Ustad Vilayat Khan · C/D: Raga Darbari, sitar",
        "Nadis": "G: Raga Miyan ki Todi, sarod, Amjad Ali Khan · C: Raga Jog, sitar, Shahid Parvez · D: Raga Maru Bihag, sarangi, Sultan Khan et Kamal Sabri",
    })

    caracteristiques: list = field(default_factory=lambda: [
        "structure complète du système : 7 chakras + Void + Nadis × 3 canaux",
        "application : musique classique indienne comme thérapie par centre",
        "citation datée VÉRIFIABLE (conférence Vishuddhi, Delhi, 1983-02-02)",
    ])

    jonctions: list = field(default_factory=lambda: [
        Jonction("d04", "carte-mère — mêmes étages (7 chakras + Void)"),
        Jonction("d08", "IDA & PINGALA — même logique gauche/centre/droite"),
        Jonction("s18", "guide SY France — autre table de correspondances par chakra (jour/planète/pierre)"),
        Jonction("talk 1983-02-02 Delhi", "source primaire de la citation — à vérifier sur amruta.org"),
    ])

    en_attente: list = field(default_factory=lambda: [
        "\U0001f7e1 auteur de la compilation non identifié",
        "\U0001f7e1 orthographes des musiciens à normaliser (Bishmillah→Bismillah, Ramnat→Ramnath)",
    ])

    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"  lignes ragas : {len(self.table_ragas)} · 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())