import os
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.oxml.xmlchemy import OxmlElement

# Initialisation de la présentation
prs = Presentation()
prs.slide_width = Inches(13.33)  # Format 16:9 moderne
prs.slide_height = Inches(7.5)

# Palettes de couleurs thématiques (RGB)
COLOR_PRIMARY_DARK  = RGBColor(12, 28, 54)     # Bleu Saphir Profond (Slides techniques)
COLOR_PRIMARY_LIGHT = RGBColor(245, 247, 250)  # Gris Givré Épuré
COLOR_ACCENT_TEAL   = RGBColor(0, 168, 150)    # Turquoise Marocain (Mise en valeur)
COLOR_TEXT_DARK     = RGBColor(33, 37, 41)     # Anthracite (Texte principal)
COLOR_TEXT_LIGHT    = RGBColor(255, 255, 255)  # Blanc Pur
COLOR_ALERT_RED     = RGBColor(217, 4, 41)     # Rouge (Vulnérabilités / Alertes)
COLOR_ALERT_GREEN   = RGBColor(56, 176, 0)     # Vert (Remédiations / Succès)

# Configuration OpenXML pour activer le défilement automatique (Automated Timing Gate)
def apply_auto_advance(slide, ms=7000):
    try:
        sld = slide.element
        transition = OxmlElement('p:transition')
        transition.set('advTm', str(ms))
        timing = sld.find('{http://schemas.openxmlformats.org/presentationml/2006/main}timing')
        if timing is not None:
            timing.addprevious(transition)
        else:
            sld.append(transition)
    except Exception:
        pass

# Helper pour colorer l'arrière-plan d'une diapositive
def set_slide_background(slide, color):
    background = slide.background
    fill = background.fill
    fill.solid()
    fill.fore_color.rgb = color

# Liste exhaustive des 25 diapositives configurées pour votre DUT Ingénierie des Données
slides_data = [
    # 1. Title Slide
    {
        "title": "PORTAIL NATIONAL E-CITIZEN",
        "bg_type": "dark",
        "points": [
            "Modernisation de la Gestion des Réclamations Citoyennes",
            "Intégration d'une Architecture Multi-Cloud Résiliente et du Modèle IA REMAKA",
            "Soutenance de Projet de Fin d'Études (PFE)",
            "Filière : DUT Ingénierie des Données | Session 2026"
        ],
        "prompt": "Minimalist digital network layout overlaying a subtle map of Morocco, dark corporate blue hue, cinematic lighting, 8k resolution, tech banner style.",
        "notes": "Bonjour Mesdames et Messieurs les membres du jury. Je vous présente aujourd'hui mon projet de fin d'études validant mon DUT en Ingénierie des Données. Ce travail illustre la convergence entre la modélisation de bases de données, l'infrastructure cloud et l'intelligence artificielle."
    },
    # 2. Executive Vision
    {
        "title": "02. Vision Globale du Projet",
        "bg_type": "light",
        "points": [
            "Objectif central : Briser les silos administratifs entre les ministères.",
            "Indicateur Clé (KPI) : Réduction du temps de traitement de 14 jours à moins de 48 heures.",
            "Livrables opérationnels : Une interface citoyenne réactive et un tableau de bord analytique pour les administrateurs."
        ],
        "prompt": "Clean modern office environment with digital screens showcasing user growth analytics charts, sleek aesthetic, high-tech administrative platform.",
        "notes": "L'objectif d'E-Citizen est d'offrir un point d'accès unifié pour le citoyen tout en automatisant la distribution des plaintes vers les ministères compétents. Notre MVP jette les bases d'un système hautement scalable."
    },
    # 3. Curriculum Validation
    {
        "title": "03. Alignement Pédagogique (Filière ID)",
        "bg_type": "light",
        "points": [
            "Modélisation BDD (M231/M232) : Implémentation des formes normales relationnelles.",
            "Machine Learning (M235) : Entraînement et déploiement d'un réseau récurrent LSTM.",
            "Cloud Computing (M241) & Sécurité (M243) : Orchestration multi-fournisseurs et durcissement des endpoints."
        ],
        "prompt": "A structured concept map connecting data symbols, neural networks, and cloud database icons, clean look, high contrast university presentation format.",
        "notes": "Comme l'exige notre programme d'Ingénierie des Données, ce projet n'est pas une simple application web. Il valide concrètement nos modules de gestion de bases de données avancées, de droit du numérique et d'ingénierie ML."
    },
    # 4. Problem Statement
    {
        "title": "04. Problématique et Limites des Systèmes Actuels",
        "bg_type": "dark",
        "points": [
            "Fragmentation technique : Absence d'API normalisées entre les départements ministériels.",
            "Rupture de charge : Traitement manuel des fichiers joints entraînant des goulots d'étranglement.",
            "Vulnérabilité des données : Risques élevés de fuites d'identifiants et de falsification des scans de CIN."
        ],
        "prompt": "Abstract visual representation of data silos, disconnected server racks with glowing red warnings, complex dark digital architecture.",
        "notes": "Aujourd'hui, l'absence de protocoles d'échanges automatisés ralentit l'action publique. De plus, le stockage non sécurisé des pièces jointes citoyennes pose des risques majeurs en matière de confidentialité."
    },
    # 5. System Architecture Overview
    {
        "title": "05. Architecture Système Globale",
        "bg_type": "light",
        "points": [
            "Pattern d'implémentation : Conception Backend-For-Frontend (BFF).",
            "Objectif du découplage : Isoler l'interface utilisateur de la logique d'analyse lourde.",
            "Avantage opérationnel : Indépendance des cycles de déploiement et atténuation des pannes en cascade."
        ],
        "prompt": "Clear microservices architecture diagram showing a user device hitting a gateway which splits traffic to different specialized backend servers, flat vector design.",
        "notes": "Pour découpler la présentation de notre logique d'affaires, nous avons adopté l'architecture BFF. Next.js orchestre l'expérience utilisateur à la périphérie, tandis que FastAPI traite les flux de données métiers."
    },
    # 6. Frontend Presentation Edge
    {
        "title": "06. Couche Présentation : Next.js & Vercel",
        "bg_type": "light",
        "points": [
            "Framework : Next.js 14 tirant parti du Server-Side Rendering (SSR) pour l'affichage dynamique.",
            "Hébergement : Infrastructure Vercel Edge globale.",
            "Performance : Optimisation du Time-To-First-Byte (TTFB) sous la barre des 50ms au Maroc."
        ],
        "prompt": "Sleek and minimalist user interface mockup displayed on a modern monitor, glowing light accents, fast loading speed visualization.",
        "notes": "Le choix de Next.js sur Vercel garantit que même avec des connexions mobiles limitées, le citoyen accède instantanément au formulaire. Les pages de suivi sont pré-rendues côté serveur pour soulager notre backend."
    },
    # 7. Backend Runtime
    {
        "title": "07. Couche Métier : FastAPI & Hugging Face",
        "bg_type": "light",
        "points": [
            "Framework API : FastAPI (Python 3.10) sélectionné pour son asynchronisme natif.",
            "Conteneurisation : Image Docker ultra-légère basée sur 'python:3.10-slim'.",
            "Runtime ML : Co-localisation du code métier et du framework d'inférence TensorFlow Keras."
        ],
        "prompt": "A clean lines illustration of a Docker container floating above a high-speed green circuit board, python language typography background.",
        "notes": "Notre API tourne sous FastAPI. L'avantage majeur est sa rapidité d'exécution et sa documentation automatique via OpenAPI. Nous l'hébergeons dans un conteneur Docker optimisé sur Hugging Face Spaces."
    },
    # 8. Database Architecture Overview
    {
        "title": "08. Architecture de la Persistance Relationnelle",
        "bg_type": "dark",
        "points": [
            "Moteur choisi : MySQL 8.0 hébergé sur le cloud managé Aiven.",
            "Sécurité réseau : Connexions chiffrées obligatoires via TLS/SSL.",
            "Philosophie Data : Utilisation de requêtes paramétrées SQL pures pour interdire les attaques par injection."
        ],
        "prompt": "Glow blue relational database icon with visible links between table cells, high security data vault aesthetic, deep navy blue background.",
        "notes": "La couche persistance repose sur un cluster MySQL managé. L'intégralité des transactions est protégée par chiffrement de bout en bout, et chaque interaction avec la base de données évite l'utilisation d'ORMs lourds."
    },
    # 9. Normalization Strategy: Phase 1
    {
        "title": "09. Stratégie de Normalisation : Le MVP Déployé",
        "bg_type": "light",
        "points": [
            "Structure actuelle : Modèle physique consolidé à 3 tables opérationnelles.",
            "Justification technique : Volonté de maximiser la vitesse d'écriture brute lors de l'ingestion massive.",
            "Dette technique identifiée : Présence de redondances contrôlées sur les données citoyennes (CIN, Téléphone)."
        ],
        "prompt": "Data engineer whiteboard showing a simple database schema with three main tables interconnected, notes and performance metrics scribbled in the margins.",
        "notes": "Pour notre prototype de Phase 1, nous avons opté pour un schéma concentré autour de trois tables principales. Ce choix stratégique a permis d'accélérer le développement et de valider immédiatement les flux d'écriture."
    },
    # 10. Normalization Strategy: Phase 2 Target
    {
        "title": "10. Architecture Cible : Modélisation 3NF",
        "bg_type": "light",
        "points": [
            "Évolution : Schéma conceptuel normalisé étendu à 9 tables distinctes.",
            "Respect des Formes Normales : Passage strict en 3NF (Troisième Forme Normale).",
            "Bénéfice : Isolation complète de l'entité 'citizens' pour éradiquer les anomalies de mise à jour."
        ],
        "prompt": "Highly complex and clean entity-relationship diagram, perfectly organized relational lines, corporate database modeling software output.",
        "notes": "Pour la mise à l'échelle nationale, nous avons déjà modélisé l'architecture cible en 3e Forme Normale. L'entité citoyen y est totalement isolée, garantissant une intégrité parfaite sans duplication d'identité."
    },
    # 11. Caching Strategy
    {
        "title": "11. Couche de Cache et Limitation : Upstash Redis",
        "bg_type": "light",
        "points": [
            "Technologie : Redis Serverless à très faible latence.",
            "Cas d'usage principal : Mécanisme de Rate-Limiting applicatif (limitation des requêtes par IP).",
            "Protection : Blocage préventif des scripts malveillants tentant de saturer l'API de soumission."
        ],
        "prompt": "A glowing red shield stopping rapid incoming data packets, sleek minimalist high-speed buffer visualization, cybersecurity network concept.",
        "notes": "Afin de protéger notre API contre les attaques par déni de service, nous avons interposé un cache Redis via Upstash. Il gère un limiteur de débit dynamique qui bloque instantanément les comportements automatisés."
    },
    # 12. Object Storage Architecture
    {
        "title": "12. Stockage des Documents Sensibles",
        "bg_type": "light",
        "points": [
            "Infrastructure : Supabase Object Storage.",
            "Gestion des payloads : Abandon des encodages lourds en Base64 pour optimiser la bande passante.",
            "Performance : Réduction immédiate de 33% du poids des requêtes HTTP transitant vers le serveur."
        ],
        "prompt": "Digital storage locker boxes illuminated with cyan lights, file folders floating inside a secure cloud infrastructure layout.",
        "notes": "Le transport des scans de cartes d'identité ne se fait plus par payloads JSON lourds. Nous utilisons désormais le stockage d'objets de Supabase, ce qui allège drastiquement les paquets réseau circulant sur l'internet public."
    },
    # 13. AI Module Introduction
    {
        "title": "13. Le Module IA REMAKA (REMAKA-SGOP-1M)",
        "bg_type": "dark",
        "points": [
            "Mission : Générer des clés de sécurité à haute mémorisabilité mais robustes face aux attaques.",
            "Approche algorithmique : Apprentissage profond de la distribution statistique des caractères.",
            "Volume de paramètres : Modèle compact de 1,6 million de paramètres, idéal pour l'inférence en conteneur."
        ],
        "prompt": "An abstract neural network transforming a line of text letters into a solid metallic security key, cybernetic brain matrix background, dark ambiance.",
        "notes": "Le module REMAKA aborde la sécurité d'authentification sous un angle innovant : utiliser un réseau profond pour générer des mots de passe qui respectent les structures linguistiques humaines tout en restant complexes."
    },
    # 14. Neural Network Topology
    {
        "title": "14. Topologie du Réseau de Neurones",
        "bg_type": "light",
        "points": [
            "Couche d'entrée : Fenêtre temporelle glissante (15 caractères) sur un vocabulaire unique de 77 tokens.",
            "Corps du réseau : Couches LSTM empilées (256 unités avec return_sequences puis 128 unités).",
            "Régularisation : Couche de Dropout fixée à 0.2 pour contrer le risque de surapprentissage (overfitting)."
        ],
        "prompt": "Deep learning architecture blueprint, showing sequence nodes passing through memory gates (LSTM), clean flow diagram, technical artificial intelligence documentation.",
        "notes": "D'un point de vue topologique, le modèle traite des fenêtres glissantes de 15 caractères. Il s'appuie sur deux couches de cellules à mémoire à long et court terme, ou LSTM, pour capter les dépendances temporelles distantes."
    },
    # 15. Mathematical Framework
    {
        "title": "15. Cadre Mathématique et Échantillonnage",
        "bg_type": "light",
        "points": [
            "Distribution probabiliste : Calcul final via l'activation de la fonction Softmax.",
            "Contrôle de la diversité : Introduction du facteur de température stochastique $T = 0.4$.",
            "Équation de mise à l'échelle des logits pour la sélection du caractère suivant :"
        ],
        "formula_1": "$$P(y_t = c_i \\mid \\dots) = \\frac{e^{z_i / T}}{\\sum_j e^{z_j / T}}$$",
        "prompt": "Mathematical equations glowing on a dark glass board, mathematical precision, clean typography, scientific research style.",
        "notes": "Pour contrôler l'originalité du générateur, nous appliquons une température sur la couche Softmax. Une valeur basse de 0.4 garantit que le modèle ne diverge pas et conserve la structure lexicale apprise."
    },
    # 16. AI Engineering Critique
    {
        "title": "16. Analyse Critique d'Ingénierie ML",
        "bg_type": "light",
        "points": [
            "Constat d'évaluation : Le réseau LSTM reproduit fidèlement la structure déterministe cible.",
            "Pénalité logicielle : L'inférence autoregressive induit une latence de 1 à 2 secondes par requête.",
            "Arbitrage d'architecture : Recommandation d'un déclassement vers un algorithme procédural basé sur l'entropie."
        ],
        "prompt": "A balance scale comparing a complex brain icon with a lightning-fast light bulb icon, engineering trade-off comparison design.",
        "notes": "En tant qu'ingénieurs des données, nous devons être critiques envers nos modèles. Le LSTM est mathématiquement élégant mais lourd en production. Pour la mise à l'échelle, un générateur procédural classique est plus efficace."
    },
    # 17. Shannon Entropy Benchmark
    {
        "title": "17. Alternative Cryptographique et Entropie",
        "bg_type": "light",
        "points": [
            "Indicateur de force mathématique : Calcul de l'Entropie de Shannon.",
            "Formule de l'entropie théorique d'une distribution de probabilités :"
        ],
        "formula_1": "$$H = -\\sum_{x} p(x) \\log_2 p(x)$$",
        "points_2": [
            "Standard de production : Utilisation du module sécurisé 'secrets' de Python (CSPRNG).",
            "Bénéfice : Exécution instantanée à l'échelle de la microseconde avec une entropie maximale garantie."
        ],
        "prompt": "Abstract representation of chaos transforming into clean ordered structure, mathematical symbol background, elegant slate grey palette.",
        "notes": "L'alternative de production repose sur l'évaluation de la force par l'entropie de Shannon. Couplée à un générateur pseudo-aléatoire cryptographiquement sûr, elle élimine le besoin de charger de lourds poids de modèles en mémoire."
    },
    # 18. Message Brokers Evaluation
    {
        "title": "18. Étude de Cas Data : L'Alternative Apache Kafka",
        "bg_type": "dark",
        "points": [
            "Contexte d'évaluation : Analyse de l'opportunité d'intégrer un bus d'événements à haut débit.",
            "Forces théoriques de Kafka : Commit-log distribué immuable, idéal pour l'intégration inter-ministérielle.",
            "Verdict technique : Non recommandé pour le MVP actuel (Complexité DevOps lourde du protocole KRaft)."
        ],
        "prompt": "An intense train track switching yard viewed from above, perfectly organized paths, complex logistics network visualization, dark industrial theme.",
        "notes": "Nous avons analysé l'opportunité d'intégrer Apache Kafka pour la communication inter-ministérielle. Cependant, la maintenance d'un cluster Kafka pour moins de 100 000 requêtes par jour représenterait une sur-ingénierie manifeste."
    },
    # 19. Async Task Architecture
    {
        "title": "19. Architecture de Traitement Asynchrone Cible",
        "bg_type": "light",
        "points": [
            "Alternative retenue : Le couple hautement agile Redis et Celery.",
            "Objectif : Éviter les coupures de requêtes (Timeouts) sur l'infrastructure serverless Vercel.",
            "Fonctionnement : Réponse instantanée '202 Accepted' au citoyen, déchargement des tâches lourdes en tâche de fond."
        ],
        "prompt": "A digital clock representation showing background gears processing tasks smoothly while the main clock face remains uncluttered, clean UI aesthetic.",
        "notes": "Pour sécuriser notre flux, l'architecture cible bascule sur un mode asynchrone via Celery. Dès que le citoyen soumet sa plainte, l'API répond immédiatement, et la génération de PDF ou l'envoi d'e-mails se font en arrière-plan."
    },
    # 20. Cybersecurity Audit
    {
        "title": "20. Audit de Cybersécurité : Durcissement IDOR/BOLA",
        "bg_type": "light",
        "color_override": "red",
        "points": [
            "Faille détectée : Possibilité de scruter les dossiers d'autres citoyens en manipulant l'URL de suivi.",
            "Gravité : Critique (Risque d'aspiration complète de la base de données par script itératif).",
            "Remédiation appliquée : Validation stricte de la session utilisateur côté serveur et contrôle d'autorisation."
        ],
        "prompt": "A broken padlock being repaired by a neon green security laser beam, cybersecurity defense visualization, sharp focus graphic.",
        "notes": "La faille la plus critique identifiée était un risque d'accès non autorisé aux plaintes via la route de suivi. Nous l'avons corrigée en introduisant un contrôle strict d'autorisation : impossible de lire une plainte sans être le propriétaire connecté."
    },
    # 21. Data Protection Law Compliance
    {
        "title": "21. Conformité Légale : Loi 09-08 & CNDP",
        "bg_type": "light",
        "points": [
            "Exigence Nationale : Protection absolue des Données à Caractère Personnel (PII).",
            "Durcissement du Stockage : Les pièces jointes sensibles sont migrées en mode Privé strict.",
            "Mécanisme d'accès : Génération exclusive d'URLs signées temporaires à validité éphémère (5 minutes)."
        ],
        "prompt": "Official legal scales of justice combined with binary data tracks, high authority institutional visual, professional green accents.",
        "notes": "Le respect du droit du numérique est obligatoire pour un portail étatique. Conformément à la loi 09-08 de la CNDP, nous avons verrouillé l'accès aux documents. Aucun scan de carte d'identité n'est accessible publiquement sans un jeton signé temporaire."
    },
    # 22. Secure Persistence Artifacts
    {
        "title": "22. Sécurisation de la Persistance des Artefacts ML",
        "bg_type": "light",
        "points": [
            "Vulnérabilité majeure : L'usage des fichiers Python 'Pickle' expose à des attaques par injection de code.",
            "Mesure de sécurité : Bannissement total de la méthode 'pickle.load()' dans notre backend de production.",
            "Remplacement : Migration vers des fichiers déclaratifs JSON et transition planifiée du modèle vers le format ONNX."
        ],
        "prompt": "A shield blocking a cyber injection syringe aimed at a digital model file core, security enforcement concept art.",
        "notes": "Le format Pickle est connu pour sa vulnérabilité face aux exécutions de codes arbitraires lors de la désérialisation. Nous l'avons proscrit de notre code de production au profit de fichiers de dictionnaires JSON sûrs."
    },
    # 23. Continuous Integration & Deployment (CI/CD)
    {
        "title": "23. Automatisation DevOps : Pipeline CI/CD",
        "bg_type": "light",
        "points": [
            "Orchestrateur : Outil GitHub Actions déclenché automatiquement à chaque 'git push'.",
            "Gestion des fichiers volumineux : Intégration fine des protocoles Git LFS et Git Xet de Hugging Face.",
            "Bénéfice : Synchronisation et déploiement continu du conteneur FastAPI sans aucune friction manuelle."
        ],
        "prompt": "A modern automated assembly line inside a digital server environment, endless loop pipeline glowing with cyan light, devops automation look.",
        "notes": "Pour le volet Génie Logiciel, notre chaîne CI/CD automatise la mise en production. Grâce au protocole Git Xet, le pipeline gère intelligemment les fichiers de poids de modèles lourds sans saturer notre historique Git classique."
    },
    # 24. Project Repository Structure
    {
        "title": "24. Topologie Réelle du Dépôt Source (Structure Projet)",
        "bg_type": "dark",
        "points": [
            "e_citizen_portal/",
            "├── frontend/              # Application Edge Next.js (Vercel)",
            "├── backend/               # API Asynchrone FastAPI (Hugging Face Spaces)",
            "│   ├── app/main.py        # Endpoints, Limiteurs de débit & Validations",
            "│   └── remaka/brain/      # Poids du modèle Keras & Vocabulaire JSON",
            "├── database/              # Modélisation Conceptuelle & Scripts SQL d'initialisation",
            "└── .github/workflows/    # Automatisation de Déploiement Continu (hf-sync.yml)"
        ],
        "prompt": "Clean developer code editor display showing a perfectly organized file tree structure, glowing folders, modern development tool environment.",
        "notes": "Voici l'arborescence réelle de notre code source. Le projet est clairement séparé en répertoires distincts pour le frontend, le backend hébergeant le cerveau de l'IA REMAKA, la modélisation de base de données et nos workflows CI/CD."
    },
    # 25. Conclusion & Roadmap
    {
        "title": "25. Conclusion et Perspectives Évolutives",
        "bg_type": "dark",
        "points": [
            "Bilan : Un MVP fonctionnel, hautement sécurisé et en adéquation complète avec les modules de notre DUT.",
            "Roadmap DevOps : Migration totale vers une infrastructure cloud souveraine et homogène (AWS Paris).",
            "Roadmap Data : Isolement complet des pipelines d'analyse OLAP pour protéger les performances transactionnelles OLTP."
        ],
        "prompt": "A beautiful sunrise over a futuristic smart city skyline with data tracks woven into the architecture, hopeful and professional horizon, high resolution presentation final slide.",
        "notes": "En conclusion, ce projet m'a permis d'appliquer concrètement l'ensemble des compétences acquises durant mon DUT. Les bases sont posées, et notre feuille de route trace une voie claire vers un déploiement industriel souverain. Je vous remercie pour votre attention et je suis ravi d'ouvrir la session de questions."
    }
]

# Génération dynamique des diapositives
for data in slides_data:
    # Choix du layout selon le type de slide
    if data == slides_data[0]:
        slide_layout = prs.slide_layouts[0] # Slide de titre
    else:
        slide_layout = prs.slide_layouts[1] # Slide de contenu
        
    slide = prs.slides.add_slide(slide_layout)
    
    # Appliquer le minuteur d'avancement automatique (7 secondes)
    apply_auto_advance(slide, ms=7000)
    
    # Appliquer la couleur d'arrière-plan thématique
    if data["bg_type"] == "dark":
        set_slide_background(slide, COLOR_PRIMARY_DARK)
        text_color = COLOR_TEXT_LIGHT
    else:
        set_slide_background(slide, COLOR_PRIMARY_LIGHT)
        text_color = COLOR_TEXT_DARK
        
    # Injecter et styliser le titre
    if hasattr(slide, "shapes") and slide.shapes.title:
        slide.shapes.title.text = data["title"]
        slide.shapes.title.text_frame.paragraphs[0].font.name = 'Arial'
        slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(36)
        slide.shapes.title.text_frame.paragraphs[0].font.bold = True
        slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = COLOR_TEXT_LIGHT if data["bg_type"] == "dark" else COLOR_PRIMARY_DARK

    # Récupérer ou créer la zone de texte pour le contenu
    if len(slide.placeholders) > 1:
        body_shape = slide.placeholders[1]
        tf = body_shape.text_frame
        tf.clear()
        
        # Traitement des points textuels
        if "points" in data:
            for i, point in enumerate(data["points"]):
                p = tf.add_paragraph() if i > 0 else tf.paragraphs[0]
                p.text = "• " + point
                p.font.name = 'Calibri'
                p.font.size = Pt(20)
                p.font.color.rgb = text_color
                p.space_after = Pt(14)
                
        # Injection des équations mathématiques (Formules LaTeX complexes)
        if "formula_1" in data:
            p_form = tf.add_paragraph()
            p_form.text = data["formula_1"]
            p_form.font.name = 'Courier New'
            p_form.font.size = Pt(24)
            p_form.font.bold = True
            p_form.font.color.rgb = COLOR_ACCENT_TEAL
            p_form.alignment = PP_ALIGN.CENTER
            p_form.space_after = Pt(14)
            
        if "points_2" in data:
            for point in data["points_2"]:
                p = tf.add_paragraph()
                p.text = "• " + point
                p.font.name = 'Calibri'
                p.font.size = Pt(20)
                p.font.color.rgb = text_color
                p.space_after = Pt(14)

    # Insertion des prompts d'images IA et des notes orales dans la section "Notes du présentateur"
    notes_slide = slide.notes_slide
    text_frame = notes_slide.notes_text_frame
    
    full_notes_content = (
        f"--- AI BACKGROUND IMAGE GENERATION PROMPT ---\n"
        f"Prompt: {data['prompt']}\n\n"
        f"--- ORAL PRESENTATION NOTES (SCRIPT FOR DEFENSE) ---\n"
        f"{data['notes']}"
    )
    text_frame.text = full_notes_content

# Sauvegarde et écriture finale du fichier de présentation
output_filename = "Soutenance_DUT_DataEngineering_E-Citizen.pptx"
prs.save(output_filename)

print(f"=========================================================================")
print(f" SUCCÈS : Présentation officielle de 25 diapositives générée avec succès !")
print(f" Fichier : {output_filename}")
print(f" Propriété : Minuteur automatique configuré à 7 secondes par diapositive.")
print(f"=========================================================================")