# -*- coding: utf-8 -*-
"""
Created on Thu Jul 31 15:05:10 2025

@author: Stéphane Pasquet
"""

import json
import unicodedata
from graphviz import Digraph

# Charger les données JSON
with open("arbre_genealogique.json", "r", encoding="utf-8") as f:
    data = json.load(f)

# Fonction pour créer un identifiant simplifié
def slugify(name):
    name = unicodedata.normalize('NFKD', name).encode('ascii', 'ignore').decode('utf-8')
    return name.lower().replace(" ", "_").replace("née", "nee")

# Création d’un mapping entre les vrais noms et les identifiants simplifiés
id_map = {name: slugify(name) for name in data}

# Initialisation du graphe
dot = Digraph(comment="Arbre Généalogique", format="png")
dot.attr(rankdir="TB")

# Ajout des noeuds (personnes)
for name, infos in data.items():
    label = f"{name}\n({infos['Naissance']})" if infos["Naissance"] else name
    dot.node(id_map[name], label=label, shape="box")

# Ajout des liens parent → enfant
for child, infos in data.items():
    for parent in infos.get("Parents", []):
        if parent in data:
            dot.edge(id_map[parent], id_map[child])

# Ajout des unions (mariages) comme points de jonction
married_set = set()
for person, infos in data.items():
    for spouse in infos.get("Mariage", []):
        if spouse in data:
            key = tuple(sorted([person, spouse]))
            if key not in married_set:
                married_set.add(key)
                mid = f"union_{id_map[key[0]]}_{id_map[key[1]]}"
                dot.node(mid, label="", shape="point", width="0.01")
                dot.edge(id_map[key[0]], mid, dir="none")
                dot.edge(id_map[key[1]], mid, dir="none")

# Générer le fichier
dot.render("arbre_genealogique", view=True)

