"""
Script d'initialisation de la banque de scénarios tactiques pour Versailles Airsoft.
Ce script insère ou met à jour les scénarios officiels d'après le document de référence.

Phase 2 - Étape 3 : Intégration du scénario 1 « Guerre de Gangs » uniquement.
"""

from database import SessionLocal, init_db
from models import Scenario


SCENARIOS_DATA = [
    {
        "slug": "guerre-de-gangs",
        "title": "Guerre de Gangs",
        "pitch": "Un cartel lance un raid coordonné sur le territoire d'une faction adverse pour piller ses stocks de cash et de stupéfiants.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Équipe Alpha",
                    "role": "Défense",
                    "badge_color": "blue",
                    "description": "Divisée au départ en 2 groupes distincts :",
                    "groups": [
                        {
                            "name": "Camp Delta",
                            "role": "Stock de drogue (sachets factices)",
                            "icon": "fa-solid fa-capsules"
                        },
                        {
                            "name": "Camp Mike",
                            "role": "Stock d'argent (liasses de faux billets)",
                            "icon": "fa-solid fa-money-bill-wave"
                        }
                    ]
                },
                {
                    "name": "Équipe Bravo",
                    "role": "Attaque",
                    "badge_color": "red",
                    "description": "Force d'assaut :",
                    "groups": [
                        {
                            "name": "Camp Echo",
                            "role": "Base de départ & sécurisation du butin",
                            "icon": "fa-solid fa-crosshairs"
                        }
                    ]
                }
            ]
        },
        "objectifs_victory": {
            "duration": "au choix.",
            "victory_condition": "À la fin du temps imparti, l'équipe qui comptabilise le plus grand nombre total de somme de drogue et argent dans sa ou ses bases remporte la partie.",
            "camp_objectives": [
                {
                    "team": "Bravo",
                    "label": "Attaque",
                    "text": "Réussir à infiltrer les Delta et Mike, voler les colis et les sécuriser dans Echo."
                },
                {
                    "team": "Alpha",
                    "label": "Défense",
                    "text": "Protéger ses deux stocks. Si des colis sont volés, l’équipe peut attaquer Echo pour les récupérer."
                }
            ]
        },
        "specific_rules": {
            "capacity": "1 seul colis à la fois par joueur (une seule liasse OU un seul sachet).",
            "rules_list": [
                {
                    "num": 1,
                    "title": "Transport visible",
                    "text": "Le colis doit être tenu en main et être clairement visible."
                },
                {
                    "num": 2,
                    "title": "Joueur touché en transportant un colis",
                    "text": "Le joueur dépose immédiatement le colis au sol à l'endroit exact de sa touche."
                }
            ],
            "ground_rule": "Tout joueur vivant peut ramasser un colis tombé au sol.",
            "variants": [
                {
                    "name": "Les traitres",
                    "description": "Variante tactique :",
                    "points": [
                        "Traître dans Alpha : Fait passer discrètement des colis de ses camps aux membres de Bravo.",
                        "Traître dans Bravo : Gêne son équipe, redonne à Alpha les colis volés par Bravo.",
                        "Règle d'engagement des traîtres : Pas de tirs alliés volontaires (équipe de départ)."
                    ]
                }
            ]
        },
        "respawn_rules": {
            "type": "Respawns illimités.",
            "locations": [
                {
                    "team": "Bravo",
                    "detail": "Respawn en Delta."
                },
                {
                    "team": "Alpha",
                    "detail": "Retour au camp d'origine attribué au joueur."
                }
            ]
        },
        "app_usage": {
            "required_phones": "Aucune",
            "details": "Aucune"
        },
        "map_markers": [
            {
                "id": "delta",
                "name": "Camp Delta (Alpha)",
                "type": "stock",
                "team": "Alpha (Défense)",
                "role": "Stock de drogue (sachets factices)",
                "lat": 48.792173,
                "lng": 2.103686,
                "icon": "fa-solid fa-capsules",
                "color": "#38bdf8",
                "badge": "Stock Alpha"
            },
            {
                "id": "mike",
                "name": "Camp Mike (Alpha)",
                "type": "stock",
                "team": "Alpha (Défense)",
                "role": "Stock d'argent (liasses de faux billets)",
                "lat": 48.792328,
                "lng": 2.103096,
                "icon": "fa-solid fa-money-bill-wave",
                "color": "#fbbf24",
                "badge": "Stock Alpha"
            },
            {
                "id": "echo",
                "name": "Camp Echo (Bravo)",
                "type": "spawn",
                "team": "Bravo (Attaque)",
                "role": "Base de départ & sécurisation du butin",
                "lat": 48.793258,
                "lng": 2.103391,
                "icon": "fa-solid fa-crosshairs",
                "color": "#ef4444",
                "badge": "Base Bravo"
            }
        ]
    },
    {
        "slug": "capture-de-zones",
        "title": "Capture de zones",
        "pitch": "Deux forces armées s'affrontent pour le contrôle total d'un secteur stratégique. Quatre avant-postes doivent être capturés et tenus simultanément.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Équipe Alpha",
                    "role": "Force armée",
                    "badge_color": "blue",
                    "description": "Camp : Camp de départ Alpha",
                    "groups": []
                },
                {
                    "name": "Équipe Bravo",
                    "role": "Force armée",
                    "badge_color": "red",
                    "description": "Camp : Camp de départ Bravo",
                    "groups": []
                }
            ],
            "camps_rule": "Un par équipe.",
            "contested_objectives": "Zones Charly, Delta, Echo et Fox-trot"
        },
        "objectifs_victory": {
            "duration": "Au choix.",
            "victory_conditions_list": [
                {
                    "title": "Victoire par contrôle total",
                    "points": [
                        "Dès qu'une équipe contrôle simultanément les 4 zones, un compte à rebours de 5 minutes est lancé. Si l'équipe conserve l'intégralité des 4 zones pendant les 5 minutes complètes, victoire immédiate.",
                        "Si l'équipe adverse parvient à reprendre ne serait-ce qu'une seule zone, le compte à rebours est annulé immédiatement et le jeu reprend normalement."
                    ]
                },
                {
                    "title": "Victoire au Temps (Points cumulés)",
                    "text": "L'équipe ayant cumulé le plus de points de contrôle à la fin du temps imparti gagne."
                }
            ]
        },
        "specific_rules": {
            "section_title": "Règles de Capture & Contrôle des Zones",
            "rules_list": [
                {
                    "num": 1,
                    "title": "Condition d'effectif",
                    "text": "Pour capturer ou reprendre une zone, il faut au moins 2 joueurs vivants de la même équipe à l'intérieur du périmètre."
                },
                {
                    "num": 2,
                    "title": "Zone contestée",
                    "text": "Dès qu’un seul joueur adverse vivant se trouve dans le périmètre, la zone est contestée : aucune capture ni changement d'état ne peut être validé tant qu'il n'est pas éliminé ou repoussé."
                }
            ]
        },
        "respawn_rules": {
            "type": "Respawns illimités.",
            "location": "Retour au camp de l’équipe."
        },
        "app_usage": {
            "required_phones": "1/joueur",
            "details": "Détection de la position des joueurs via l’application pour capture les zones."
        },
        "map_markers": [
            {
                "id": "camp-alpha",
                "name": "Camp Alpha",
                "type": "spawn",
                "team": "Équipe Alpha",
                "role": "Camp de départ & zone de respawn de l'Équipe Alpha",
                "lat": 48.79400,
                "lng": 2.10220,
                "icon": "fa-solid fa-flag",
                "color": "#38bdf8",
                "badge": "Base Alpha"
            },
            {
                "id": "camp-bravo",
                "name": "Camp Bravo",
                "type": "spawn",
                "team": "Équipe Bravo",
                "role": "Camp de départ & zone de respawn de l'Équipe Bravo",
                "lat": 48.79170,
                "lng": 2.10350,
                "icon": "fa-solid fa-flag",
                "color": "#ef4444",
                "badge": "Base Bravo"
            },
            {
                "id": "zone-charly",
                "name": "Zone Charly",
                "type": "objective",
                "team": "Zone contestée",
                "role": "Avant-poste stratégique Ouest (2 joueurs requis)",
                "lat": 48.79320,
                "lng": 2.10150,
                "icon": "fa-solid fa-bullseye",
                "color": "#d4af37",
                "badge": "Zone Charly"
            },
            {
                "id": "zone-delta",
                "name": "Zone Delta",
                "type": "objective",
                "team": "Zone contestée",
                "role": "Avant-poste stratégique Nord-Est (2 joueurs requis)",
                "lat": 48.79360,
                "lng": 2.10330,
                "icon": "fa-solid fa-bullseye",
                "color": "#d4af37",
                "badge": "Zone Delta"
            },
            {
                "id": "zone-echo",
                "name": "Zone Echo",
                "type": "objective",
                "team": "Zone contestée",
                "role": "Avant-poste stratégique Centre (2 joueurs requis)",
                "lat": 48.79280,
                "lng": 2.10250,
                "icon": "fa-solid fa-bullseye",
                "color": "#d4af37",
                "badge": "Zone Echo"
            },
            {
                "id": "zone-foxtrot",
                "name": "Zone Fox-trot",
                "type": "objective",
                "team": "Zone contestée",
                "role": "Avant-poste stratégique Sud-Ouest (2 joueurs requis)",
                "lat": 48.79220,
                "lng": 2.10180,
                "icon": "fa-solid fa-bullseye",
                "color": "#d4af37",
                "badge": "Zone Fox-trot"
            }
        ]
    },
    {
        "slug": "alerte-a-la-bombe",
        "title": "Alerte à la bombe",
        "pitch": "Des terroristes tentent de poser une bombe sur un endroit protégé par l’armée.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Équipe Vigipirate",
                    "role": "Défense",
                    "badge_color": "blue",
                    "description": "Divisée au départ en 2 groupes distincts :",
                    "groups": [
                        {
                            "name": "Soldats",
                            "role": "Soldats (Interception et défense)",
                            "icon": "fa-solid fa-person-rifle"
                        },
                        {
                            "name": "Démineurs",
                            "role": "Démineurs. Ils représentent ¼ de des Vigipirates.",
                            "icon": "fa-solid fa-wrench"
                        }
                    ]
                },
                {
                    "name": "Équipe Terroriste",
                    "role": "Attaque",
                    "badge_color": "red",
                    "description": "Force d'assaut et pose de bombe",
                    "groups": []
                }
            ],
            "zone_rule": "Une zone défendue par l’équipe Vigipirate."
        },
        "objectifs_victory": {
            "duration": "Illimitée (fin à l'accomplissement d'un objectif majeur ou élimination totale).",
            "camp_objectives": [
                {
                    "team": "Terroristes",
                    "label": "Attaque",
                    "text": "S'infiltrer sur le site, poser la bombe sur la zone cible, et défendre le périmètre jusqu'à l’explosion."
                },
                {
                    "team": "Vigipirate",
                    "label": "Défense",
                    "text": "Soldats : Intercepter les terroristes. | Démineurs : Désactiver la bombe avant l’explosion.",
                    "sub_objectives": [
                        "Soldats : Intercepter les terroristes.",
                        "Démineurs : Désactiver la bombe avant l’explosion."
                    ]
                }
            ],
            "victory_conditions_list": [
                {
                    "title": "Victoire des Terroristes",
                    "text": "La bombe explose ou tous les Vigipirates sont éliminés définitivement."
                },
                {
                    "title": "Victoire des Vigipirate",
                    "text": "Les démineurs réussissent à désamorcer l'engin explosif posé ou tous les terroristes sont éliminés."
                }
            ]
        },
        "specific_rules": {
            "section_title": "Règles d'engagement & Rôles",
            "rules_list": [
                {
                    "num": 1,
                    "title": "Effectif Démineurs",
                    "text": "Démineurs. Ils représentent ¼ de des Vigipirates. Seuls les démineurs peuvent intervenir sur l'engin."
                },
                {
                    "num": 2,
                    "title": "Site protégé",
                    "text": "Les terroristes doivent s'infiltrer sur le site, poser la bombe sur la zone cible, et défendre le périmètre jusqu'à l’explosion."
                }
            ]
        },
        "respawn_rules": {
            "type": "5 respawn par joueur",
            "reanimation_procedure": [
                "Le joueur touché quand il défend s'annonce et reste sur place sans bouger ni parler (sauf pour crier « Médic ! ») et ne peut pas tirer.",
                "Il peut être traîné ou épaulé par un allié pour être mis à couvert.",
                "Pour valider le soin : le soignant doit maintenir un contact physique continu avec le blessé pendant 20 secondes consécutives.",
                "Si le soignant est touché ou interrompt le contact avant la fin des 20 secondes, le décompte repart de zéro.",
                "Une fois le délai écoulé, le joueur soigné crie distinctement « Retour en jeu ! » avant de reprendre le tir et ses mouvements.",
                "Le joueur touché quand il attaque retourne à son QG puis peut revenir au combat."
            ]
        },
        "app_usage": {
            "required_phones": "1",
            "details": "Activation et désamorçage de la bombe."
        },
        "map_markers": [
            {
                "id": "site-bombe",
                "name": "Zone Cible (Site Bombe)",
                "type": "objective",
                "team": "Zone Cible",
                "role": "Zone défendue par l’équipe Vigipirate — Emplacement pour amorcer la bombe",
                "lat": 48.792111,
                "lng": 2.102053,
                "icon": "fa-solid fa-bomb",
                "color": "#d4af37",
                "badge": "Zone Cible"
            },
            {
                "id": "spawn-vigipirate",
                "name": "QG Vigipirate",
                "type": "spawn",
                "team": "Équipe Vigipirate (Défense)",
                "role": "Zone de déploiement et défense des soldats & démineurs",
                "lat": 48.792314,
                "lng": 2.101554,
                "icon": "fa-solid fa-shield-halved",
                "color": "#38bdf8",
                "badge": "Base Vigipirate"
            },
            {
                "id": "spawn-terroristes",
                "name": "Point d'Insertion Terroriste",
                "type": "spawn",
                "team": "Équipe Terroriste (Attaque)",
                "role": "Zone d'insertion et infiltration des assaillants",
                "lat": 48.792010,
                "lng": 2.103142,
                "icon": "fa-solid fa-skull-crossbones",
                "color": "#ef4444",
                "badge": "Spawn Terroriste"
            }
        ]
    },
    {
        "slug": "desamorcage",
        "title": "Désamorçage",
        "pitch": "Les forces armées mènent un assaut sur un site tenu par une cellule adverse. Trois engins explosifs sont déjà armés et disséminés sur le site : les soldats doivent infiltrer la place forte et neutraliser chaque charge avant la mise à feu.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Équipe Alpha",
                    "role": "Attaque",
                    "badge_color": "blue",
                    "details": [
                        "Point de départ : Hors de la base (zone d'insertion extérieure)."
                    ],
                    "composition_label": "Composition :",
                    "groups": [
                        {
                            "name": "Soldats",
                            "role": "Groupe principal d'intervention et de couverture.",
                            "icon": "fa-solid fa-person-rifle"
                        },
                        {
                            "name": "Démineurs",
                            "role": "Ils représentent ¼ de Alpha.",
                            "icon": "fa-solid fa-wrench"
                        }
                    ]
                },
                {
                    "name": "Équipe terroriste",
                    "role": "Défense",
                    "badge_color": "red",
                    "details": [
                        "Point de départ : Déployés directement à l'intérieur de la zone.",
                        "Zone : Comprend trois sites distincts où se trouvent les trois bombes."
                    ],
                    "groups": []
                }
            ]
        },
        "objectifs_victory": {
            "duration": "Illimitée (fin à l'accomplissement d'un objectif majeur ou à l'épuisement des réapparitions).",
            "camp_objectives": [
                {
                    "team": "Terroristes",
                    "label": "Défense",
                    "text": "Défendre les trois sites et repousser l'assaut jusqu'à l'explosion d'au moins une charge ou l'élimination des assaillants."
                },
                {
                    "team": "Vigipirate",
                    "label": "Attaque",
                    "text": "Soldats : Sécuriser les accès et couvrir les démineurs lors des phases critiques. | Démineurs : Localiser et désamorcer impérativement les trois engins explosifs.",
                    "sub_objectives": [
                        "Soldats : Sécuriser les accès et couvrir les démineurs lors des phases critiques.",
                        "Démineurs : Localiser et désamorcer impérativement les trois engins explosifs."
                    ]
                }
            ],
            "victory_conditions_list": [
                {
                    "title": "Victoire des Terroristes",
                    "points": [
                        "Au moins une bombe explose.",
                        "Tous les Vigipirate sont éliminés définitivement."
                    ]
                },
                {
                    "title": "Victoire de Vigipirate",
                    "points": [
                        "Les démineurs réussissent à désamorcer l'ensemble des trois bombes."
                    ]
                }
            ]
        },
        "specific_rules": {
            "section_title": "Règles d'engagement & Rôles",
            "rules_list": [
                {
                    "num": 1,
                    "title": "Effectif Démineurs",
                    "text": "Démineurs : Ils représentent ¼ de Alpha. Seuls les démineurs sont habilités à désamorcer les charges."
                },
                {
                    "num": 2,
                    "title": "Désamorçage total",
                    "text": "Localiser et désamorcer impérativement les trois engins explosifs armés disséminés sur le site."
                }
            ]
        },
        "respawn_rules": {
            "type": "5 réapparitions par joueur.",
            "reanimation_procedure": [
                "Le joueur touché s'annonce, s'immobilise et cesse de communiquer (sauf pour appeler « Médic ! »). Tirs interdits.",
                "Il peut être traîné ou épaulé par un coéquipier pour être mis à l'abri.",
                "Le soignant doit maintenir un contact physique continu avec le blessé pendant 20 secondes consécutives.",
                "Si le soignant est touché ou rompt le contact avant la fin des 20 secondes, le décompte repart de zéro.",
                "Une fois le délai écoulé, le joueur soigné annonce distinctement « Retour en jeu ! » avant de pouvoir se déplacer et tirer à nouveau."
            ]
        },
        "app_usage": {
            "required_phones": "3",
            "details": "Désamorçage des bombes."
        },
        "map_markers": [
            {
                "id": "base-armee",
                "name": "Base Armée",
                "type": "spawn",
                "team": "Forces Armées (Attaque)",
                "role": "Point de départ et d'intervention des soldats et démineurs",
                "lat": 48.793040,
                "lng": 2.103536,
                "icon": "fa-solid fa-shield-halved",
                "color": "#38bdf8",
                "badge": "Base Armée"
            },
            {
                "id": "bombe-1",
                "name": "Bombe 1",
                "type": "objective",
                "team": "Engin explosif 1",
                "role": "Site d'amorçage 1 — Smartphone 1 (Désamorçage requis)",
                "lat": 48.793394,
                "lng": 2.103361,
                "icon": "fa-solid fa-bomb",
                "color": "#d4af37",
                "badge": "Bombe 1"
            },
            {
                "id": "bombe-2",
                "name": "Bombe 2",
                "type": "objective",
                "team": "Engin explosif 2",
                "role": "Site d'amorçage 2 — Smartphone 2 (Désamorçage requis)",
                "lat": 48.793203,
                "lng": 2.103252,
                "icon": "fa-solid fa-bomb",
                "color": "#d4af37",
                "badge": "Bombe 2"
            },
            {
                "id": "bombe-3",
                "name": "Bombe 3",
                "type": "objective",
                "team": "Engin explosif 3",
                "role": "Site d'amorçage 3 — Smartphone 3 (Désamorçage requis)",
                "lat": 48.793263,
                "lng": 2.103555,
                "icon": "fa-solid fa-bomb",
                "color": "#d4af37",
                "badge": "Bombe 3"
            }
        ]
    },
    {
        "slug": "course-aux-points",
        "title": "Course aux points",
        "pitch": "Deux équipes s'affrontent sur zone neutre. L'objectif est de neutraliser un maximum d'adversaires tout en limitant ses propres pertes.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Équipe Alpha",
                    "role": "Camp de départ Alpha",
                    "badge_color": "blue",
                    "description": "Camp de départ Alpha.",
                    "groups": []
                },
                {
                    "name": "Équipe Bravo",
                    "role": "Camp de départ Bravo",
                    "badge_color": "red",
                    "description": "Camp de départ Bravo.",
                    "groups": []
                }
            ],
            "clash_zone": "L'ensemble du terrain entre les deux bases. Les tirs directs dans les zones de spawn adverses sont interdits."
        },
        "objectifs_victory": {
            "duration": "Dès que le seuil de point est atteint ou à la fin du chronomètre.",
            "victory_conditions_list": [
                {
                    "title": "Au chrono",
                    "text": "L'équipe ayant le plus de points à la fin du temps imparti l'emporte."
                },
                {
                    "title": "Au score",
                    "text": "La première équipe à atteindre le palier de point fixé remporte immédiatement la manche."
                }
            ]
        },
        "specific_rules": {
            "section_title": "Règles",
            "rules_list": [
                {
                    "num": 1,
                    "title": "Comptage des touches",
                    "text": "Chaque joueur touché se déclare à voix haute, lève la main ou sort un chiffon rouge/fluo, et rejoint immédiatement sa base sans communiquer d'informations tactiques aux joueurs vivants."
                },
                {
                    "num": 2,
                    "title": "Système de points (matériel simple)",
                    "points": [
                        "Chaque base dispose d'une urne/boîte et d'un stock de jetons ou cartes. À chaque réapparition, le joueur dépose un jeton dans l'urne adverse (comptage des pertes) OU clique sur un compteur mécanique / tableau blanc dédié."
                    ]
                }
            ]
        },
        "respawn_rules": {
            "type": "Respawns illimités.",
            "location": "Retour au camp de l’équipe."
        },
        "app_usage": {
            "required_phones": "2",
            "details": "Comptage des points (pression lors du retour au spawn) et chronomètre."
        },
        "map_markers": [
            {
                "id": "camp-alpha",
                "name": "Camp Alpha",
                "type": "spawn",
                "team": "Équipe Alpha",
                "role": "Camp de départ Alpha & zone de réapparition (urne / smartphone de comptage)",
                "lat": 48.792304,
                "lng": 2.103461,
                "icon": "fa-solid fa-flag",
                "color": "#38bdf8",
                "badge": "Camp Alpha"
            },
            {
                "id": "camp-bravo",
                "name": "Camp Bravo",
                "type": "spawn",
                "team": "Équipe Bravo",
                "role": "Camp de départ Bravo & zone de réapparition (urne / smartphone de comptage)",
                "lat": 48.791671,
                "lng": 2.102643,
                "icon": "fa-solid fa-flag",
                "color": "#ef4444",
                "badge": "Camp Bravo"
            }
        ]
    },
    {
        "slug": "ligne-de-mire",
        "title": "Ligne de mire",
        "pitch": "Un groupe armé doit escorter un VIP à travers une zone hostile, tandis qu'un binôme de snipers et leurs observateurs sont embusqués pour éliminer la cible.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Équipe Convoi VIP",
                    "role": "Escorte & VIP",
                    "badge_color": "blue",
                    "details": [
                        "Composition : Le VIP et son escorte armée. Le VIP possède seulement une réplique de poing.",
                        "Point de départ : Une extrémité du terrain.",
                        "Identification du VIP : Son identité est secrète pour les snipers ; il porte un signe distinctif visible connu des snipers."
                    ],
                    "groups": []
                },
                {
                    "name": "Équipe Tireurs d'élite",
                    "role": "Snipers & Spotters",
                    "badge_color": "red",
                    "details": [
                        "Composition : 2 binômes distincts, chacun composé de 1 Sniper et 1 Spotter.",
                        "Point de départ / Déploiement : Libre sur l'ensemble du terrain avant le début des mouvements du convoi."
                    ],
                    "groups": []
                }
            ],
            "extraction_zone": "Située à l'autre bout du terrain, dans une zone dégagée."
        },
        "objectifs_victory": {
            "duration": "Fin à l'arrivée du convoi, à l'élimination du VIP ou à la neutralisation des snipers.",
            "camp_objectives": [
                {
                    "team": "Groupe VIP",
                    "label": "Escorte",
                    "text": "Traverser le terrain et amener le VIP sain et sauf sur la zone d'extraction."
                },
                {
                    "team": "Snipers & Spotters",
                    "label": "Tireurs d'élite",
                    "text": "Identifier le VIP, le neutraliser, puis s'exfiltrer vers la zone dégagée."
                }
            ],
            "victory_conditions_list": [
                {
                    "title": "Victoire de l'Escorte",
                    "text": "Le VIP atteint vivant la zone d'extraction."
                },
                {
                    "title": "Victoire des Snipers",
                    "text": "Le VIP est définitivement neutralisé et au moins un tireur/spotter réussit son exfiltration sur la zone dégagée."
                }
            ]
        },
        "specific_rules": {
            "section_title": "Règles spécifiques",
            "rules_list": [
                {
                    "num": 1,
                    "title": "Cohésion du convoi",
                    "text": "L'ensemble du groupe VIP doit progresser groupé et rester confiné dans un rayon maximum de 20 mètres."
                },
                {
                    "num": 2,
                    "title": "Timing d'engagement / Déploiement",
                    "points": [
                        "Les snipers et spotters partent se placer où ils le souhaitent sur le terrain.",
                        "Le convoi donne un signal pour indiquer le début de la phase de mise en place.",
                        "Le groupe VIP démarre sa progression exactement 5 minutes après le coup de sifflet."
                    ]
                }
            ]
        },
        "respawn_rules": {
            "type": "1 seule réanimation autorisée par joueur sur la partie.",
            "hit_locations": [
                "Touche à la tête : Élimination directe.",
                "Touche sur le reste du corps : Le joueur est considéré comme blessé."
            ],
            "injured_state": "Le blessé ne peut plus se déplacer mais a le droit d'utiliser son arme de poing, s'il en possède une.",
            "reanimation_procedure": [
                "Nombre de soins : 1 seule réanimation autorisée par joueur sur la partie.",
                "Pour valider le soin, un allié doit maintenir un contact physique continu avec le joueur blessé pendant 30 secondes.",
                "Si le soignant est touché ou rompt le contact avant la fin des 30 secondes, le décompte repart de zéro.",
                "Toute seconde touche reçue alors que le joueur est blessé entraîne son élimination définitive."
            ]
        },
        "app_usage": {
            "required_phones": "Aucun",
            "details": "Aucune"
        },
        "map_markers": [
            {
                "id": "depart-vip",
                "name": "Départ VIP",
                "type": "spawn",
                "team": "Convoi VIP",
                "role": "Point de départ et d'insertion du convoi et du VIP (rayon de 20m max)",
                "lat": 48.793263,
                "lng": 2.103356,
                "icon": "fa-solid fa-user-shield",
                "color": "#38bdf8",
                "badge": "Départ VIP"
            },
            {
                "id": "extraction-vip",
                "name": "Extraction VIP",
                "type": "objective",
                "team": "Objectif Final",
                "role": "Zone d'extraction sécurisée pour le VIP",
                "lat": 48.792325,
                "lng": 2.103085,
                "icon": "fa-solid fa-helicopter",
                "color": "#d4af37",
                "badge": "Extraction VIP"
            }
        ]
    },
    {
        "slug": "traque-en-binomes",
        "title": "Traque en Binômes",
        "pitch": "Plusieurs duos d'opérateurs sont présents sur le terrain. Chaque binôme doit traquer et éliminer les autres duos pour rester les derniers survivants.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Binômes d'opérateurs",
                    "role": "Traqueurs en duos",
                    "badge_color": "gold",
                    "description": "Les joueurs sont répartis en binôme.",
                    "details": [
                        "Chaque binôme doit traquer et éliminer les autres duos pour rester les derniers survivants."
                    ],
                    "groups": []
                }
            ],
            "teams_rule": "Les joueurs sont répartis en binôme.",
            "clash_zone": "L'ensemble du terrain de jeu sans zone neutre."
        },
        "objectifs_victory": {
            "duration": "Fin de partie lorsqu'il ne reste qu'un seul binôme en jeu.",
            "victory_condition": "Rester le dernier binôme survivant sur le terrain après élimination de tous les autres duos."
        },
        "specific_rules": {},
        "respawn_rules": {
            "hit_locations": [
                "Touche à la tête : Élimination directe.",
                "Touche sur le reste du corps : Le joueur est considéré comme blessé."
            ],
            "injured_state": "Le blessé ne peut plus se déplacer mais a le droit d'utiliser son arme de poing, s'il en possède une.",
            "reanimation_procedure": [
                "Nombre de soins : 1 seule réanimation autorisée par joueur sur l'ensemble de la partie.",
                "Pour soigner son coéquipier, l'allié valide doit maintenir un contact physique continu avec lui pendant 30 secondes.",
                "Si le soignant est touché ou interrompt le contact avant la fin des 30 secondes, le décompte repart de zéro.",
                "Toute nouvelle touche reçue alors que le joueur est déjà blessé entraîne son élimination définitive."
            ]
        },
        "app_usage": {
            "required_phones": "Aucun",
            "details": "Aucune"
        },
        "map_markers": []
    },
    {
        "slug": "capture-de-drapeau",
        "title": "Capture de drapeau",
        "pitch": "Deux équipes possèdent un drapeau et cherche à capturer le drapeau adverse.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Équipe Alpha",
                    "role": "Camp Alpha (équipes équilibrées)",
                    "badge_color": "blue",
                    "description": "Équipe équilibrée possédant son propre drapeau abrité dans sa base avancée.",
                    "groups": []
                },
                {
                    "name": "Équipe Bravo",
                    "role": "Camp Bravo (équipes équilibrées)",
                    "badge_color": "red",
                    "description": "Équipe équilibrée possédant son propre drapeau abrité dans sa base avancée.",
                    "groups": []
                }
            ],
            "teams_rule": "Équipe Alpha vs Équipe Bravo (équipes équilibrées).",
            "spawns_rule": "Deux zones de départ distinctes situées aux extrémités du terrain.",
            "forward_bases": "Situées en avant de chaque spawn respectif, chacune abritant l'objet de l'équipe (drapeau, mallette, etc.)."
        },
        "objectifs_victory": {
            "duration": "Au choix (au temps ou au nombre de captures).",
            "common_objective": "Infiltrer la base adverse, dérober l'objet ennemi et le rapatrier dans sa propre base.",
            "victory_condition": "Pour valider un point / remporter la manche, une équipe doit ramener l'objet adverse dans sa base tout en ayant toujours son propre objet présent dans sa base."
        },
        "specific_rules": {
            "section_title": "Règles",
            "rules_list": [
                {
                    "num": 1,
                    "title": "Transport visible",
                    "text": "Le colis doit être tenu en main et être clairement visible."
                },
                {
                    "num": 2,
                    "title": "Joueur touché en transportant un colis",
                    "points": [
                        "Le joueur dépose immédiatement le colis au sol à l'endroit exact de sa touche."
                    ]
                }
            ],
            "ground_rule": "Tout joueur vivant peut ramasser un colis tombé au sol."
        },
        "respawn_rules": {
            "type": "Respawns illimités.",
            "location": "Retour au camp de l’équipe."
        },
        "app_usage": {
            "required_phones": "Aucun",
            "details": "Aucune"
        },
        "map_markers": [
            {
                "id": "camp-alpha",
                "name": "Camp Alpha",
                "type": "spawn",
                "team": "Équipe Alpha",
                "role": "Base, respawn et Drapeau Alpha à protéger",
                "lat": 48.792314,
                "lng": 2.101554,
                "icon": "fa-solid fa-flag",
                "color": "#38bdf8",
                "badge": "Camp Alpha"
            },
            {
                "id": "camp-bravo",
                "name": "Camp Bravo",
                "type": "spawn",
                "team": "Équipe Bravo",
                "role": "Base, respawn et Drapeau Bravo à protéger",
                "lat": 48.792157,
                "lng": 2.103689,
                "icon": "fa-solid fa-flag",
                "color": "#ef4444",
                "badge": "Camp Bravo"
            }
        ]
    },
    {
        "slug": "escorte-vip",
        "title": "Escorte VIP",
        "pitch": "Une force armée a pour mission d'escorter un VIP à travers un secteur contrôlé par des défenseurs retranchés, afin d'atteindre un point d'évacuation en mouvement constant.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Attaquants (70% des effectifs)",
                    "role": "Convoi d'escorte & VIP",
                    "badge_color": "blue",
                    "details": [
                        "Le convoi d'escorte, dont l'un des joueurs est désigné comme le VIP. Ce dernier possède seulement une réplique de poing."
                    ],
                    "groups": []
                },
                {
                    "name": "Défenseurs (30% des effectifs)",
                    "role": "Groupe d’embuscade",
                    "badge_color": "red",
                    "details": [
                        "Groupe d’embuscade."
                    ],
                    "groups": []
                }
            ],
            "zones": [
                {
                    "name": "Alpha",
                    "description": "Point de départ et zone de réapparition des attaquants."
                },
                {
                    "name": "Bravo",
                    "description": "Point d'extraction / objectif final à atteindre pour le VIP."
                },
                {
                    "name": "Charly",
                    "description": "Zone de réapparition des défenseurs."
                }
            ]
        },
        "objectifs_victory": {
            "duration": "Fin de partie immédiate dès l'atteinte d'une condition de victoire.",
            "victory_conditions_list": [
                {
                    "title": "Victoire des Attaquants",
                    "text": "Le VIP parvient à atteindre vivant Bravo."
                },
                {
                    "title": "Victoire des Défenseurs",
                    "text": "Le VIP est touché."
                }
            ]
        },
        "specific_rules": {
            "section_title": "Règles",
            "rules_list": [
                {
                    "num": 1,
                    "title": "Statut du VIP",
                    "text": "Le VIP ne peut pas être réanimé."
                },
                {
                    "num": 2,
                    "title": "Type",
                    "text": "Respawns illimités."
                }
            ]
        },
        "respawn_rules": {
            "type": "Respawns illimités.",
            "location": "Zone Alpha pour les attaquants, Zone Charly pour les défenseurs."
        },
        "app_usage": {
            "required_phones": "Aucun",
            "details": "Aucune."
        },
        "map_markers": [
            {
                "id": "depart-vip",
                "name": "Départ du VIP",
                "type": "spawn",
                "team": "Attaquants (Convoi VIP)",
                "role": "Point de départ et zone de réapparition des attaquants (Convoi & VIP)",
                "lat": 48.792646,
                "lng": 2.103750,
                "icon": "fa-solid fa-user-shield",
                "color": "#38bdf8",
                "badge": "Départ VIP"
            },
            {
                "id": "extraction-vip",
                "name": "Lieu d'Extraction",
                "type": "objective",
                "team": "Objectif VIP",
                "role": "Point d'extraction / objectif final à atteindre pour le VIP",
                "lat": 48.792115,
                "lng": 2.102042,
                "icon": "fa-solid fa-helicopter",
                "color": "#d4af37",
                "badge": "Extraction VIP"
            },
            {
                "id": "spawn-defenseurs",
                "name": "Spawn Défenseurs",
                "type": "spawn",
                "team": "Défenseurs (Embuscade)",
                "role": "Zone de réapparition des défenseurs pour l'embuscade",
                "lat": 48.791671,
                "lng": 2.102648,
                "icon": "fa-solid fa-crosshairs",
                "color": "#ef4444",
                "badge": "Défenseurs"
            }
        ]
    },
    {
        "slug": "largage-en-inconnu",
        "title": "Largage en Inconnu",
        "pitch": "À la suite d'un largage d'urgence dispersé en territoire hostile, les opérateurs se réveillent isolés sur le terrain sans connaître l'allégeance de leurs voisins. Ils doivent identifier leur camp, retrouver leurs alliés et sécuriser simultanément les deux drapeaux du secteur dans leur base d'opération.",
        "teams_setup": {
            "teams": [
                {
                    "name": "Équipe Alpha",
                    "role": "Faction Alpha (équipes équilibrées)",
                    "badge_color": "blue",
                    "description": "Équipe équilibrée issue de la dispersion aléatoire, devant rallier sa base et réunir les 2 drapeaux.",
                    "groups": []
                },
                {
                    "name": "Équipe Bravo",
                    "role": "Faction Bravo (équipes équilibrées)",
                    "badge_color": "red",
                    "description": "Équipe équilibrée issue de la dispersion aléatoire, devant rallier sa base et réunir les 2 drapeaux.",
                    "groups": []
                }
            ],
            "teams_rule": "Équipe Alpha vs Équipe Bravo (équipes équilibrées).",
            "bases_rule": "Une base par équipe abritant chacune un drapeau de départ.",
            "departure_rule": "Zone neutre pour la distribution des rôles, puis dispersion aléatoire sur l'ensemble du terrain avant le début.",
            "gear_per_player": [
                "Un brassard d'identification.",
                "Un papier (ou attribution secrète via l'application) désignant son camp."
            ]
        },
        "objectifs_victory": {
            "duration": "Au choix.",
            "flow": [
                "Identifier et rejoindre ses coéquipiers.",
                "Récupérer le drapeau adverse tout en protégeant son propre drapeau."
            ],
            "victory_condition": "La première équipe à réunir et maintenir les deux drapeaux simultanément dans sa propre base remporte la partie."
        },
        "specific_rules": {
            "section_title": "Règles",
            "rules_list": [
                {
                    "num": 1,
                    "title": "Avant le début",
                    "text": "Les joueurs piochent leur rôle à l'aveugle en zone neutre sans le regarder, puis partent se disperser et se cacher librement sur le terrain."
                },
                {
                    "num": 2,
                    "title": "Lancement de partie",
                    "points": [
                        "Au signal de départ, chaque joueur consulte son papier (ou son téléphone) pour découvrir son équipe.",
                        "Il équipe immédiatement son signe distinctif d’équipe."
                    ]
                },
                {
                    "num": 3,
                    "title": "Transport des drapeaux",
                    "points": [
                        "Tout joueur touché alors qu'il transporte un drapeau doit immédiatement le déposer au sol à l'endroit exact de sa touche.",
                        "N'importe quel joueur vivant peut ramasser un drapeau tombé au sol."
                    ]
                }
            ]
        },
        "respawn_rules": {
            "type": "Respawns illimités.",
            "location": "Retour au camp de l’équipe."
        },
        "app_usage": {
            "required_phones": "1/joueur.",
            "details": "Remplacement des papiers pour l'attribution aléatoire et secrète des équipes au début de la manche."
        },
        "map_markers": []
    }
]


def seed_scenarios():
    """Insère ou met à jour les scénarios dans la table `scenarios`."""
    init_db()
    db = SessionLocal()
    try:
        count_created = 0
        count_updated = 0
        for item in SCENARIOS_DATA:
            scenario = db.query(Scenario).filter(Scenario.slug == item["slug"]).first()
            if not scenario:
                scenario = Scenario(
                    slug=item["slug"],
                    title=item["title"],
                    pitch=item["pitch"],
                    teams_setup=item["teams_setup"],
                    objectifs_victory=item["objectifs_victory"],
                    specific_rules=item["specific_rules"],
                    respawn_rules=item["respawn_rules"],
                    app_usage=item["app_usage"],
                    map_markers=item["map_markers"]
                )
                db.add(scenario)
                count_created += 1
                print(f"[Seed Scénarios] Créé : {item['title']} ({item['slug']})")
            else:
                scenario.title = item["title"]
                scenario.pitch = item["pitch"]
                scenario.teams_setup = item["teams_setup"]
                scenario.objectifs_victory = item["objectifs_victory"]
                scenario.specific_rules = item["specific_rules"]
                scenario.respawn_rules = item["respawn_rules"]
                scenario.app_usage = item["app_usage"]
                scenario.map_markers = item["map_markers"]
                count_updated += 1
                print(f"[Seed Scénarios] Mis à jour : {item['title']} ({item['slug']})")

        db.commit()
        print(f"[Seed Scénarios] Opération terminée avec succès ! ({count_created} créés, {count_updated} mis à jour)")
    except Exception as e:
        db.rollback()
        print(f"[Seed Scénarios] Erreur : {e}")
        raise
    finally:
        db.close()


if __name__ == "__main__":
    seed_scenarios()
