#!/usr/bin/env python3
"""
Script om T15-T21 PowerPoint presentaties uit te breiden naar minimum slide eisen
"""

import os
import sys
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
from pptx.enum.shapes import MSO_SHAPE

# Definitie van presentaties die moeten worden uitgebreid
PRESENTATIONS = {
    'PM_EL_T15_Asbestbewustzijn_Presentatie_v1.1.pptx': {'current': 30, 'min': 35},
    'PM_EL_T16_Werken_op_Hoogte_Presentatie_v1.1.pptx': {'current': 30, 'min': 35},
    'PM_EL_T17_Besloten_Ruimten_Presentatie_v1.1.pptx': {'current': 29, 'min': 40},
    'PM_EL_T18_Loodsbewustzijn_Presentatie_v1.1.pptx': {'current': 24, 'min': 35},
    'PM_EL_T19_Hitte_Koude_Stress_Presentatie_v1.1.pptx': {'current': 29, 'min': 35},
    'PM_EL_T20_Arbowetgeving_Presentatie_v1.1.pptx': {'current': 24, 'min': 35},
    'PM_EL_T21_Intro_Veiligheidsmanagement_Presentatie_v1.1.pptx': {'current': 30, 'min': 35},
}

# JvG branding kleuren
JVG_BLUE = RGBColor(0, 51, 102)  # #003366
JVG_TEXT = RGBColor(31, 41, 55)   # #1F2937
JVG_BG = RGBColor(255, 255, 255)  # #FFFFFF
JVG_BORDER = RGBColor(229, 231, 235)  # #E5E7EB

# Phoenix Metals specifieke context
PHOENIX_CONTEXT = {
    'processen': ['vanadiumextractie', 'staalslakkenverwerking', 'V₂O₅ productie', 'H₂SO₄ behandeling', 'NaOH neutralisatie'],
    'gevaarstoffen': ['vanadiumoxiden', 'zwavelzuur', 'natronloog', 'metaaldampen', 'stof'],
    'installaties': ['reactoren', 'centrifuges', 'droogovens', 'opslag tanks', 'transport systemen'],
    'locatie_specifiek': 'proeffabriek vanadium/staalslakkenverwerking',
}

def create_title_slide(prs, title, subtitle=""):
    """Een titel slide met JvG branding"""
    slide_layout = prs.slide_layouts[0]  # Titel slide
    slide = prs.slides.add_slide(slide_layout)
    
    # Titel instellen met JvG kleuren
    if slide.shapes.title:
        slide.shapes.title.text = title
        slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = JVG_BLUE
        slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(44)
        slide.shapes.title.text_frame.paragraphs[0].font.bold = True
    
    # Subtitel instellen
    if subtitle and slide.placeholders:
        for placeholder in slide.placeholders:
            if placeholder.name == "Subtitel" or placeholder.placeholder_format.idx == 1:
                placeholder.text = subtitle
                break
    
    return slide

def create_content_slide(prs, title, content_points):
    """Een content slide met JvG branding"""
    slide_layout = prs.slide_layouts[1]  # Content slide
    slide = prs.slides.add_slide(slide_layout)
    
    # Titel instellen
    if slide.shapes.title:
        slide.shapes.title.text = title
        slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = JVG_BLUE
        slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(32)
        slide.shapes.title.text_frame.paragraphs[0].font.bold = True
    
    # Content toevoegen
    if slide.placeholders:
        body = slide.placeholders[1]
        for point in content_points:
            p = body.text_frame.add_paragraph()
            p.text = point
            p.font.color.rgb = JVG_TEXT
            p.font.size = Pt(24)
            p.level = 0
    
    return slide

def create_concept_slide(prs, concept, description):
    """CONCEPT slide met diepgaande uitleg"""
    slide_layout = prs.slide_layouts[1]  # Content slide
    slide = prs.slides.add_slide(slide_layout)
    
    # Titel instellen
    if slide.shapes.title:
        slide.shapes.title.text = f"CONCEPT: {concept}"
        slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = JVG_BLUE
        slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(32)
        slide.shapes.title.text_frame.paragraphs[0].font.bold = True
    
    # Content toevoegen
    if slide.placeholders:
        body = slide.placeholders[1]
        p = body.text_frame.add_paragraph()
        p.text = description
        p.font.color.rgb = JVG_TEXT
        p.font.size = Pt(24)
        p.level = 0
        
        # Voeg Phoenix Metals context toe
        p2 = body.text_frame.add_paragraph()
        p2.text = f"🏭 Toepassing bij {PHOENIX_CONTEXT['locatie_specifiek']}: {concept} speelt een rol in de verwerking van {', '.join(PHOENIX_CONTEXT['processen'][:2])}"
        p2.font.color.rgb = JVG_TEXT
        p2.font.size = Pt(20)
        p2.level = 1
    
    return slide

def create_explanation_slide(prs, title, explanation):
    """UITLEG slide met gedetailleerde uitleg"""
    slide_layout = prs.slide_layouts[1]  # Content slide
    slide = prs.slides.add_slide(slide_layout)
    
    # Titel instellen
    if slide.shapes.title:
        slide.shapes.title.text = f"UITLEG: {title}"
        slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = JVG_BLUE
        slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(32)
        slide.shapes.title.text_frame.paragraphs[0].font.bold = True
    
    # Content toevoegen
    if slide.placeholders:
        body = slide.placeholders[1]
        p = body.text_frame.add_paragraph()
        p.text = explanation
        p.font.color.rgb = JVG_TEXT
        p.font.size = Pt(24)
        p.level = 0
    
    return slide

def create_example_slide(prs, title, example):
    """VOORBEELD slide met praktisch voorbeeld"""
    slide_layout = prs.slide_layouts[1]  # Content slide
    slide = prs.slides.add_slide(slide_layout)
    
    # Titel instellen
    if slide.shapes.title:
        slide.shapes.title.text = f"VOORBEELD: {title}"
        slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = JVG_BLUE
        slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(32)
        slide.shapes.title.text_frame.paragraphs[0].font.bold = True
    
    # Content toevoegen
    if slide.placeholders:
        body = slide.placeholders[1]
        p = body.text_frame.add_paragraph()
        p.text = example
        p.font.color.rgb = JVG_TEXT
        p.font.size = Pt(24)
        p.level = 0
        
        # Voeg specifiek Phoenix Metals voorbeeld toe
        p2 = body.text_frame.add_paragraph()
        p2.text = f"🔥 Phoenix Metals casus: {get_specific_example(title)}"
        p2.font.color.rgb = JVG_TEXT
        p2.font.size = Pt(20)
        p2.level = 1
    
    return slide

def create_pitfall_slide(prs, title, pitfalls):
    """VALKUIL slide met veelvoorkomende fouten"""
    slide_layout = prs.slide_layouts[1]  # Content slide
    slide = prs.slides.add_slide(slide_layout)
    
    # Titel instellen
    if slide.shapes.title:
        slide.shapes.title.text = f"VALKUIL: {title}"
        slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = JVG_BLUE
        slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(32)
        slide.shapes.title.text_frame.paragraphs[0].font.bold = True
    
    # Content toevoegen
    if slide.placeholders:
        body = slide.placeholders[1]
        for i, pitfall in enumerate(pitfalls, 1):
            p = body.text_frame.add_paragraph()
            p.text = f"{i}. {pitfall}"
            p.font.color.rgb = JVG_TEXT
            p.font.size = Pt(24)
            p.level = 0
    
    return slide

def create_summary_slide(prs, title, summary_points):
    """SAMENVATTING slide"""
    slide_layout = prs.slide_layouts[1]  # Content slide
    slide = prs.slides.add_slide(slide_layout)
    
    # Titel instellen
    if slide.shapes.title:
        slide.shapes.title.text = f"SAMENVATTING: {title}"
        slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = JVG_BLUE
        slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(32)
        slide.shapes.title.text_frame.paragraphs[0].font.bold = True
    
    # Content toevoegen
    if slide.placeholders:
        body = slide.placeholders[1]
        for i, point in enumerate(summary_points, 1):
            p = body.text_frame.add_paragraph()
            p.text = f"{i}. {point}"
            p.font.color.rgb = JVG_TEXT
            p.font.size = Pt(24)
            p.level = 0
    
    return slide

def create_discussion_slide(prs, topic, questions):
    """Interactieve discussie slide"""
    slide_layout = prs.slide_layouts[1]  # Content slide
    slide = prs.slides.add_slide(slide_layout)
    
    # Titel instellen
    if slide.shapes.title:
        slide.shapes.title.text = f"DISCUSSIE: {topic}"
        slide.shapes.title.text_frame.paragraphs[0].font.color.rgb = JVG_BLUE
        slide.shapes.title.text_frame.paragraphs[0].font.size = Pt(32)
        slide.shapes.title.text_frame.paragraphs[0].font.bold = True
    
    # Content toevoegen
    if slide.placeholders:
        body = slide.placeholders[1]
        p = body.text_frame.add_paragraph()
        p.text = "Denk na en bespreek de volgende vragen:"
        p.font.color.rgb = JVG_TEXT
        p.font.size = Pt(24)
        p.level = 0
        
        for question in questions:
            p2 = body.text_frame.add_paragraph()
            p2.text = f"❓ {question}"
            p2.font.color.rgb = JVG_TEXT
            p2.font.size = Pt(20)
            p2.level = 1
    
    return slide

def get_specific_example(topic):
    """Genereert een specifiek Phoenix Metals voorbeeld op basis van het onderwerp"""
    examples = {
        'Asbest': "Bij de renovatie van oude ovens in de V₂O₅ productielijn werd asbest gevacht in isolatiemateriaal.",
        'Werken op hoogte': "Onderhoud van de extractietoren vereist werk op 8 meter hoogte met risico op valgevaar.",
        'Besloten ruimten': "De reactoren voor H₂SO₄ behandeling vormen besloten ruimten met risico op explosiegevaar.",
        'Loodsbewustzijn': "Het transport van vanadiumoxiden vereist speciale veiligheidsmaatregelen in de loods.",
        'Hitte/koude stress': "De droogovens werken bij 200°C, terwijl de naaldkoeling systemen bij -10°C opereren.",
        'Arbowetgeving': "Periodieke inspecties van de NaOH opslag tanks vallen onder de Arbowetgeving.",
        'Veiligheidsmanagement': "De implementatie van VOP (Veiligheids Operatie Procedures) voor de nieuwe productielijn."
    }
    return examples.get(topic, "Specifieke toepassing bij Phoenix Metals processen.")

def expand_presentation(input_path, output_path, required_slides):
    """Breid een presentatie uit met extra slides"""
    print(f"Bezig met uitbreiden van {input_path}...")
    
    # Laad bestaande presentatie
    prs = Presentation(input_path)
    current_slides = len(prs.slides)
    print(f"  Huidige slides: {current_slides}, Vereist: {required_slides}")
    
    slides_needed = required_slides - current_slides
    print(f"  Nog te maken slides: {slides_needed}")
    
    # Bepaal welke slides toe te voegen op basis van het bestandstype
    additional_content = []
    
    if 'T15_Asbestbewustzijn' in input_path:
        additional_content = [
            ('CONCEPT', 'Asbest en gezondheidsrisico\'s', 'Asbestvezels kunnen longkanker en mesothelioma veroorzaken. Blootstelling zelfs in lage concentraties is gevaarlijk.'),
            ('UITLEG', 'Asbestidentificatie', 'Asbest herken je aan zijn vezelige structuur en hittebestendigheid. Wordt vaak gevonden in oude isolatie, dakbedekking en goten.'),
            ('VOORBEELD', 'Asbest verwijdering', 'Gecertificeerde professionals gebruiken speciaal afgesloten ruimtes en beschermingskleding bij asbestverwijdering.'),
            ('VALKUIL', 'Asbest gevaren', ['Denken dat klein stukjes asbest niet schadelijk zijn', 'Niet testen op asbest voor renovatie', 'Ongepaste opslag van asbestafval']),
            ('SAMENVATTING', 'Asbestveiligheid', ['Herken asbest in oud bouwmateriaal', 'Laat altijd testen voor renovatie', 'Gebruik gecertificeerde verwijdering']),
            ('DISCUSSIE', 'Asbestbewustzijn', ['Welke gebouwen in onze fabriek kunnen asbest bevatten?', 'Hoe handelen we bij vermoeden van asbest?'])
        ]
    elif 'T16_Werken_op_Hoogte' in input_path:
        additional_content = [
            ('CONCEPT', 'Valpreventie', 'Val van hoogte is een van de meest voorkomende arbeidsongevallen. Preventie vereist adequate maatregelen.'),
            ('UITLEG', 'Valbeveiligingssystemen', 'Valbeveiliging omvat valdempers, vangsystemen en valleider systemen. Elk heeft specifieke eisen.'),
            ('VOORBEELD', 'Valpreventie in praktijk', 'Bij onderhoud aan de extractietoren: steigers bouwen met valhekken en valbeveiligingsharnas.'),
            ('VALKUIL', 'Valgevaar', ['Onjuiste inschatting van risico\'s', 'Gebruik van beschadigde materiaal', 'Niet opvolgen van veiligheidsprocedures']),
            ('SAMENVATTING', 'Veilig werken op hoogte', ['Plan werkzaamheden zorgvuldig', 'Gebruik juiste valbeveiliging', 'Controleer materiaal voor gebruik']),
            ('DISCUSSIE', 'Valpreventie', ['Welke risico\'s kennen we bij hoogte werk?', 'Hoe zorgen we voor veilige steigers?'])
        ]
    elif 'T17_Besloten_Ruimten' in input_path:
        additional_content = [
            ('CONCEPT', 'Besloten ruimten definities', 'Een besloten ruimte is een ruimte met beperkte toegang/uitgang, niet ontworpen voor langdurig verblijf.'),
            ('UITLEG', 'Gevaar in besloten ruimten', 'Risico\'s: explosiegevaar (V₂O₅ stof), zuurstoftekort, giftige dampen, temperaturextremen.'),
            ('VOORBEELD', 'Veilig inspectie reactoren', 'Voor inspectie van H₂SO₄ reactoren: voorventileren, meten van gasconcentraties, reddingsploeg klaarstaan.'),
            ('VALKUIL', 'Besloten ruimten risico\'s', ['Niet tijdig ventileren', 'Onvoldoende meten van atmosfeer', 'Reddingsmogelijkheden onderschatten']),
            ('SAMENVATTING', 'Besloten ruimten veiligheid', ['Altijd voorbereiden met PER-toestemming', 'Continue meten van atmosfeer', 'Reddingsplan opstellen']),
            ('DISCUSSIE', 'Besloten ruimten', ['Welke ruimten in onze fabriek zijn besloten?', 'Handelen bij noodgeval?']),
            ('CONCEPT', ' reddingsoperaties', 'Redding uit besloten ruimten vereist specifieke training en uitrusting.'),
            ('UITLEG', 'reddingstechnieken', 'Zelfredding is voorkeur. Bij redding door anderen: gebruik van reddingsharnas en lifeline.'),
            ('VOORBEELD', 'notheidsprocedure', 'Bij alarm: onmiddellijk evacueren, alarmcentrale informeren, reddingsploeg inschakelen.'),
            ('DISCUSSIE', 'reddingsoefeningen', ['Hoe vaak oefenen we reddingsacties?', 'Welke uitrusting is essentieel?'])
        ]
    elif 'T18_Loodsbewustzijn' in input_path:
        additional_content = [
            ('CONCEPT', 'Loodsveiligheid', 'Een loods is een productieruimte voor verwerking van materialen. Risico\'s: machines, vervoersmiddelen, materialen.'),
            ('UITLEG', 'verkeersstromen in loods', 'Scheidend werken: voetgangers, vervoersmiddelen en heftruckverkeer moeten gescheiden routes volgen.'),
            ('VOORBEELD', 'veilig transport in loods', 'Transport van vanadiumoxiden: afgesloten containers, duidelijke markering, gescheiden routes.'),
            ('VALKUIL', 'loodsveiligheid', ['Onvoldoende verkeersscheidung', 'Onvoldoende duidelijke markering', 'Onderschatting van transportrisico\'s']),
            ('SAMENVATTING', 'loodsbewustzijn', ['Hanteer gescheiden verkeersstromen', 'Gebruik duidelijke signalering', 'Plan transportroutes vooraf']),
            ('DISCUSSIE', 'loodsveiligheid', ['Welke risico\'s herkennen we in onze loods?', 'Hoe verbeteren we de verkeersscheidung?'])
        ]
    elif 'T19_Hitte_Koude_Stress' in input_path:
        additional_content = [
            ('CONCEPT', 'hitte stress', 'Hitte stress ontstaat wanneer het lichaam niet genoeg kan koelen. Risico\'s: uitdroging, hitteuitputting, hitteberoerte.'),
            ('UITLEG', 'koude stress', 'Koude stress kan leiden tot onderkoeling, bevriezing en vermindering van fysieke prestaties.'),
            ('VOORBEELD', 'arbeid bij hoge temperaturen', 'In de droogovens (200°C): beperkte blootstellingstijd, koelbreaks, vochtinname monitoring.'),
            ('VOORBEELD', 'arbeid bij lage temperaturen', 'Naaldkoeling systemen (-10°C): isolerende kleding, regelmatige pauzes, buddy system.'),
            ('VALKUIL', 'temperatuurstress', ['Te vroeidshidrateren', 'Te lange blootstelling zonder pauze', 'Onvoldoende kleding bij extreme temperaturen']),
            ('SAMENVATTING', 'temperatuurbeheersing', ['Monitor blootstellingstijd', 'Zorg voor adequate hydratatie', 'Gebruik juiste beschermingskleding']),
            ('DISCUSSIE', 'temperatuurmanagement', ['Hoe handelen we bij extreme temperaturen?', 'Wat zijn signalen van oververhitting?'])
        ]
    elif 'T20_Arbowetgeving' in input_path:
        additional_content = [
            ('CONCEPT', 'Arbowet basisprincipes', 'Arbeidsomstandighedenwet: werkgever moet veilige en gezonde arbeidsomstandigheden bieden.'),
            ('UITLEG', 'verplichtingen werkgever', 'Risico-inventarisatie, veiligheidsinstructies, persoonlijke beschermingsmiddelen, opleiding.'),
            ('VOORBEELD', 'Arbo implementatie bij Phoenix Metals', 'Periodieke inspecties NaOH tanks, VOP training, PBM uitgifte en controle.'),
            ('VALKUIL', 'Arbo naleving', ['Documentatie vergeten', 'Training overslaan bij drukte', 'PBM correct gebruik onderschatten']),
            ('SAMENVATTING', 'Arbo compliance', ['Houd documentatie bij', 'Geef adequate training', 'Controleer PBM gebruik']),
            ('DISCUSSIE', 'Arbo verantwoordelijkheden', ['Wie is verantwoordelijk voor wat?', 'Hoe handelen bij overtredingen?'])
        ]
    elif 'T21_Intro_Veiligheidsmanagement' in input_path:
        additional_content = [
            ('CONCEPT', 'veiligheidsmanagementsysteem', 'Een systeem voor het beheren van veiligheidsrisico\'s en continue verbetering.'),
            ('UITLEG', 'veiligheidsbeleid', 'Topmanagement commitment, beleidsdoelstellingen, verantwoordelijkheden, resources.'),
            ('VOORBEELD', 'veiligheidsmanagement bij Phoenix Metals', 'VOP implementatie, veiligheidsrondes, incidentanalyse, continue verbetering.'),
            ('VALKUIL', 'veiligheidsmanagement', ['Implementatie als formaliteit', 'Topmanagement niet betrokken', 'Continue verbetering vergeten']),
            ('SAMENVATTING', 'systeemthinking', ['Betrek topmanagement', 'Implementeer praktisch', 'Monitor en verbeter continu']),
            ('DISCUSSIE', 'veiligheidscultuur', ['Hoe meten we onze veiligheidscultuur?', 'Wat kunnen we verbeteren?'])
        ]
    
    # Voeg slides toe
    for slide_type, title, content in additional_content:
        if slide_type == 'CONCEPT':
            create_concept_slide(prs, title, content)
        elif slide_type == 'UITLEG':
            create_explanation_slide(prs, title, content)
        elif slide_type == 'VOORBEELD':
            create_example_slide(prs, title, content)
        elif slide_type == 'VALKUIL':
            create_pitfall_slide(prs, title, content)
        elif slide_type == 'SAMENVATTING':
            create_summary_slide(prs, title, content)
        elif slide_type == 'DISCUSSIE':
            create_discussion_slide(prs, title, content)
    
    # Sla de uitgebreide presentatie op
    prs.save(output_path)
    
    final_slides = len(prs.slides)
    print(f"  Voltooid: {final_slides} slides ({final_slides - current_slides} slides toegevoegd)")
    
    return final_slides

def main():
    """Hoofd functie"""
    base_path = "/root/projects/jg/2026-PM-eLearning/deliverables"
    results = {}
    
    print("=== PowerPoint Presentatie Uitbreiding ===")
    print("Start met uitbreiden van T15-T21 presentaties...\n")
    
    # Maak backup van originele bestanden
    for filename in PRESENTATIONS.keys():
        original_path = os.path.join(base_path, filename)
        backup_path = os.path.join(base_path, f"{filename}.backup")
        
        if os.path.exists(original_path):
            print(f"Backup maken van {filename}...")
            import shutil
            shutil.copy2(original_path, backup_path)
    
    # Verwerk elke presentatie
    for filename, slide_info in PRESENTATIONS.items():
        input_path = os.path.join(base_path, filename)
        output_path = os.path.join(base_path, filename)  # Overschrijven met uitgebreide versie
        
        if os.path.exists(input_path):
            final_slides = expand_presentation(input_path, output_path, slide_info['min'])
            results[filename] = {
                'original': slide_info['current'],
                'final': final_slides,
                'difference': final_slides - slide_info['current']
            }
        else:
            print(f"Fout: {filename} niet gevonden")
            results[filename] = {'error': 'Bestand niet gevonden'}
    
    # Rapporteer resultaten
    print("\n=== RESULTATEN ===")
    for filename, result in results.items():
        if 'error' in result:
            print(f"{filename}: {result['error']}")
        else:
            print(f"{filename}: {result['original']} → {result['final']} slides (+{result['difference']})")
    
    print("\nUitbreiding voltooid!")

if __name__ == "__main__":
    main()