{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Arbre généalogique — structure par rubriques",
  "description": "Chaque rubrique doit contenir des identifiants respectant son préfixe. VS Code affiche cette description au survol et souligne toute incohérence.",
  "type": "object",
  "definitions": {
    "personne": {
      "type": "object",
      "required": ["id", "prenom"],
      "properties": {
        "id": { "type": "string", "description": "Identifiant unique — voir le pattern imposé par chaque rubrique." },
        "prenom": { "type": "string", "description": "Prénom usuel." },
        "deuxieme_prenom": { "type": "string", "description": "Second prénom (facultatif)." },
        "nom": { "type": "string", "description": "Nom de famille porté." },
        "nom_naissance": { "type": "string", "description": "Nom de naissance si différent." },
        "naissance": { "type": "string", "description": "Date JJ/MM/AAAA (facultatif)." },
        "lieu_naissance": { "type": "string" },
        "deces": { "type": "string", "description": "Date ou année de décès. Laisser vide si vivant(e)." },
        "lieu_deces": { "type": "string" },
        "profession": { "type": "string" },
        "role": { "type": "string", "enum": ["vous", "épouse"], "description": "Uniquement pour vous situer dans l'arbre." },
        "parents": { "type": "array", "items": { "type": "string" }, "description": "Identifiants des parents (0 à 2)." },
        "conjoint": { "type": "string" },
        "photo": { "type": "string", "description": "Chemin relatif, ex. photos/nom.jpg." },
        "note": { "type": "string", "description": "Texte libre, les liens https:// deviennent cliquables." },
        "rang": { "description": "Force le niveau de génération (nombre). Cas particuliers uniquement." },
        "rang_entre": {
          "type": "array",
          "description": "[id_du_dessus, id_du_dessous, position?] — position entre 0 (juste sous le dessus) et 1 (juste au-dessus du dessous), ou \"haut\"/\"milieu\"/\"bas\". 0.5 par défaut.",
          "minItems": 2, "maxItems": 3
        },
        "ordre": { "description": "Force le rang gauche-droite au sein de la génération (nombre)." },
        "secondaire": { "type": "boolean", "description": "true = carte réduite, indépendamment du rang." }
      }
    }
  },
  "properties": {
    "arriere_grands_parents": {
      "type": "array",
      "description": "Génération la plus ancienne présente. Identifiants : agp1, agp2, aagp1... (un \"a\" de plus par génération remontée).",
      "items": {
        "allOf": [{ "$ref": "#/definitions/personne" }],
        "properties": { "id": { "type": "string", "pattern": "^a+gp[0-9]*$" } }
      }
    },
    "grands_parents": {
      "type": "array",
      "description": "Génération des grands-parents. Identifiants : gp1, gp2, gp3...",
      "items": {
        "allOf": [{ "$ref": "#/definitions/personne" }],
        "properties": { "id": { "type": "string", "pattern": "^gp[0-9]+$" } }
      }
    },
    "parents": {
      "type": "array",
      "description": "Génération des parents (vos parents, oncles/tantes...). Identifiants : p1, p2, p3...",
      "items": {
        "allOf": [{ "$ref": "#/definitions/personne" }],
        "properties": { "id": { "type": "string", "pattern": "^p[0-9]+$" } }
      }
    },
    "vous_et_epouse": {
      "type": "array",
      "description": "Exactement vous et votre épouse/époux. Identifiants fixes : vous, epouse.",
      "items": {
        "allOf": [{ "$ref": "#/definitions/personne" }],
        "properties": { "id": { "type": "string", "pattern": "^(vous|epouse)$" } }
      },
      "maxItems": 2
    },
    "enfants_et_gendres": {
      "type": "array",
      "description": "Vos enfants et leurs conjoints (et ceux de la même génération : neveux/nièces...). Identifiants : e1, e2... pour le sang, g1, g2... pour les conjoints.",
      "items": {
        "allOf": [{ "$ref": "#/definitions/personne" }],
        "properties": { "id": { "type": "string", "pattern": "^[eg][0-9]+$" } }
      }
    },
    "petits_enfants": {
      "type": "array",
      "description": "Génération des petits-enfants. Identifiants : pe1, pe2, ape1... (arrière-petits-enfants).",
      "items": {
        "allOf": [{ "$ref": "#/definitions/personne" }],
        "properties": { "id": { "type": "string", "pattern": "^a?pe[0-9]*$" } }
      }
    },
    "autres": {
      "type": "array",
      "description": "Personnes nommées ne suivant pas la convention numérotée (ex. un beau-frère \"Guy\"). Placez-les ici plutôt que d'inventer un préfixe — leur génération réelle est de toute façon calculée depuis leurs liens parents/conjoint, pas depuis leur position dans le fichier.",
      "items": { "$ref": "#/definitions/personne" }
    }
  }
}
