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

OUTPUT = '/root/projects/jg/2026-PM-eLearning/deliverables/PM_EL_T15_Asbestbewustzijn_eLearning_v1.1.html'
TITLE = "T15: Asbestbewustzijn"
SUBTITLE = "Training Asbestbewustzijn (TR-302-07)"
CERT_TRAINING = "T15: Asbestbewustzijn (TR-302-07)"
CERT_TITLE = "Asbestbewustzijn"

MODULES = [
    {
        "title": "Asbestsoorten: blauw, bruin en wit",
        "paragraphs": [
            "Asbest is een verzamelnaam voor een groep natuurlijk voorkomende mineraalvezels die vanwege hun unieke eigenschappen (hittebestendigheid, chemische stabiliteit, treksterkte) decennialang op grote schaal zijn toegepast in de industrie. Er worden drie hoofdsoorten onderscheiden op basis van hun kristalstructuur.",
            "Blauw asbest (crocidoliet) behoort tot de amfiboolgroep en heeft naaldvormige vezels die diep in de longen kunnen doordringen. Blauw asbest wordt beschouwd als de meest gevaarlijke variant vanwege de sterke correlatie met mesothelioom. Het werd veel gebruikt in spuitasbest, pijpisolatie en cementproducten.",
            "Bruin asbest (amosiet) behoort eveneens tot de amfiboolgroep en is eveneens naaldvormig. Hoewel iets minder agressief dan blauw asbest, is bruin asbest sterk kankerverwekkend. Het werd veelal toegepast in asbestcementplaten, isolatiemateriaal en thermische buffering.",
            "Wit asbest (chrysotiel) is de enige serpentine-asbestsoort met gekrulde, flexibele vezels. Het is de meest gebruikte variant wereldwijd en werd verwerkt in dakleer, asbestcement, remblokken en vloertegels. Hoewel minder agressief dan de amfiboolvarianten, is wit asbes ook kankerverwekkend bij langdurige blootstelling.",
            "Sinds 1993 is het gebruik van asbest in Nederland verboden. In de Europese Unie is een volledig verbod van kracht sinds 2005. Desondanks bevindt asbest zich nog steeds in talloze gebouwen en installaties die vóór het verbod zijn gebouwd of geïnstalleerd."
        ],
        "fact": "Wereldwijd wordt geschat dat er meer dan 3.000 verschillende producten asbest bevatten of bevat hebben, van bouwmaterialen tot tandpasta en sigarettenfilters.",
        "practice": "Bij Phoenix Metals kunnen oudere gebouwen of installaties asbest bevatten. Bij verbouwing of sloopwerkzaamheden aan oudere constructies op de PlantOne locaties ALWAYS een asbestinventarisatie laten uitvoeren voordat werk start.",
        "question": "Welke asbestsoort wordt beschouwd als de meest gevaarlijke vanwege de sterke correlatie met mesothelioom?",
        "options": ["Wit asbest (chrysotiel)", "Bruin asbest (amosiet)", "Blauw asbest (crocidoliet)", "Groen asbest (actinoliet)"],
        "correct": 2
    },
    {
        "title": "Gezondheidsrisico's: asbestose, mesothelioom en longkanker",
        "paragraphs": [
            "Asbestvezels vormen een ernstig gezondheidsrisico wanneer ze worden ingeademd. De microscopisch kleine vezels kunnen diep in de longen doordringen en zich daar permanent nestelen. Het lichaam kan deze vezels niet afbreken of verwijderen, wat leidt tot chronische ontstekingsreacties.",
            "Asbestose is een chronische longziekte die optreedt na langdurige blootstelling aan hoge concentraties asbestvezels. Kenmerkend is de verlittekening van het longweefsel (fibrose), wat leidt tot progressieve kortademigheid, hoesten en verminderde longfunctie. Asbestose is onomkeerbaar en kan fataal zijn.",
            "Mesothelioom is een zeldzame maar agressieve vorm van kanker die ontstaat in het borstvlies (pleura) of buikvlies (peritoneum). Deze ziekte is vrijwel uitsluitend toe te schrijven aan asbestblootstelling. De latentietijd bedraagt 20 tot 50 jaar, wat betekent dat blootstelling decennia geleden nu pas tot ziekte leidt.",
            "Longkanker als gevolg van asbestblootstelling vertoont een vergelijkbaar ziektebeeld als longkanker door roken. Het risico op longkanker door asbest wordt sterk verhoogd bij gelijktijdig roken: het gecombineerde risico is multiplicatief (niet additief). Dit betekent dat rokers die aan asbest worden blootgesteld een 50- tot 90-voudig verhoogd risico hebben.",
            "Naast deze drie hoofdziekten kan asbestblootstelling ook leiden tot pleurale plaques (verdikkingen van het borstvlies), diffuse pleurale verdikking en asbestgerelateerde goedaardige aandoeningen. Elke vorm van asbestblootstelling moet daarom worden vermeden."
        ],
        "fact": "De latentietijd voor mesothelioom is gemiddeld 35-40 jaar. Dit betekent dat blootstelling op 30-jarige leeftijd pas rond het 65e tot 70e levensjaar tot ziekte kan leiden.",
        "practice": "Phoenix Metals medewerkers die mogelijk met asbesthoudende materialen in aanraking komen, moeten hun huisarts informeren over hun beroepsmatige blootstelling. Dit is belangrijk voor early detection van asbestgerelateerde aandoeningen.",
        "question": "Wat is de gemiddelde latentietijd voor mesothelioom na asbestblootstelling?",
        "options": ["5 tot 10 jaar", "10 tot 20 jaar", "20 tot 50 jaar", "1 tot 5 jaar"],
        "correct": 2
    },
    {
        "title": "Waar kom je asbest tegen",
        "paragraphs": [
            "Asbest is verwerkt in een breed scala aan bouwmaterialen en industriële producten. In gebouwen die vóór 1993 zijn gebouwd, is de kans op de aanwezigheid van asbest zeer reëel. Het is daarom van cruciaal belang om te weten waar asbest zich kan bevinden.",
            "In gebouwen komt asbest voor in dakbedekking (eternietplaten, dakleer), gevelbekleding (asbestcementplaten), vloertegels, lijm onder vloerbedekking, isolatiemateriaal rond leidingen en ketels, stopcontacten, lichtschakelaars en schoorsteenkanalen.",
            "In industriële omgevingen zoals de Phoenix Metals faciliteiten kan asbest aanwezig zijn in thermische isolatie van leidingen en reactorvaten, pakkingen en afdichtingsmateriaal, remblokken en koppelingsplaten van oude machines, brandwerende bekleding en spuitasbest op constructiedelen.",
            "Bij de PlantOne locaties IJmuiden en Rotterdam, die in een industriële context staan, is de aanwezigheid van asbest in oudere infrastructuur een reëel risico. Oude leidingbruggen, reactorisolatie en opslagtanks kunnen asbesthoudende materialen bevatten.",
            "Het is belangrijk om te onthouden dat asbest niet altijd direct zichtbaar of herkenbaar is. Asbest kan verwerkt zijn in composietmaterialen waarbij de vezels niet met het blote oog waarneembaar zijn. Alleen een laboratoriumonderzoek kan de aanwezigheid van asbest met zekerheid vaststellen."
        ],
        "fact": "In Nederland wordt geschat dat zich nog steeds zo'n 2,3 miljoen ton asbest in gebouwen en constructies bevindt. Jaarlijks wordt ongeveer 70.000 ton veilig verwijderd.",
        "practice": "Voordat u werkzaamheden uitvoert aan oudere installaties of constructies op de Phoenix Metals locaties, raadpleeg altijd het asbestregister of de RI&E om te controleren of asbesthoudende materialen aanwezig kunnen zijn.",
        "question": "Wat is de ENIGE betrouwbare methode om de aanwezigheid van asbest met zekerheid vast te stellen?",
        "options": ["Visuele inspectie door een ervaren medewerker", "Laboratoriumonderzoek van monstermateriaal", "Geur- en kleurtest", "Magnetische detectie"],
        "correct": 1
    },
    {
        "title": "Herkenning van asbest: visuele indicatoren",
        "paragraphs": [
            "Hoewel asbest niet met het blote oog met zekerheid kan worden geïdentificeerd, zijn er visuele indicatoren die kunnen wijzen op de aanwezigheid van asbesthoudende materialen. Het herkennen van deze signalen is een belangrijk onderdeel van asbestbewustzijn.",
            "Asbestcementplaten (eterniet) zijn grijze, golvende of vlakke platen die vaak op daken en gevels zijn toegepast. Ze hebben een kenmerkende vezelachtige structuur op de breukranden en kunnen verweren met een witte aanslag. De golven of patronen zijn vaak uniform en machinaal geproduceerd.",
            "Spuitasbest heeft een ruw, korrelig uiterlijk en is vaak grijs of wit van kleur. Het werd aangebracht op stalen constructies, leidingen en betonnen oppervlakken als brandwerende laag. Bij beschadiging kan het makkelijk stof vrijgeven.",
            "Vloertegels die asbest bevatten zijn vaak donkere, homogene vinyltegels (meestal 30x30 cm) uit de periode 1960-1985. De asbestvezels zitten in de draggerlaag en zijn niet zichtbaar. Oude lijmresten (zwart bitumen) onder vloerbedekking kunnen eveneens asbest bevatten.",
            "Isolatiemateriaal rond leidingen en ketels kan asbest bevatten als het gaat om wit of grijs, vezelig materiaal dat eruitziet als karton of vilt. Vooral isolatie in de vorm van mouwen, wikkelingen of dekens rond warmteleidingen moet met argwaan worden bekeken bij oudere installaties."
        ],
        "fact": "Asbestvezels zijn 700 tot 2.000 keer dunner dan een mensenhaar en zijn daardoor onzichtbaar voor het blote oog. Eén kubieke centimeter asbesthoudend materiaal kan miljoenen vezels bevatten.",
        "practice": "Maak uzelf vertrouwd met de asbestkaarten en asbestregistratie op de Phoenix Metals locaties. Deze documenten tonen waar asbesthoudende materialen zijn geïdentificeerd en of deze zijn verwijderd of nog aanwezig zijn.",
        "question": "Kunnen asbestvezels met het blote oog worden gezien?",
        "options": ["Ja, ze zijn duidelijk zichtbaar als witte draadjes", "Ja, maar alleen bij fel licht", "Nee, asbestvezels zijn microscopisch klein en onzichtbaar", "Ja, met een loep van 10x vergroting"],
        "correct": 2
    },
    {
        "title": "Wat NIET te doen bij asbestverdacht materiaal",
        "paragraphs": [
            "Bij het vermoeden van de aanwezigheid van asbesthoudende materialen is het van levensbelang om bepaalde handelingen absoluut te VERMIJDEN. Verkeerd gedrag kan leidt tot aanzienlijke vezelvrijgave en blootstelling van uzelf en anderen.",
            "NIET boren, zagen, schuren of breken: Mechanische bewerking van asbesthoudend materiaal is de belangrijkste oorzaak van vezelvrijgave. Elke vorm van mechanische bewerking moet worden vermeden totdat is vastgesteld dat het materiaal asbestvrij is.",
            "NIET vegen of afstoffen: Het droog vegen of afstoffen van oppervlakken waar asbeststof op ligt, doet de vezels opwaaien en vergroot de blootstelling aanzienlijk. Gebruik indien nodig een HEPA-stofzuiger of natte doeken.",
            "NIET zelf verwijderen: De verwijdering van asbesthoudende materialen mag uitsluitend worden uitgevoerd door een gecertificeerd asbestverwijderingsbedrijf (erkenning SCA). Zelf asbest verwijderen is niet alleen levensgevaarlijk maar ook strafbaar.",
            "NIET aanraken of verplaatsen: Raak verdacht materiaal niet aan en probeer het niet te verplaatsen. Beperk de toegang tot het gebied en waarschuw direct uw leidinggevende en de HSE-afdeling. Vermijd ook het gebruik van perslucht of hogedrukreinigers in de nabijheid van asbestverdacht materiaal."
        ],
        "fact": "Bij het boren van één gat in asbestcement kan de vezelconcentratie in de directe omgeving oplopen tot meer dan 10 vezels/ml, wat ver boven de wettelijke grenswaarde ligt.",
        "practice": "Zie je verdacht materiaal op de Phoenix Metals locatie? STOP het werk, verlaat het gebied, sluit het af en meld het direct bij je leidinggevende en de HSE-afdeling. Nooit zelf ingrijpen.",
        "question": "Wat is het EERSTE wat u moet doen bij vermoeden van asbesthoudend materiaal?",
        "options": ["Het materiaal verwijderen", "Het materiaal aanraken om te voelen", "STOP het werk en meld het bij uw leidinggevende", "Verder werken maar voorzichtig"],
        "correct": 2
    },
    {
        "title": "Meldingsprocedure bij asbestverdachte situaties",
        "paragraphs": [
            "Een duidelijke en snel gevolgde meldingsprocedure is essentieel om de blootstelling aan asbestvezels te minimaliseren. Bij Phoenix Metals geldt een gestructureerde procedure die door elke medewerker moet worden gevolgd bij asbestverdachte situaties.",
            "Stap 1: Direct stoppen met werkzaamheden. Zodra u asbestverdacht materiaal aantreft of vermoedt, staakt u onmiddellijk alle werkzaamheden in het betreffende gebied. Dit geldt ongeacht het type werk dat wordt uitgevoerd.",
            "Stap 2: Het gebied afschermen en afsluiten. Voorkom dat andere medewerkers het gebied betreden. Plaats waarschuwingsborden of -lint en zorg dat de toegang wordt beperkt. Als er mogelijk asbestvezels in de lucht zweven, verlaat dan het gebied en sluit deuren.",
            "Stap 3: Melden aan de directe leidinggevende en de HSE-afdeling. Geef een duidelijke beschrijving van de locatie, het type materiaal en de omstandigheden. De HSE-afdeling neemt de coördinatie over en start het onderzoekstraject.",
            "Stap 4: De HSE-afdeling organiseert een asbestinventarisatie door een gecertificeerd bureau. Er worden monsters genomen voor laboratoriumonderzoek. Pas na de uitslag wordt besloten over verdere actie: veilig stellen, verwijdering of beheersmaatregelen."
        ],
        "fact": "In Nederland is het melden van asbestvondsten bij grotere verwijderingswerkzaamheden verplicht bij het gemeentelijk asbestloket. Voor bedrijven geldt een interne meldingsprocedure als eerste stap.",
        "practice": "Zorg dat u de contactgegevens van de HSE-afdeling en de directe leidinggevende altijd bij de hand heeft. Op de Phoenix Metals locaties hangen informatieborden met de juiste telefoonnummers en meldingsprocedures.",
        "question": "Wat is de juiste volgorde bij een asbestverdachte situatie?",
        "options": ["Melden, verder werken, later onderzoeken", "Stoppen, afschermen, melden, onderzoeken", "Verwijderen, melden, afschermen", "Foto maken, mailen, wachten op reactie"],
        "correct": 1
    },
    {
        "title": "Arbowet art.4.1a: asbestverordening",
        "paragraphs": [
            "De Arbowetgeving kent specifieke bepalingen voor asbest. Artikel 4.1a van het Arbobesluit verbiedt het verrichten van werkzaamheden waarbij medewerkers worden blootgesteld aan asbestvezels, tenzij wordt voldaan aan strenge voorwaarden.",
            "Het Arbobesluit onderscheidt twee soorten asbestwerkzaamheden: risicovolle asbestwerkzaamheden (inventarisatie, verwijdering, sanering) en niet-risicovolle asbestwerkzaamheden (onderhoud, beheer). Voor beide gelden specifieke eisen, maar risicovolle werkzaamheden vereisen een gecertificeerd bedrijf met erkenning van de SCA (Stichting Certificering Asbestverwijdering).",
            "Voor risicovolle asbestwerkzaamheden geldt een verplichting tot het opstellen van een Plan van Aanpak (PvA) en een Asbestverwijderingsplan (AVP). Deze plannen beschrijven de werkzaamheden, de veiligheidsmaatregelen, de persoonlijke beschermingsmiddelen en de afvoer van asbesthoudend afval.",
            "De werkgever heeft de plicht om medewerkers voor te lichten over de risico's van asbest, de veiligheidsmaatregelen en de procedures. Deze voorlichting moet periodiek worden herhaald en gedocumenteerd. De training die u nu volgt, voldoet aan deze verplichting.",
            "Bij overtreding van de asbestbepalingen in de Arbowetgeving kunnen aanzienlijke boetes worden opgelegd. De Arbeidsinspectie handhaaft streng en kan bij ernstige overtredingen de werkzaamheden direct stilleggen."
        ],
        "fact": "De maximumboete voor overtreding van asbestbepalingen in de Arbowetgeving bedraagt per overtreding tot € 9.000 (categorie 2) of hoger bij ernstige of herhaalde overtredingen.",
        "practice": "Phoenix Metals voldoet aan de Arbowet asbestbepalingen door middel van een asbestbeheerplan, asbestinventarisaties op beide locaties en jaarlijkse asbestbewustzijnstraining voor alle medewerkers.",
        "question": "Welk type bedrijf MOET risicovolle asbestwerkzaamheden uitvoeren?",
        "options": ["Elk bedrijf met asbestervaring", "Alleen de eigen onderhoudsdienst", "Een gecertificeerd asbestverwijderingsbedrijf (SCA-erkenning)", "De gemeentelijke reinigingsdienst"],
        "correct": 2
    },
    {
        "title": "RI&E en asbestinventarisatie",
        "paragraphs": [
            "De Risico-Inventarisatie en -Evaluatie (RI&E) is het fundament van het arbobeleid van elke werkgever. Voor asbest geldt dat de RI&E specifiek aandacht moet besteden aan de mogelijke aanwezigheid van asbesthoudende materialen in de werkplek.",
            "Een asbestinventarisatie is een systematisch onderzoek van een gebouw of installatie waarbij alle asbesthoudende materialen worden geïdentificeerd, gelokaliseerd en gedocumenteerd. Dit onderzoek moet worden uitgevoerd door een gecertificeerd asbestinventarisatiebureau.",
            "De asbestinventarisatie resulteert in een asbestregister dat per ruimte of constructieonderdeel aangeeft: of asbest aanwezig is, welk type asbest, in welk materiaal, in welke hoeveelheid en in welke staat (goed, versleten, beschadigd). Dit register moet actueel worden gehouden.",
            "Op basis van het asbestregister wordt een asbestbeheerplan opgesteld. Dit plan beschrijft hoe omgegaan wordt met de geïdentificeerde asbesthoudende materialen: beheersen (in situ laten en periodiek controleren), verwijderen (saneren) of isoleren (afschermen van de omgeving).",
            "Voor Phoenix Metals is de asbestinventarisatie vooral relevant bij de oudere delen van de PlantOne locaties. Bij verbouwingen, sloop of onderhoudswerkzaamheden moet het asbestregister altijd als eerste worden geraadpleegd."
        ],
        "fact": "Sinds 1 januari 2021 is een asbestinventarisatie verplicht bij elke sloop- of verbouwing aan gebouwen die vóór 2001 zijn gebouwd. Dit is vastgelegd in het Bsb (Bouwbesluit).",
        "practice": "Het asbestregister van Phoenix Metals is beschikbaar bij de HSE-afdeling. Raadpleeg dit document altijd voordat u werkzaamheden uitvoert aan oudere constructies, leidingen of installatiedelen.",
        "question": "Wie mag een asbestinventarisatie uitvoeren?",
        "options": ["Elke ervaren vakman", "De huiseigenaar zelf", "Een gecertificeerd asbestinventarisatiebureau", "De gemeentelijke bouwinspectie"],
        "correct": 2
    },
    {
        "title": "Saneringsprotocol: veilig verwijderen van asbest",
        "paragraphs": [
            "Asbestsanering (verwijdering) is een complex en gereguleerd proces dat uitsluitend mag worden uitgevoerd door gecertificeerde bedrijven met een SCA-erkenning. Het saneringsprotocol beschrijft de stappen die worden gevolgd om asbest veilig te verwijderen zonder blootstelling van medewerkers of omgeving.",
            "Voorbereiding: Het saneringsgebied wordt volledig afgeschermd met folie en onderdruk wordt toegepast om vezelverspreiding te voorkomen. Er wordt een ontsmettingsruimte (sluis) ingericht met drie compartimenten: vuile zone, waszone en schone zone.",
            "Uitvoering: Asbestverwijderaars werken in volledige persoonlijke beschermingsmiddelen inclusief ademluchttoestel of P3-masker. Het asbesthoudende materiaal wordt nat gemaakt om stofvorming te minimaliseren en zorgvuldig verwijderd. Vrijgekomen materiaal wordt direct in dubbel gelabelde afvalzakken verpakt.",
            "Nacontrole: Na de sanering wordt het gebied grondig gereinigd (HEPA-stofzuiger + nat afnemen). Vervolgens wordt een luchtmeting uitgevoerd om te controleren of de vezelconcentratie onder de wettelijke grenswaarde is gezakt (< 0,01 vezels/ml). Pas na een positieve uitslag wordt het gebied vrijgegeven.",
            "Afvoer: Asbesthoudend afval wordt als gevaarlijk afval afgevoerd naar een erkend verwerkingsbedrijf. Het transport en de verwerking zijn strikt gereguleerd en volledig gedocumenteerd via een afvalstoffenregister."
        ],
        "fact": "Tijdens asbestsanering wordt gewerkt met een onderdruksysteem dat minimaal 10 Pascal onderdruk creëert. Dit voorkomt dat asbestvezels vanuit de saneringsruimte naar buiten lekken.",
        "practice": "Phoenix Metals heeft een contract met een gecertificeerd asbestverwijderingsbedrijf dat binnen 24 uur kan worden ingeschakeld. De contactgegevens zijn beschikbaar bij de HSE-afdeling en op de veiligheidsinformatieborden.",
        "question": "Welke meting bepaalt of een gesaneerde ruimte weer veilig toegankelijk is?",
        "options": ["Temperatuurmeting", "Luchtmeting (vezelconcentratie < 0,01 vezels/ml)", "Visuele inspectie alleen", "Geurmeting"],
        "correct": 1
    },
    {
        "title": "Verhaal- en registratieplicht asbestblootstelling",
        "paragraphs": [
            "Wanneer een medewerker beroepsmatig is blootgesteld aan asbest, gelden specifieke registratie- en verhaalplichten. Deze zijn vastgelegd in de Arbowetgeving en zijn bedoeld om de medewerker te beschermen en aansprakelijkheden duidelijk te documenteren.",
            "Registratieplicht: De werkgever is verplicht om alle asbestblootstellingen te registreren in een blootstellingsregister. Dit register bevat: de identiteit van de medewerker, de datum en duur van de blootstelling, het type asbest, de gevordeelde werkzaamheden en de resultaten van eventuele metingen.",
            "Het blootstellingsregister moet worden bewaard gedurende ten minste 40 jaar na de laatste blootstelling. Dit is nodig vanwege de lange latentietijd van asbestgerelateerde ziekten. De medewerker heeft recht op inzage in zijn eigen gegevens.",
            "Verhaalplicht: Medewerkers die ziek worden door beroepsmatige asbestblootstelling kunnen de werkgever aansprakelijk stellen. De bewijslast ligt in principe bij de werknemer, maar het blootstellingsregister is een cruciaal bewijsstuk. Werkgevers die geen behoorlijk register bijhouden, riskeren aanzienlijke claims.",
            "Voor Phoenix Metals betekent dit dat elke (mogelijke) asbestblootstelling direct moet worden gemeld en geregistreerd bij de HSE-afdeling. Zelfs bij een klein incident (bijvoorbeeld per ongeluk een asbestcementplaat beschadigen) moet een melding worden opgenomen in het register."
        ],
        "fact": "In Nederland overlijden jaarlijks nog steeds ongeveer 500-600 mensen aan de gevolgen van asbestgerelateerde ziekten. Dit aantal wordt verwacht te dalen na 2030 door het asbestverbod van 1993.",
        "practice": "Zorg dat u ALTIJD een melding maakt bij de HSE-afdeling wanneer u (mogelijk) bent blootgesteld aan asbesthoudend materiaal. Dit beschermt niet alleen uw gezondheid op lange termijn, maar ook uw recht op eventuele vergoeding.",
        "question": "Hoe lang moet het blootstellingsregister asbest minimaal worden bewaard?",
        "options": ["5 jaar", "10 jaar", "30 jaar", "40 jaar"],
        "correct": 3
    }
]

QUIZ = [
    {"question": "Welke asbestsoort wordt beschouwd als de meest gevaarlijke?", "options": ["Wit asbest (chrysotiel)", "Bruin asbest (amosiet)", "Blauw asbest (crocidoliet)", "Groen asbest (actinoliet)"], "correct": 2},
    {"question": "Wat is de gemiddelde latentietijd voor mesothelioom?", "options": ["5 tot 10 jaar", "10 tot 20 jaar", "20 tot 50 jaar", "1 tot 5 jaar"], "correct": 2},
    {"question": "Wat is de ENIGE betrouwbare methode om asbest aan te tonen?", "options": ["Visuele inspectie", "Laboratoriumonderzoek", "Geurtest", "Magnetische detectie"], "correct": 1},
    {"question": "Kunnen asbestvezels met het blote oog worden gezien?", "options": ["Ja, duidelijk zichtbaar", "Ja, bij fel licht", "Nee, ze zijn microscopisch", "Ja, met een loep"], "correct": 2},
    {"question": "Wat is het EERSTE wat u moet doen bij asbestvermoeden?", "options": ["Verwijderen", "Aanraken om te voelen", "STOP het werk en meld het", "Verder werken voorzichtig"], "correct": 2},
    {"question": "Wat is de juiste volgorde bij een asbestverdachte situatie?", "options": ["Melden, doorwerken, onderzoeken", "Stoppen, afschermen, melden, onderzoeken", "Verwijderen, melden, afschermen", "Foto maken, mailen, wachten"], "correct": 1},
    {"question": "Wie MOET risicovolle asbestwerkzaamheden uitvoeren?", "options": ["Elk ervaren bedrijf", "De eigen onderhoudsdienst", "Gecertificeerd asbestverwijderingsbedrijf (SCA)", "De gemeente"], "correct": 2},
    {"question": "Wie mag een asbestinventarisatie uitvoeren?", "options": ["Elke vakman", "De eigenaar zelf", "Gecertificeerd inventarisatiebureau", "De gemeente"], "correct": 2},
    {"question": "Welke grenswaarde geldt voor vrijgave na sanering?", "options": ["< 0,1 vezels/ml", "< 0,01 vezels/ml", "< 0,001 vezels/ml", "< 1 vezel/ml"], "correct": 1},
    {"question": "Hoe lang moet het asbestblootstellingsregister worden bewaard?", "options": ["5 jaar", "10 jaar", "30 jaar", "40 jaar"], "correct": 3}
]

def build_html():
    # Build modules JS
    mods_js = "[\n"
    for i, m in enumerate(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_fact = m["fact"].replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
        esc_prac = m["practice"].replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
        esc_q = m["question"].replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
        mods_js += f'                fact: "{esc_fact}",\n'
        mods_js += f'                practice: "{esc_prac}",\n'
        mods_js += f'                question: "{esc_q}",\n'
        mods_js += "                options: [\n"
        for o in m["options"]:
            esc_o = o.replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
            mods_js += f'                    "{esc_o}",\n'
        mods_js += f"                ],\n"
        mods_js += f'                correct: {m["correct"]}\n'
        mods_js += "            }},\n"
    mods_js += "        ]"

    # Build quiz JS
    quiz_js = "[\n"
    for q in QUIZ:
        quiz_js += "            {{\n"
        esc_q = q["question"].replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
        quiz_js += f'                question: "{esc_q}",\n'
        quiz_js += "                options: [\n"
        for o in q["options"]:
            esc_o = o.replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
            quiz_js += f'                    "{esc_o}",\n'
        quiz_js += f"                ],\n"
        quiz_js += f'                correct: {q["correct"]}\n'
        quiz_js += "            }},\n"
    quiz_js += "        ]"

    html = 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 &bull; Governance &bull; Advisory | &copy; 2026</p></footer>
    <script>
        const totalModules = 10;
        const totalQuestions = 10;
        let currentProgress = 0;
        let 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 + ',\\'mod-' + i + '\\')">' +
                        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, mid) {{
            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>"""
    return html

if __name__ == "__main__":
    os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
    html = build_html()
    with open(OUTPUT, 'w', encoding='utf-8') as f:
        f.write(html)
    sz = os.path.getsize(OUTPUT)
    print(f"T15 gegenereerd: {OUTPUT}")
    print(f"Bestandsgrootte: {sz} bytes ({sz/1024:.1f} KB)")
    if sz < 30000:
        print(f"⚠️ WAARSCHUWING: Bestand is kleiner dan 30KB!")
