#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Genereert T16 Werken op Hoogte e-learning - Phoenix Metals B.V."""
import os

OUTPUT = '/root/projects/jg/2026-PM-eLearning/deliverables/PM_EL_T16_Werken_op_Hoogte_eLearning_v1.1.html'
TITLE = "T16: Werken op Hoogte"
SUBTITLE = "Training Werken op Hoogte (TR-302-08)"
CERT_TRAINING = "T16: Werken op Hoogte (TR-302-08)"
CERT_TITLE = "Werken op Hoogte"

MODULES = [
    {"title": "Definitie werken op hoogte en NEN-EN 363", "paragraphs": ["Werken op hoogte wordt gedefinieerd als elke werkzaamheid waarbij er een valgevaar bestaat van meer dan 2,5 meter. Deze definitie is vastgelegd in de Arbowetgeving en de NEN-EN 363 norm voor persoonlijke valbeveiligingssystemen.", "De NEN-EN 363 is de Europese norm die de eisen beschrijft voor persoonlijke valbeveiligingssystemen. Deze norm definieert de verschillende typen systemen: valbeperkende systemen, werkpositie-systemen en redooppassystemen. Elk type heeft specifieke toepassingen en vereisten.", "Valgevaar bestaat niet alleen bij werkzaamheden boven de grond, maar ook bij werkzaamheden langs wanden, bij openingen in vloeren, bij randen van daken en bij werkzaamheden op of aan voertuigen en machines. Het gaat om elke situatie waarbij een val van hoogte mogelijk is.", "In de industriële omgeving van Phoenix Metals komt werken op hoogte regelmatig voor: bij onderhoud aan silo's, reactorvaten, leidingbruggen en hooggeplaatste leidingen. Deze werkzaamheden vereisen specifieke voorbereiding en beveiligingsmaatregelen.", "Het is belangrijk om te weten dat de 2,5 meter grens een wettelijke Drempelwaarde is. Ook bij werkzaamheden onder deze hoogte kan valbeveiliging vereist zijn wanneer de aard van het werk of de omstandigheden daarom vragen, bijvoorbeeld bij werk boven gevaarlijke stoffen of machines."], "fact": "Volgens de Arbeidsinspectie is vallen van hoogte een van de top 3 oorzaken van dodelijke arbeidsongevallen in Nederland. Jaarlijks gebeuren er ongeveer 20 dodelijke ongevallen door vallen van hoogte.", "practice": "Phoenix Metals registreert alle werkzaamheden op hoogte via een Permit-to-Work (PtW) systeem. Controleer altijd of er een geldig PtW is voordat u begint met werkzaamheden boven 2,5 meter.", "question": "Vanaf welke hoogte spreekt de Arbowetgeving van werken op hoogte met valgevaar?", "options": ["1,5 meter", "2,0 meter", "2,5 meter", "3,0 meter"], "correct": 2},
    {"title": "Risico's: vallen en vallende voorwerpen", "paragraphs": ["De twee belangrijkste risico's bij werken op hoogte zijn vallen van de medewerker zelf en het vallen van voorwerpen van hoogte. Beide risico's kunnen leiden tot ernstig letsel of overlijden en vereisen adequate beheersmaatregelen.", "Vallen van hoogte kan leiden tot fracturen, inwendig letsel, hoofdletsel en overlijden. De ernst van het letsel hangt af van de valhoogte, de landing surface (hard/zacht), de houding bij de landing en of er obstakels in de valbaan zitten. Zelfs een val van 2-3 meter op een harde ondergrond kan fataal zijn.", "Vallende voorwerpen (falling objects) vormen een risico voor medewerkers die zich onder de werkplek bevinden. Gereedschap, materiaal, bevestigingsmiddelen en afval kunnen van hoogte vallen en ernstig letsel veroorzaken. Ook kleine objecten kunnen bij een val vanaf grote hoogte dodelijk zijn.", "Op de Phoenix Metals locaties zijn specifieke risicosituaties: werkzaamheden aan leidingbruggen boven toegangswegen, onderhoud aan silodaken waar zich beneden medewerkers bevinden, en werkzaamheden aan reactorinstallaties waar hoogtemonitoring vereist is.", "Beheersmaatregelen voor vallende voorwerpen omvatten: gereedschagsluitingen, afzettingen onder de werkplek, netten om vallende objecten op te vangen, en het verbieden van loose tools boven werkplekken zonder beveiliging."], "fact": "Een moersleutel van 200 gram die valt van 30 meter hoogte bereikt een impactsnelheid van ca. 90 km/u en oefent een impactkracht uit die vergelijkbaar is met een kogelinslag.", "practice": "Bij Phoenix Metals geldt: gereedschap dat op hoogte wordt gebruikt MOET zijn voorzien van een valbeveiligingskoord. Lose onderdelen moeten in afgesloten containers worden vervoerd. Onder het werkgebied moet een afzetting worden geplaatst.", "question": "Welke twee hoofdrisico's zijn er bij werken op hoogte?", "options": ["Elektriciteit en lawaai", "Vallen en vallende voorwerpen", "Chemische blootstelling en hitte", "Brand en explosie"], "correct": 1},
    {"title": "Hiërarchie van maatregelen: collectief naar individueel", "paragraphs": ["De Arbowetgeving hanteert een hiërarchie van maatregelen (STOP-principe) voor het beheersen van valrisico's. Deze hiërarchie bepaalt de volgorde waarin maatregelen moeten worden overwogen, van meest effectief naar minst effectief.", "Stap 1 - Substitutie/Eliminatie: Kan het werk op hoogte worden vermeden? Kan het werk op de grond worden uitgevoerd? Is het mogelijk om componenten op te tillen naar de werkplek in plaats van de medewerker naar de hoogte te brengen? Eliminatie is altijd de voorkeursmaatregel.", "Stap 2 - Technische maatregelen (collectieve beveiliging): Als werken op hoogte onvermijdelijk is, worden collectieve beveiligingsmaatregelen getroffen. Denk aan: randbeveiliging, hekwerken, valnetten, steigers met leuningen en veiligheidsplatforms. Collectieve maatregelen beschermen alle medewerkers tegelijk.", "Stap 3 - Organisatorische maatregelen: Als collectieve maatregelen niet (volledig) mogelijk zijn, worden organisatorische maatregelen genomen. Dit omvat: procedures voor veilig werken, werkvergunningen (PtW), taakrisicoanalyses (TRA) en buddy-systemen.", "Stap 4 - Persoonlijke beschermingsmiddelen (individueel): Pas als alle bovenstaande maatregelen onvoldoende zijn, wordt gebruik gemaakt van persoonlijke valbeveiliging (PVH). Dit is de laatste optie omdat het de medewerker afhankelijk maakt van correct gebruik, juiste uitrusting en adequate training."], "fact": "Collectieve veiligheidsmaatregelen hebben altijd voorrang op individuele maatregelen. Dit principe is vastgelegd in de Arbowet artikel 5: de werkgever kiest bij voorkeur collectieve beschermingsmaatregelen boven individuele.", "practice": "Phoenix Metals hanteert de STOP-hiërarchie in alle TRA's (Task Risk Analyses). Bij elke taak op hoogte wordt eerst geëvalueerd of collectieve beveiliging mogelijk is voordat wordt overgegaan tot persoonlijke valbeveiliging.", "question": "Wat is de VOLGORDE van de STOP-hiërarchie voor valrisico's?", "options": ["Individueel, collectief, organisatorisch, eliminatie", "Eliminatie, collectief, organisatorisch, individueel (PBM)", "Collectief, eliminatie, individueel, organisatorisch", "Organisatorisch, technisch, substitutie, PBM"], "correct": 1},
    {"title": "Valbeveiligingssystemen volgens NEN-EN 363", "paragraphs": ["Persoonlijke valbeveiligingssystemen (PVH) zijn ontworpen om een val te stoppen of te beperken en de krachten op het lichaam te reduceren tot een acceptabel niveau. De NEN-EN 363 norm classificeert deze systemen in drie hoofdcategorieën.", "Type A - Valbeperkingssystemen (restraint systems): Deze systemen voorkomen dat de medewerker een positie bereikt waar valgevaar bestaat. De lanyard is zo kort dat de medewerker fysiek niet bij de rand kan komen. Dit is de veiligste vorm van persoonlijke valbeveiliging.", "Type B - Werkpositie-systemen (work positioning): Deze systemen ondersteunen de medewerker in een specifieke werkpositie op hoogte, bijvoorbeeld bij werk aan palen of masten. Het systeem houdt de medewerker op zijn plaats maar is niet primair bedoeld als valbeveiliging. Een additioneel valbeveiligingssysteem is vereist.", "Type C - Redo-systemen (fall arrest systems): Deze systemen vangen de medewerker op tijdens een val. Ze bestaan uit een ankerpunt, een connectiemiddel (met energy absorber) en een full-body harness. De energy absorber zorgt ervoor dat de valkracht wordt beperkt tot maximaal 6 kN.", "Elk valbeveiligingssysteem moet regelmatig worden geïnspecteerd (voor elk gebruik visueel en jaarlijks door een bevoegd persoon). Defecte of twijfelachtige uitrusting moet direct uit gebruik worden genomen en vervangen."], "fact": "Bij een val van 3 meter zonder energy absorber bedraagt de kracht op het lichaam meer dan 15 kN (ca. 1.500 kg). Met een energy absorber wordt dit beperkt tot maximaal 6 kN (ca. 600 kg).", "practice": "Phoenix Metals beschikt over een logboek voor alle valbeveiligingsmiddelen. Elke harness en lanyard heeft een uniek nummer en wordt jaarlijks gekeurd. Controleer altijd het keuringslabel voordat u de uitrusting gebruikt.", "question": "Welk type valbeveiligingssysteem VOORKOMT dat u bij de rand kunt komen?", "options": ["Redosysteem (Type C)", "Valbeperkingssysteem (Type A)", "Werkpositie-systeem (Type B)", "Geen van bovenstaande"], "correct": 1},
    {"title": "Ladder- en regelwerk: maximaal 9 meter, 75 graden", "paragraphs": ["Ladders en regelwerk behoren tot de meest gebruikte hulpmiddelen voor werkzaamheden op hoogte. Het Arbobesluit stelt specifieke eisen aan het gebruik ervan om valrisico's te beheersen.", "De maximale werkhoogte met een losse ladder bedraagt 9 meter. Boven deze hoogte is een veiliger alternatief vereist, zoals een steiger, hoogwerker of vast trapportaal. Voor kortdurend, licht werk mag een ladder worden gebruikt; voor langdurig of zwaar werk is een steiger of platform verplicht.", "De opstellingshoek van een ladder moet tussen 65 en 75 graden bedragen, met een optimale hoek van 68-75 graden. Een simpele regel: de afstand van de voet van de ladder tot de wand moet ongeveer 1/4 van de gebruiksliengte bedragen. Bij 75 graden is de voetafstand 1/4 van de hoogte.", "Een ladder moet minimaal 1 meter boven de uittreedplaats uitsteken en moet altijd worden vastgezet tegen verschuiven. Zowel de onderkant (anti-slipvoeten) als de bovenkant (haakjes of bindriem) moeten zijn beveiligd. Free-standing ladders zijn verboden boven 2,5 meter.", "Bij Phoenix Metals worden ladders gebruikt voor inspectiewerkzaamheden en licht onderhoud. Voor zwaarder werk aan leidingbruggen, silo's en reactorvaten worden steigers of hoogwerkers ingezet. Elke ladder-activiteit vereist een TRA."], "fact": "Ongeveer 30% van alle valongelukken op de werkplek in Nederland is gerelateerd aan het gebruik van ladders en trappen. De meeste ongevallen worden veroorzaakt door verkeerde opstelling, geen beveiliging of overbelasting.", "practice": "Phoenix Metals heeft een ladderinspectieprogramma: alle ladders zijn voorzien van een keuringslabel met datum. Beschadigde ladders worden direct vervangen. Gebruik NOOIT een zelfgemaakte of gerepareerde ladder.", "question": "Wat is de maximale werkhoogte bij gebruik van een losse ladder volgens het Arbobesluit?", "options": ["5 meter", "7 meter", "9 meter", "12 meter"], "correct": 2},
    {"title": "Steigers: veilig gebruik en eisen", "paragraphs": ["Steigers zijn een van de veiligste middelen voor werken op hoogte, mits correct opgebouwd en gebruikt. Er gelden strenge eisen aan de constructie, de opbouw en het gebruik van steigers in de Arbowetgeving en de NEN-EN 12811 norm.", "Een veilige steiger voldoet aan de volgende minimumeisen: werkvloer breedte minimaal 60 cm, leuningen op 1 meter en 0,5 meter hoogte, kantplank van minimaal 15 cm, stabiele ondergrond en horizontale werkvloer. Alle steigeronderdelen moeten onbeschadigd en correct gemonteerd zijn.", "Steigers mogen uitsluitend worden opgebouwd door bevoegde personen die in het bezit zijn van een certificaat steigerbouw (zoals VCA-steigerbouw). Na oplevering moet de steiger worden gekeurd en voorzien van een steigerlabel (groen label = goedgekeurd, rood label = niet goedgekeurd/niet klaar).", "Tijdens het gebruik van steigers gelden de volgende regels: niet meer belasten dan het toegestane gewicht, geen materialen opslaan op de steiger, niet springen op de steiger, de steiger niet aanpassen zonder toestemming, en bij vorst of gladheid extra voorzichtigheid betrachten.", "Phoenix Metals huurt steigers van erkende steigerbedrijven. Elke steiger wordt gekeurd bij oplevering en periodiek (minimaal wekelijks) tijdens gebruik. Na storm of aanrijding wordt de steiger opnieuw gekeurd voordat deze weer in gebruik wordt genomen."], "fact": "Een steigerlabel is wettelijk verplicht in Nederland. Een groen label betekent dat de steiger veilig is om te gebruiken. Een rode steiger MAG NIET worden betreden door medewerkers die niet betrokken zijn bij de steigerbouw.", "practice": "Controleer ALTIJD het steigerlabel voordat u een steiger betreedt op de Phoenix Metals locatie. Is het label afwezig, verlopen of rood? Betreed de steiger dan NIET en meld het bij uw leidinggevende.", "question": "Welke kleur steigerlabel geeft aan dat de steiger veilig en goedgekeurd is?", "options": ["Rood", "Geel", "Groen", "Blauw"], "correct": 2},
    {"title": "Lift en hoogwerker: veilig gebruik", "paragraphs": ["Liften en hoogwerkers zijn arbeidsmiddelen die medewerkers en materiaal veilig naar een werkhoogte brengen. Ze zijn een effectief alternatief voor steigers bij kortdurende werkzaamheden op wisselende locaties.", "Er zijn verschillende typen hoogwerkers: telescoopkraan-highrs (voor grote hoogtes en zware lasten), articulerende hoogwerkers (voor moeilijk bereikbare plekken), schaarliften (voor vlak terrein en verticaal werk) en spinners (compacte hoogwerkers voor binnen). Elk type heeft specifieke capaciteiten en beperkingen.", "Voor het bedienen van een hoogwerker is een geldig certificaat of bewijs van bekwaamheid vereist (VCA of equivalente training). De bediener moet bekend zijn met de specifieke machine, de veiligheidsvoorzieningen, de noodprocedure en de belastingslimieten.", "Veiligheidsregels voor hoogwerkergebruik: altijd ankerpunt op de mand gebruiken voor PVH, landingsplaats vlak en draagkrachtig, uitkijken voor obstakels en overhead leidingen, niet werken bij windsnelheden boven de fabrikantsspecificatie (vaak > 12,5 m/s), en altijd een ground-person hebben bij het werk.", "Phoenix Metals gebruikt hoogwerkers voor onderhoud aan leidingbruggen, silo-daken en reactorinstallaties. Alle hoogwerkers zijn voorzien van een CE-markering en een periodieke keuring (minimaal jaarlijks). Het logboek met keuringsdata is beschikbaar bij de onderhoudsafdeling."], "fact": "De maximale veilige windsnelheid voor hoogwerkers is meestal 12,5 m/s (windkracht 6). Boven deze snelheid moet het werk worden gestaakt. De windsnelheid op grote hoogte kan aanzienlijk hoger zijn dan op de grond.", "practice": "Phoenix Metals hanteert een windprotocol voor hoogwerkerwerkzaamheden: bij windkracht 6 of hoger worden hoogwerkerwerkzaamheden stilgelegd. De windmeter op de locatie wordt hiervoor geraadpleegd.", "question": "Vanaf welke windsnelheid moeten hoogwerkerwerkzaamheden meestal worden gestaakt?", "options": ["5 m/s (windkracht 3)", "8 m/s (windkracht 4)", "12,5 m/s (windkracht 6)", "20 m/s (windkracht 8)"], "correct": 2},
    {"title": "PVH: persoonlijke valbeveiliging in detail", "paragraphs": ["Persoonlijke valbeveiliging (PVH) is het laatste middel in de hiërarchie en bestaat uit drie hoofdcomponenten: het ankerpunt, het connectiemiddel en de harness. Alle drie componenten moeten correct zijn geselecteerd, geïnstalleerd en gebruikt.", "Het ankerpunt moet een minimale sterkte hebben van 10 kN (ca. 1.000 kg) voor valbeperking en 15 kN voor redo-systemen. Ankerpunten moeten zich altijd boven de medewerker bevinden om de valafstand te minimaliseren en slingerbewegingen (pendulum effect) te voorkomen.", "De harness (full-body harness) moet correct worden gedragen: alle gespen gesloten, de borstbeugel op de juiste hoogte (sternum), beenlussen strak maar niet knellend, en de dorsale ankeerpunt (achterop de rug) gebruikt voor redo-systemen. De harness moet de juiste maat hebben.", "Het connectiemiddel (lanyard) wordt gekozen op basis van de toepassing: vaste lengte lanyards voor valbeperking, retractables (oprollend) voor verticaal werk, en lanyards met energy absorber voor redo-systemen. De maximale valafstand (free fall distance) mag niet meer dan 2 meter bedragen.", "Na een val moet de harness en het gehele valbeveiligingssysteem direct worden vervangen, zelfs als er geen zichtbare schade is. De krachten tijdens een val kunnen interne schade veroorzaken aan naden en vezels die niet met het blote oog waarneembaar zijn."], "fact": "De maximale kracht die op het menselijk lichaam mag worden uitgeoefend bij een opgevangen val is 6 kN (ca. 600 kg). Dit is de reden dat energy absorbers verplicht zijn in redo-systemen.", "practice": "Phoenix Metals vereist dat alle medewerkers die werken op hoogte jaarlijks een PVH-training volgen inclusief oefening met het ophijsen en neerlaten van een medewerker na een val (rescue drill).", "question": "Welke minimale sterkte moet een ankerpunt hebben voor een redo-systeem?", "options": ["5 kN", "10 kN", "15 kN", "20 kN"], "correct": 2},
    {"title": "Reddingsplan bij werken op hoogte", "paragraphs": ["Een reddingsplan (rescue plan) is verplicht bij werkzaamheden op hoogte waarbij persoonlijke valbeveiliging wordt gebruikt. Het doel is om een medewerker die is gevallen en hangt in zijn harness zo snel mogelijk te redden, bij voorkeur binnen 15 minuten.", "Reden voor een snelle redding: een medewerker die hangt in een harness kan binnen 10-20 minuten symptomen ontwikkelen van het harness-hangsyndroom (orthostatische shock). Door de druk van de beenlussen op de bloedvaten wordt de bloedtoevoer naar de benen belemmerd, wat kan leiden tot bewusteloosheid en overlijden.", "Het reddingsplan bevat minimaal: de locatie en aard van het werk, de identiteit van de redders, de beschikbare reddingsmiddelen, de communicatieprocedure, de noodsituatieprocedure en het ziekenhuisadres. Het plan moet voor aanvang van het werk worden besproken met alle betrokkenen.", "Reddingsmethoden omvatten: zelfredding (indien mogelijk), redding door een buddy met een reddingskit (oprol reddingstoestel), redding via hoogwerker, en redding via een geïmproviseerd systeem. De methode is afhankelijk van de situatie en de beschikbare middelen.", "Phoenix Metals heeft op beide locaties reddingskits beschikbaar bij werkzaamheden op hoogte. Minimaal één buddy per team is getraind in reddingstechnieken. Reddingsoefeningen worden tweemaal per jaar uitgevoerd."], "fact": "Het harness-hangsyndroom (suspension trauma) kan al binnen 5-10 minuten optreden bij een medewerker die bewusteloos in een harness hangt. De mortaliteit stijgt snel na 30 minuten hangtijd.", "practice": "Zorg dat u ALTIJD een buddy heeft bij werkzaamheden op hoogte met PVH. Uw buddy moet weten hoe het reddingsmateriaal werkt en in staat zijn om een redding uit te voeren. Nooit alleen werken op hoogte met PVH.", "question": "Binnen hoeveel tijd moet een hangende medewerker idealiter worden gered?", "options": ["Binnen 1 uur", "Binnen 30 minuten", "Binnen 15 minuten", "Binnen 2 uur"], "correct": 2},
    {"title": "Phoenix Metals locaties: silo's, reactor en leidingbruggen", "paragraphs": ["De Phoenix Metals locaties in IJmuiden en Rotterdam hebben specifieke hoogtewerklocaties die extra aandacht vereisen. Deze locaties omvatten silo's, reactorvaten en leidingbruggen die regelmatig inspectie en onderhoud nodig hebben.", "Silo's: De opslagsilo's voor grondstoffen en tussenproducten bereiken hoogtes van 15-25 meter. Onderhoudswerkzaamheden aan dakopeningen, vulsystemen en niveaumetingen vereisen steigers of hoogwerkers. De silodaken zijn vaak glad en hebben beperkte bewegingsruimte.", "Reactorinstallaties: De reactorvaten en bijbehorende warmtewisselaars en kolommen bereiken hoogtes van 10-30 meter. Inspectie, onderhoud en reiniging vereisen geavanceerde hoogwerkers of steigers. De nabijheid van chemische installaties vereist extra veiligheidsmaatregelen.", "Leidingbruggen: De leidingbruggen tussen de verschillende proceseenheden lopen op hoogtes van 5-15 meter en dragen leidingen voor stoom, koelwater, chemicaliën en productstromen. Onderhoud aan flensverbindingen, kleppen en isolatie vereist toegang via steigers, ladderplatforms of hoogwerkers.", "Voor al deze locaties geldt: een specifieke TRA voor de werkzaamheden, een geldig PtW, geschikte valbeveiliging, eenreddingsplan en adequate communicatiemiddelen. De HSE-afdeling van Phoenix Metals begeleidt de voorbereiding van alle hoogtewerkzaamheden."], "fact": "De Phoenix Metals PlantOne locatie in IJmuiden heeft meer dan 2 km leidingbruggen die op hoogtes variërend van 4 tot 15 meter lopen. Jaarlijks worden meer dan 200 PtW's afgegeven voor werkzaamheden op hoogte.", "practice": "Raadpleeg vóór elke hoogtewerkzaamheid de locatiespecifieke RI&E en het overzicht van ankerpunten op de Phoenix Metals locatie. Niet alle constructies zijn geschikt als ankerpunt — gebruik alleen de gemarkeerde en goedgekeurde ankerpunten.", "question": "Welke hoogtes bereiken de opslagsilo's bij Phoenix Metals?", "options": ["5-10 meter", "10-15 meter", "15-25 meter", "30-50 meter"], "correct": 2}
]

QUIZ = [
    {"question": "Vanaf welke hoogte spreekt men van werken op hoogte?", "options": ["1,5 meter", "2,0 meter", "2,5 meter", "3,0 meter"], "correct": 2},
    {"question": "Welke twee hoofdrisico's zijn er bij werken op hoogte?", "options": ["Elektriciteit en lawaai", "Vallen en vallende voorwerpen", "Chemische blootstelling en hitte", "Brand en explosie"], "correct": 1},
    {"question": "Wat is de juiste volgorde van de STOP-hiërarchie?", "options": ["Individueel, collectief, organisatorisch, eliminatie", "Eliminatie, collectief, organisatorisch, individueel", "Collectief, eliminatie, individueel, organisatorisch", "Organisatorisch, technisch, substitutie, PBM"], "correct": 1},
    {"question": "Welk type valbeveiliging voorkomt dat u bij de rand kunt komen?", "options": ["Redosysteem (Type C)", "Valbeperkingssysteem (Type A)", "Werkpositie-systeem (Type B)", "Geen van bovenstaande"], "correct": 1},
    {"question": "Wat is de maximale werkhoogte met een losse ladder?", "options": ["5 meter", "7 meter", "9 meter", "12 meter"], "correct": 2},
    {"question": "Welke kleur steigerlabel betekent veilig en goedgekeurd?", "options": ["Rood", "Geel", "Groen", "Blauw"], "correct": 2},
    {"question": "Vanaf welke windsnelheid moeten hoogwerkerwerkzaamheden worden gestaakt?", "options": ["5 m/s", "8 m/s", "12,5 m/s", "20 m/s"], "correct": 2},
    {"question": "Welke minimale sterkte moet een ankerpunt hebben voor een redo-systeem?", "options": ["5 kN", "10 kN", "15 kN", "20 kN"], "correct": 2},
    {"question": "Binnen welke tijd moet een hangende medewerker idealiter worden gered?", "options": ["Binnen 1 uur", "Binnen 30 minuten", "Binnen 15 minuten", "Binnen 2 uur"], "correct": 2},
    {"question": "Welke hoogtes bereiken de silo's bij Phoenix Metals?", "options": ["5-10 meter", "10-15 meter", "15-25 meter", "30-50 meter"], "correct": 2}
]

def build_html():
    mods_js = "[\n"
    for m in MODULES:
        mods_js += "            {{\n"
        mods_js += f'                title: "{m["title"]}",\n'
        mods_js += "                paragraphs: [\n"
        for p in m["paragraphs"]:
            esc = p.replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
            mods_js += f'                    "{esc}",\n'
        mods_js += "                ],\n"
        esc_f = m["fact"].replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
        esc_p = m["practice"].replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
        esc_q = m["question"].replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
        mods_js += f'                fact: "{esc_f}",\n'
        mods_js += f'                practice: "{esc_p}",\n'
        mods_js += f'                question: "{esc_q}",\n'
        mods_js += "                options: [\n"
        for o in m["options"]:
            mods_js += f'                    "{o.replace(chr(92), chr(92)*2).replace(chr(34), chr(92)+chr(34)).replace(chr(10), " ")}",\n'
        mods_js += f"                ],\n"
        mods_js += f'                correct: {m["correct"]}\n'
        mods_js += "            }},\n"
    mods_js += "        ]"
    quiz_js = "[\n"
    for q in QUIZ:
        quiz_js += "            {{\n"
        quiz_js += f'                question: "{q["question"]}",\n'
        quiz_js += "                options: [\n"
        for o in q["options"]:
            quiz_js += f'                    "{o}",\n'
        quiz_js += f"                ],\n"
        quiz_js += f'                correct: {q["correct"]}\n'
        quiz_js += "            }},\n"
    quiz_js += "        ]"
    return f"""<!DOCTYPE html>
<html lang="nl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Phoenix Metals - {TITLE}</title>
<style>
:root {{--primary:#003366;--secondary:#1a5276;--bg:#e8f4f8;--accent:#f39c12;--error:#e74c3c;--correct:#27ae60;}}
*{{margin:0;padding:0;box-sizing:border-box;}}
body{{font-family:Arial,sans-serif;background-color:var(--bg);color:#333;line-height:1.6;}}
.container{{max-width:1200px;margin:0 auto;padding:20px;}}
header{{background-color:var(--primary);color:white;padding:20px 0;text-align:center;position:sticky;top:0;z-index:100;box-shadow:0 2px 10px rgba(0,0,0,0.1);}}
.progress-bar{{background-color:#ddd;height:20px;width:100%;position:sticky;top:80px;z-index:99;margin-bottom:20px;border-radius:10px;overflow:hidden;}}
.progress{{background-color:var(--accent);height:100%;width:0%;transition:width 0.5s ease;}}
.module{{background:white;padding:25px;margin-bottom:25px;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.1);}}
.module h2{{color:var(--primary);border-bottom:2px solid var(--accent);padding-bottom:10px;margin-bottom:15px;}}
.paragraph{{margin-bottom:15px;text-align:justify;}}
.info-box{{background-color:#f0f8ff;border-left:4px solid var(--secondary);padding:15px;margin:15px 0;border-radius:0 5px 5px 0;}}
.info-box h3{{color:var(--secondary);margin-bottom:10px;display:flex;align-items:center;}}
.practice-box{{background-color:#fff8dc;border:1px solid var(--accent);padding:15px;margin:15px 0;border-radius:5px;}}
.practice-box h3{{color:var(--accent);margin-bottom:10px;}}
.question{{background-color:white;border:1px solid #ddd;padding:15px;margin:15px 0;border-radius:5px;}}
.question h3{{color:var(--primary);margin-bottom:10px;}}
.options{{display:grid;gap:10px;}}
.option{{padding:10px;border:1px solid #ddd;border-radius:5px;cursor:pointer;transition:all 0.3s;}}
.option:hover{{background-color:#f0f0f0;}}
.option.selected{{border-color:var(--primary);background-color:#f0f8ff;}}
.option.correct{{background-color:var(--correct);color:white;}}
.option.incorrect{{background-color:var(--error);color:white;}}
.certificate{{background:linear-gradient(135deg,#f5f7fa 0%,#c3cfe2 100%);padding:30px;text-align:center;border-radius:10px;margin-top:30px;}}
.certificate h2{{color:var(--primary);margin-bottom:20px;}}
.certificate-content{{background:white;padding:30px;border-radius:10px;box-shadow:0 4px 15px rgba(0,0,0,0.1);}}
.button{{background-color:var(--primary);color:white;border:none;padding:12px 25px;border-radius:5px;cursor:pointer;font-size:16px;transition:background-color 0.3s;}}
.button:hover{{background-color:var(--secondary);}}
.hidden{{display:none;}}
.quiz-container{{margin-top:30px;}}
footer{{background-color:var(--primary);color:white;text-align:center;padding:20px;margin-top:40px;}}
</style>
</head>
<body>
<div class="progress-bar"><div class="progress" id="progress"></div></div>
<header><h1>Phoenix Metals B.V. - {TITLE}</h1><p>{SUBTITLE}</p></header>
<div class="container" id="modules"></div>
<div class="quiz-container hidden" id="quiz-container">
<div class="module">
<h2>Quiz - 10 vragen (80% cesuur)</h2>
<div id="quiz-questions"></div>
<button class="button" onclick="checkQuiz()">Resultaten Controleren</button>
<button class="button hidden" id="retry-button" onclick="resetQuiz()">Opnieuw Proberen</button>
<button class="button hidden" id="certificate-button" onclick="showCertificate()">Certificaat Bekijken</button>
</div></div>
<div class="certificate hidden" id="certificate">
<h2>Bewijs van Voltooiing</h2>
<div class="certificate-content">
<p>Deze certificeert dat de deelnemer de training <strong>{CERT_TITLE}</strong> met succes heeft afgerond.</p>
<p><strong>Deelnemer:</strong> _________________________</p>
<p><strong>Bedrijf:</strong> Phoenix Metals B.V.</p>
<p><strong>Training:</strong> {CERT_TRAINING}</p>
<p><strong>Datum:</strong> _________________________</p>
<p><strong>Resultaat:</strong> _________________________</p>
</div></div>
<footer><p>Phoenix Metals B.V. | Safety &amp; Governance &amp; Advisory | &copy; 2026</p></footer>
<script>
const totalModules=10,totalQuestions=10;let currentProgress=0,correctAnswers=0;
const modules={mods_js};
const quizQuestions={quiz_js};
function initModules(){{const mc=document.getElementById('modules');modules.forEach((mod,i)=>{{const d=document.createElement('div');d.className='module';d.innerHTML='<h2>Module '+(i+1)+': '+mod.title+'</h2>'+mod.paragraphs.map(p=>'<p class="paragraph">'+p+'</p>').join('')+'<div class="info-box"><h3>&#x1F4D6; Wist je dat?</h3><p>'+mod.fact+'</p></div><div class="practice-box"><h3>&#x1F3ED; Phoenix Metals Praktijk</h3><p>'+mod.practice+'</p></div><div class="question"><h3>Controlevraag</h3><p><strong>'+mod.question+'</strong></p><div class="options">'+mod.options.map((o,oi)=>'<div class="option" onclick="selectOption(this,'+oi+','+mod.correct+')">'+String.fromCharCode(65+oi)+'. '+o+'</div>').join('')+'</div></div>';mc.appendChild(d);updateProgress(((i+1)/totalModules)*100);}});const qb=document.createElement('div');qb.innerHTML='<button class="button" onclick="showQuiz()">Quiz Voltooien</button>';mc.appendChild(qb);}}
function updateProgress(p){{document.getElementById('progress').style.width=p+'%';currentProgress=p;}}
function selectOption(el,si,ci){{const opts=el.parentElement.querySelectorAll('.option');opts.forEach(o=>o.classList.remove('selected','correct','incorrect'));el.classList.add('selected');setTimeout(()=>{{if(si===ci)el.classList.add('correct');else{{el.classList.add('incorrect');opts[ci].classList.add('correct');}}opts.forEach(o=>o.style.pointerEvents='none');}},300);}}
function showQuiz(){{document.getElementById('modules').classList.add('hidden');document.getElementById('quiz-container').classList.remove('hidden');updateProgress(100);initQuiz();}}
function initQuiz(){{const qc=document.getElementById('quiz-questions');quizQuestions.forEach((q,i)=>{{const d=document.createElement('div');d.className='question';d.innerHTML='<h3>Vraag '+(i+1)+': '+q.question+'</h3><div class="options">'+q.options.map((o,oi)=>'<div class="option quiz-option" onclick="selectQuizOption(this,'+oi+','+q.correct+')">'+String.fromCharCode(65+oi)+'. '+o+'</div>').join('')+'</div>';qc.appendChild(d);}});}}
function selectQuizOption(el,si,ci){{const qe=el.closest('.question');const opts=qe.querySelectorAll('.option');opts.forEach(o=>{{o.classList.remove('selected','correct','incorrect');o.style.pointerEvents='none';}});el.classList.add('selected');if(si===ci){{el.classList.add('correct');correctAnswers++;}}else{{el.classList.add('incorrect');opts[ci].classList.add('correct');}}}}
function checkQuiz(){{const pct=(correctAnswers/totalQuestions)*100;const msg=pct>=80?'Gefeliciteerd! U heeft '+correctAnswers+'/'+totalQuestions+' vragen correct beantwoord ('+pct.toFixed(1)+'%).':'Helaas heeft u '+correctAnswers+'/'+totalQuestions+' vragen correct beantwoord ('+pct.toFixed(1)+'%). De vereiste score van 80% is niet behaald.';alert(msg);if(pct>=80)document.getElementById('certificate-button').classList.remove('hidden');else document.getElementById('retry-button').classList.remove('hidden');}}
function resetQuiz(){{document.getElementById('quiz-questions').innerHTML='';document.getElementById('retry-button').classList.add('hidden');document.getElementById('certificate-button').classList.add('hidden');correctAnswers=0;initQuiz();}}
function showCertificate(){{document.getElementById('quiz-container').classList.add('hidden');document.getElementById('certificate').classList.remove('hidden');}}
window.onload=function(){{initModules();}};
</script>
</body>
</html>"""

if __name__ == "__main__":
    os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
    with open(OUTPUT, 'w', encoding='utf-8') as f:
        f.write(build_html())
    sz = os.path.getsize(OUTPUT)
    print(f"T16: {OUTPUT} | {sz} bytes ({sz/1024:.1f} KB)" + (" ⚠️ <30KB!" if sz < 30000 else " ✅"))
