#!/usr/bin/env python3
"""Generate KWIK Docentenhandleiding and Cursisten Werkboek from HSEQ content analysis."""

from docx import Document
from docx.shared import Cm, Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
import os

LOGO = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
LOGO_W = Cm(2.0)
LOGO_H = Cm(1.8)

OUT_DOCENT = "/root/projects/jg/2026-pbm-KWIK/deliverables/docx/kwik-docentenhandleiding_v1.0.docx"
OUT_CURSIST = "/root/projects/jg/2026-pbm-KWIK/deliverables/docx/kwik-werkboek_v1.0.docx"

# ── Colors ──
JVG_BLUE = RGBColor(0x00, 0x3D, 0x6B)  # dark navy
JVG_ACCENT = RGBColor(0x00, 0x7B, 0xC0)
TABLE_HEADER_BG = "003D6B"
TABLE_ALT_BG = "EBF5FB"
WHITE = RGBColor(0xFF, 0xFF, 0xFF)

def set_cell_shading(cell, color_hex):
    shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color_hex}"/>')
    cell._tc.get_or_add_tcPr().append(shading)

def add_logo(doc, width=LOGO_W, height=LOGO_H):
    run = doc.add_paragraph().add_run()
    run.add_picture(LOGO, width=width, height=height)
    return run

def set_paragraph_spacing(paragraph, before=0, after=0, line_spacing=None):
    pPr = paragraph._p.get_or_add_pPr()
    if before or after:
        spacing = parse_xml(
            f'<w:spacing {nsdecls("w")} w:before="{before}" w:after="{after}"/>'
        )
        pPr.append(spacing)

def style_table(table):
    """Apply JVG styling to a table."""
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header row
    for cell in table.rows[0].cells:
        set_cell_shading(cell, TABLE_HEADER_BG)
        for p in cell.paragraphs:
            p.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for run in p.runs:
                run.font.color.rgb = WHITE
                run.font.bold = True
                run.font.size = Pt(9)
    # Alternating rows
    for i, row in enumerate(table.rows[1:], 1):
        if i % 2 == 0:
            for cell in row.cells:
                set_cell_shading(cell, TABLE_ALT_BG)
        for cell in row.cells:
            for p in cell.paragraphs:
                for run in p.runs:
                    run.font.size = Pt(9)

def add_styled_heading(doc, text, level=1):
    h = doc.add_heading(text, level=level)
    for run in h.runs:
        run.font.color.rgb = JVG_BLUE
    return h

def add_body(doc, text, bold=False, italic=False, size=Pt(10)):
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.font.size = size
    run.bold = bold
    run.italic = italic
    run.font.color.rgb = RGBColor(0x33, 0x33, 0x33)
    return p

def add_bullet(doc, text, level=0, size=Pt(10)):
    p = doc.add_paragraph(text, style='List Bullet')
    p.paragraph_format.left_indent = Cm(1.0 + level * 0.8)
    for run in p.runs:
        run.font.size = size
    return p

def add_table_from_data(doc, headers, rows):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    for j, h in enumerate(headers):
        cell = table.rows[0].cells[j]
        cell.text = h
    for i, row_data in enumerate(rows):
        for j, val in enumerate(row_data):
            table.rows[i + 1].cells[j].text = str(val)
    style_table(table)
    return table

# ══════════════════════════════════════════════════════════════════
# DOCENTENHANDLEIDING
# ══════════════════════════════════════════════════════════════════
def build_docentenhandleiding():
    doc = Document()
    
    # Page setup
    for section in doc.sections:
        section.top_margin = Cm(2.0)
        section.bottom_margin = Cm(2.0)
        section.left_margin = Cm(2.5)
        section.right_margin = Cm(2.5)
    
    # ── Cover page ──
    for _ in range(4):
        doc.add_paragraph()
    
    add_logo(doc)
    doc.add_paragraph()
    
    title = doc.add_paragraph()
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = title.add_run("DOCENTENHANDLEIDING")
    run.font.size = Pt(28)
    run.font.color.rgb = JVG_BLUE
    run.bold = True
    
    subtitle = doc.add_paragraph()
    subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = subtitle.add_run("Awareness Training — Kwik (Mercury/Hg)")
    run.font.size = Pt(16)
    run.font.color.rgb = JVG_ACCENT
    
    meta = doc.add_paragraph()
    meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = meta.add_run("Niveau: Gevorderd | Doelgroep: Medewerkers (olie, gas, petrochemie, offshore)\nDuur: 30–45 min | Versie: v1.0 | 15 april 2026")
    run.font.size = Pt(10)
    run.font.color.rgb = RGBColor(0x66, 0x66, 0x66)
    
    doc.add_page_break()
    
    # ── Inhoudsopgave ──
    add_styled_heading(doc, "Inhoudsopgave", level=1)
    toc_items = [
        "1. Doelstelling en Opzet van de Training",
        "2. Overzicht Leerdoelen (SMART)",
        "3. Module-overzicht en Tijdsplanning",
        "4. Module 1: Kwik — Eigenschappen en Vormen (Docentnotities)",
        "5. Module 2: Kwik in de Industrie (Docentnotities)",
        "6. Module 3: Blootstellingsroutes en Toxicokinetiek (Docentnotities)",
        "7. Module 4: Gezondheidseffecten (Docentnotities)",
        "8. Module 5: Wettelijk Kader (Docentnotities)",
        "9. Module 6: Meten en Monitoring (Docentnotities)",
        "10. Module 7: Preventieve Maatregelen — STOP-strategie (Docentnotities)",
        "11. Module 8: Kwik in Olie & Gas (Docentnotities)",
        "12. Module 9: Noodprocedure bij Kwikspill (Docentnotities)",
        "13. Module 10: Praktijk en Casuïstiek (Docentnotities)",
        "14. Quiz — Antwoordmodel en Toelichting",
        "15. Discussievragen — Begeleidingshints",
        "16. Praktische Opdracht — Beoordelingsmodel",
        "17. Referenties"
    ]
    for item in toc_items:
        p = doc.add_paragraph(item)
        for run in p.runs:
            run.font.size = Pt(10)
    
    doc.add_page_break()
    
    # ── 1. Doelstelling ──
    add_styled_heading(doc, "1. Doelstelling en Opzet van de Training", level=1)
    add_body(doc, "Deze training provides medewerkers in de olie-, gas-, petrochemie- en offshore-sector met de kennis en vaardigheden om veilig te werken met en rondom kwik (kwik/Hg). De training is ontworpen op gevorderd niveau en combineert theoretische kennis met praktische toepassing.")
    add_body(doc, "")
    add_styled_heading(doc, "Opzet", level=2)
    add_body(doc, "• 10 inhoudsmodule met een totale duur van ~36 min presentatie")
    add_body(doc, "• 15 quizvragen (meerkeuze) verdeeld over kennis, toepassing en analyse")
    add_body(doc, "• 6 discussievragen voor groepsinteractie")
    add_body(doc, "• 1 praktische opdracht (werkplek-risicobeoordeling, 30-45 min)")
    add_body(doc, "• Totale trainingstijd: 30–45 min (excl. praktische opdracht)")
    
    add_styled_heading(doc, "Didactische Principes", level=2)
    add_bullet(doc, "Start met de 'Waarom?' — verbind module-inhoud direct aan de werkelijkheid van de deelnemer")
    add_bullet(doc, "Gebruik de case studies (Skikda, Minamata) als emotioneel anker")
    add_bullet(doc, "Activeer deelnemers met quiz- en discussie-intermezzo's elke 2 modules")
    add_bullet(doc, "De praktische opdracht is het afsluitende element — valideer begrip via actieplan")
    add_bullet(doc, "Evalueer met de 15-punten quiz en geef directe feedback")
    
    doc.add_page_break()
    
    # ── 2. Leerdoelen ──
    add_styled_heading(doc, "2. Overzicht Leerdoelen (SMART)", level=1)
    add_body(doc, "Na afronding van deze training kan de medewerker de 8 onderstaande leerdoelen behalen:")
    
    ledoelen = [
        ["1", "De drie kwikvormen (elementair, anorganisch, organisch) benoemen en fysisch-chemische eigenschappen beschrijven.", "Schriftelijk: correct benoeming van 3 vormen + ≥4 eigenschappen per vorm bij quiz."],
        ["2", "Blootstellingsroutes kwantificeren en toxicokinetische distributie uitleggen.", "Quiz: correcte route-absorptiepercentages uit meerkeuze."],
        ["3", "Acute en chronische gezondheidseffecten onderscheiden per kwikvorm.", "Casus: correcte effect-toewijzing bij 3 scenario's."],
        ["4", "Nederlandse OEL-waarden (TWA-8h, STEL-15min) en biologische grenswaarden parafraseren.", "Quiz: exacte waarden reproduceren."],
        ["5", "STOP-strategie toepassen op een kwikwerkpleksituatie.", "Praktijkopdracht: STOP-matrix invullen voor casus."],
        ["6", "Kwikspill classificeren (klein/groot) en juiste noodprocedure volgen.", "Quiz + discussie: correcte procedure bij 2 scenario's."],
        ["7", "Specifieke risico's van kwik in olie & gas benoemen en mitigerende maatregelen beschrijven.", "Quiz: ≥3 risicomaatregelen correct benoemen."],
        ["8", "Kwikmeting interpreteren en consequenties voor actie formuleren.", "Praktijkopdracht: metingsresultaat beoordelen en actieplan schrijven."],
    ]
    add_table_from_data(doc, ["#", "Leerdoel", "SMART-criterium"], ledoelen)
    
    doc.add_page_break()
    
    # ── 3. Module-overzicht ──
    add_styled_heading(doc, "3. Module-overzicht en Tijdsplanning", level=1)
    
    modules = [
        ["1", "Kwik — Eigenschappen en Vormen", "3 min"],
        ["2", "Kwik in de Industrie — Bronnen en Toepassingen", "4 min"],
        ["3", "Blootstellingsroutes en Toxicokinetiek", "4 min"],
        ["4", "Gezondheidseffecten — Acuut en Chronisch", "5 min"],
        ["5", "Wettelijk Kader — OEL's en Classificatie", "5 min"],
        ["6", "Meten en Monitoring", "4 min"],
        ["7", "Preventieve Maatregelen — STOP-strategie", "5 min"],
        ["8", "Kwik in Olie & Gas — Specifieke Risico's", "4 min"],
        ["9", "Noodprocedure bij Kwikspill", "4 min"],
        ["10", "Praktijk en Casuïstiek", "3 min"],
    ]
    add_table_from_data(doc, ["Module", "Onderwerp", "Duur"], modules)
    
    add_body(doc, "")
    add_body(doc, "Suggested flow: Presenteer modules 1-3 → Quiz intermezzo (V1-V5) → Modules 4-6 → Quiz intermezzo (V6-V10) → Modules 7-9 → Quiz intermezzo (V11-V15) → Module 10 → Discussievragen → Praktische opdracht.", italic=True)
    
    doc.add_page_break()
    
    # ── 4-13. Module Docentnotities (condensed) ──
    module_notes = {
        4: ("Module 1: Kwik — Eigenschappen en Vormen", "3 min", [
            "Benadruk: kwik is het ENIGE vloeibare metaal bij kamertemperatuur",
            "Dampdruk-curve is cruciaal: zelfs bij 20°C ontstaat aanzienlijke damp",
            "Demonstratie-idee: toon een foto van vloeibaar kwik in een glas (visualiseert zilverwitte glans)",
            "Organische verbindingen: methylkwik is relevant voor voedselketen (visconsumptie)",
            "Key point: kwikdamp is KLEURLOOS en REUKLOOS — geen sensorische waarschuwing",
        ]),
        5: ("Module 2: Kwik in de Industrie", "4 min", [
            "Focus op olie & gas: kwik komt VAN NATURE voor in geologische formaties",
            "Concentratievariabiliteit: 0,1 – 5.000 µg/Nm³ — enorme spreiding",
            "Aluminiumcorrosie is het 'verborgen gevaar' — introductie voor Module 8",
            "Uitdovende toepassingen: laat zien dat kwik langzaam maar zeker verdwijnt uit de industrie",
            "Discussiepunt: welke kwikhoudende materialen staan er nog op jullie locatie?",
        ]),
        6: ("Module 3: Blootstellingsroutes en Toxicokinetiek", "4 min", [
            "Inhalatie = dominante route voor elementair Hg⁰ (~80% absorptie)",
            "Distributie-table is belangrijk: Hg⁰ → BBB → hersenen; CH₃Hg⁺ → placenta → fetus",
            "Halfwaardetijd hersenen: ~230 dagen — dit verklaart de ernst van Minamata",
            "Uitscheiding: anorganisch via urine, methylkwik via feces — relevante biomarkers",
            "Quiz-verbinding: V3 (blootstellingsroutes) en V5 (halfwaardetijd)",
        ]),
        7: ("Module 4: Gezondheidseffecten", "5 min", [
            "Acuut vs. chronisch: duidelijk onderscheid maken",
            "Erethisme ('mad hatter'): historische context verbindt met moderne werkplekken",
            "Minamata disease: gebruik foto's als visueel anker (voorzichtig — grafisch materiaal)",
            "Kwiknefrose (GEO 1802) is erkende beroepsziekte in Nederland",
            "Nefrotoxiciteit: proteinurie als vroege indicator — relatie met bio-monitoring",
        ]),
        8: ("Module 5: Wettelijk Kader", "5 min", [
            "MAC 0,025 mg/m³ en STEL 0,075 mg/m³ zijn KERNWAARDEN — deelnemers moeten deze uit hun hoofd kennen",
            "Actiewaarde (50% MAC = 0,0125 mg/m³) trigger voor verplichte arbeidshygiënische strategie",
            "EU KMR Repr. 1B (H360Df): zwangere vrouwen mogen NIET werken met kwik",
            "Minamata Convention: internationaal verdrag, 140+ landen — context van mondiale uitfasering",
            "NCvB GEO-codes: 1801 (kwikintoxicatie), 1802 (kwiknefrose) — meldingsplicht bedrijfsarts",
        ]),
        9: ("Module 6: Meten en Monitoring", "4 min", [
            "Jerome 411-X en Lumex RA-915+ zijn de standaard draagbare instrumenten",
            "Biologische monitoring: urine <20 µg/g creatinine, bloed <15 µg/L",
            "NEN-EN 689: minimale 3 representatieve metingen per werkplek",
            "Groep-indeling (<10%, 10-50%, >50% MAC) bepaalt actieniveau",
            "Praktisch: wanneer is welke meetmethode gepast?",
        ]),
        10: ("Module 7: STOP-strategie", "5 min", [
            "STOP = Bron → Technisch → Organisatorisch → Persoonlijk — DEZE VOLGORDE is essentieel",
            "Bronmaatregelen: eliminatie (★★★★★) is altijd superior aan PBM",
            "Spill-kit inhoud is examenmateriaal — deelnemers moeten de componenten kennen",
            "Decontaminatieprotocol: 10 stappen — laat deelnemers de stappen opnoemen",
            "NOOIT standaard stofzuiger — dit is een herhaald examenpunt",
        ]),
        11: ("Module 8: Kwik in Olie & Gas", "4 min", [
            "Skikda LNG case (2004): 27 doden — kwik-gerelateerde Al-corrosie als bijdragende factor",
            "Amalgamvorming Hg-Al: zelfs <10 µg/Nm³ kan op termijn catastrofaal falen veroorzaken",
            "MRU-types: actieve kool (>99%), sulfur-geïmpregneerd (>99,5%)",
            "Sampling: gastight 316SS/PTFE, verwarmde lijnen >120°C, CV-AAS of ICP-MS",
            "Euralcodes voor afvoer: 16 05 06* (gevaarlijk afval)",
        ]),
        12: ("Module 9: Noodprocedure bij Kwikspill", "4 min", [
            "Kleine spill (<25 ml): 10-stappen procedure — evacuatie → PBM → zwavel → meting → vrijgave",
            "Grote spill: ontruiming, zone 10 m, professionele saneringsfirma",
            "Brand: NOOIT blussen met water — droog poeder of CO₂",
            "10-punten checklist: print uit en hang op als naslagwerk",
            "Persoonlijke besmetting: kwick op huid → water + zeep (geen oplosmiddelen!)",
        ]),
        13: ("Module 10: Praktijk en Casuïstiek", "3 min", [
            "3 case studies: thermometer in kelder, pijpleiding inspectie, fluorescentielampen",
            "Elke casus volgt het patroon: situatie → correcte procedure → leerpunt",
            "Key Messages: 8 samenvattende punten — gebruik als afsluitende slide",
            "Verbind met praktische opdracht: deelnemers gaan zelf een risicobeoordeling maken",
        ]),
    }
    
    for mod_num, (title, duration, notes) in module_notes.items():
        add_styled_heading(doc, f"{mod_num}. {title}", level=1)
        add_body(doc, f"Duur: {duration}", italic=True)
        add_body(doc, "")
        add_styled_heading(doc, "Docentnotities", level=2)
        for note in notes:
            add_bullet(doc, note)
        doc.add_paragraph()
    
    doc.add_page_break()
    
    # ── 14. Quiz Antwoordmodel ──
    add_styled_heading(doc, "14. Quiz — Antwoordmodel en Toelichting", level=1)
    
    quiz_answers = [
        ["V1", "B", "0,00185 mmHg", "Dampdruk bij 20°C"],
        ["V2", "B", "0,025 mg/m³", "MAC TWA-8h Arbobesluit"],
        ["V3", "C", "Inhalatie (~80%)", "Dominante route voor Hg⁰"],
        ["V4", "D", "Groep 3", "Niet classificeerbaar carcinogeen"],
        ["V5", "D", "~230 dagen", "Methylkwik in hersenen"],
        ["V6", "B", "Evacueren en ventileren", "Kwikdamp zwaarder dan lucht"],
        ["V7", "B", "Actiewaarde overschreden", "0,018 > 0,0125 mg/m³"],
        ["V8", "B", "P3 + Hg filter + nitril", "Conform EN 371"],
        ["V9", "B", "Kwikdampmeting <0,025 mg/m³", "Verificatie verplicht"],
        ["V10", "B", "Amalgam → corrosie → falen", "Skikda case study"],
        ["V11", "B", "BGW overschreden (35 > 20)", "Tremor + erethisme = chronische blootstelling"],
        ["V12", "B", "15 µg/Nm³", "3000 × 0,5% = 15"],
        ["V13", "B", "Sanering vereist", "25 > 10 mg/kg interventiewaarde"],
        ["V14", "C", "Herplaatsing zwangere vrouw", "Repr. 1B verboden"],
        ["V15", "B", "HgS (kinzinnabar)", "Stabiel, niet-vluchtig"],
    ]
    add_table_from_data(doc, ["Vraag", "Correct", "Antwoord", "Kern"], quiz_answers)
    
    add_body(doc, "")
    add_body(doc, "Scoring: ≤10/15 = onvoldoende (herhaling verplicht) | 11-13/15 = voldoende | 14-15/15 = goed", bold=True)
    
    doc.add_page_break()
    
    # ── 15. Discussievragen hints ──
    add_styled_heading(doc, "15. Discussievragen — Begeleidingshints", level=1)
    
    disc_hints = [
        ("D1", "STOP-strategie toepassen: Bron (MRU installatie = bronmaatregel), Technisch (materiaalkeuze: geen Al), Organisatorisch (inspectieprotocol), Persoonlijk (PBM). Skikda case als argument: 27 doden. Kosten van MRU-installatie vs. kosten van catastrofaal falen (LNG trein, downtime, aansprakelijkheid)."),
        ("D2", "Risico's: onopgemerkte chronische blootstelling, beroepsziekte-claim, Arbowet-overtreding. Corrigerend actie: direct bio-monitoring herstellen, retrospectieve risicobeoordeling, rapportage aan directie met plan van aanpak. Verantwoording: verwijzing naar Arbobesluit art. 3.22-3.26 en NCvB meldingsplicht."),
        ("D3", "Arbowet: werkgever is VERPLICHT adequate bescherming te bieden. Meting onder MAC ontheft niet van PBM-vereiste bij risicotaak. Hiërarchie van maatregelen: PBM is laatste laag — maar als hogere lagen ontoereikend zijn, is PBM ALTIJD verplicht. Gesprek: begrip voor ongemak, maar veiligheid gaat boven comfort. Alternatieven: andere maskertype proberen, pauzeregeling."),
        ("D4", "Financieel: aanschaf digitale instrumenten vs. kosten kwikspill/ziekteverzuim/claims. Veiligheid: eliminatie van kwikbron = hoogste STOP-niveau. Compliance: EU Verordening 2017/852 verbiedt kwikthermometers. Reputatie: duurzaamheidsimage, klantvereisten (ESG). Total Cost of Ownership over 5-10 jaar."),
        ("D5", "Onmiddellijk: MRU-storing melden, niet-werkende MRU = kwik komt door → blootstellingsrisico. Noodprocedure: werkplek evalueren (is concentratie >actiewaarde?), PBM verplicht stellen, monitoring instellen. MRU-reparatie of bypass-maatregelen. Condensaat als gevaarlijk afval behandelen als kwikconcentratie hoog is."),
        ("D6", "Supply chain due diligence: eisen dat leveranciers kwikvrij werken. Financiële bijdrage aan UNEP Mercury Programme. Technologietransfer: MRU-technologie delen met ontwikkelingslanden. Transparency reporting: kwikemissies rapporteren in sustainability report. Certificering: ISO 14001 milieu-managementsysteem."),
    ]
    
    for code, hint in disc_hints:
        add_styled_heading(doc, code, level=2)
        add_body(doc, hint)
    
    doc.add_page_break()
    
    # ── 16. Praktijke Opdracht Beoordeling ──
    add_styled_heading(doc, "16. Praktische Opdracht — Beoordelingsmodel", level=1)
    
    add_styled_heading(doc, "Situatieoverzicht", level=2)
    add_body(doc, "De deelnemers werken in groepen van 3-4 personen aan een risicobeoordeling voor een gasopwerkingsstation met de volgende bevindingen:")
    add_bullet(doc, "Kwikconcentratie in aardgas: 150 µg/Nm³")
    add_bullet(doc, "MRU: 3 maanden geleden laatst onderhouden (interval: 6 maanden)")
    add_bullet(doc, "4 aluminium heat exchangers (in bedrijf sinds 2008)")
    add_bullet(doc, "12 kwikthermometers als back-up")
    add_bullet(doc, "Bio-monitoring: 14 maanden geleden (toen: 8 µg/g creatinine)")
    add_bullet(doc, "Spill-kit: niet gecontroleerd sinds 2 jaar")
    add_bullet(doc, "Medewerker meldt: trillende vingers, concentratieproblemen")
    
    add_styled_heading(doc, "Verwachte STOP-classificatie", level=2)
    stop_class = [
        ["Kwikthermometers", "Bron (S)", "Kritiek", "Eliminatie → digitale alternatieven"],
        ["MRU onderhoud", "Technisch (T)", "Kritiek", "Direct onderhoud inplannen"],
        ["Al heat exchangers", "Technisch (T)", "Kritiek", "Corrosie-inspectie + vervanging plan"],
        ["Bio-monitoring achterstand", "Organisatorisch (O)", "Hoog", "Direct herstellen + retrospectief"],
        ["Spill-kit controle", "Organisatorisch (O)", "Hoog", "Direct controleren + aanvullen"],
        ["Medewerker symptomen", "Organisatorisch (O)", "Kritiek", "Direct medische evaluatie"],
        ["150 µg/Nm³ concentratie", "Bron (S)", "Hoog", "MRU-capaciteit evalueren"],
        ["PBM-protocol", "Persoonlijk (P)", "Medium", "Verifiëren + training"],
    ]
    add_table_from_data(doc, ["Punt", "STOP-laag", "Prioriteit", "Actie"], stop_class)
    
    add_styled_heading(doc, "Beoordelingscriteria", level=2)
    criteria = [
        ["Correcte STOP-classificatie", "20"],
        ["Prioritering met argumentatie", "20"],
        ["Volledigheid actieplan (≥8 acties)", "20"],
        ["Realistisch en uitvoerbaar", "15"],
        ["Wettelijke kaders correct geïdentificeerd", "15"],
        ["Management summary — helder en beknopt", "10"],
        ["Totaal", "100"],
    ]
    add_table_from_data(doc, ["Criterium", "Max. punten"], criteria)
    
    doc.add_page_break()
    
    # ── 17. Referenties ──
    add_styled_heading(doc, "17. Referenties", level=1)
    
    refs = [
        "Minamata Convention on Mercury (UNEP, 2013) — www.mercuryconvention.org",
        "EU Verordening 2017/852 (Kwikverordening) — Publicatieblad EU L 137, 24 mei 2017",
        "EG Verordening 1907/2006 (REACH) — SVHC-kandidaatlijst kwik",
        "Arbobesluit — Art. 3.22-3.26; Bijlage XI-A: MAC 0,025 mg/m³",
        "Wet bodembescherming — Kwik interventiewaarde industriegrond: 10 mg/kg",
        "NEN-EN 689 — Binnenluchtkwaliteit werkplek",
        "NEN-EN 371 — Gasfilters adembescherming",
        "NIOSH 6009/6007 — Mercury measurement methods",
        "CLP Verordening (EG 1272/2008)",
        "IARC Monographs Vol. 118 (2018) — Groep 3",
        "ATSDR Toxicological Profile for Mercury (2022)",
        "WHO Guidance for Identifying Populations at Risk from Mercury Exposure (2008)",
        "RIVM — Kwik in het milieu (rapport 601026001/2020)",
        "NCvB — GEO 1801 (kwikintoxicatie), GEO 1802 (kwiknefrose)",
        "SER — Biologische grenswaarden arbo-catalogus",
        "ISO 18453-4 — Mercury determination in natural gas",
        "API RP 555 — Process analyzers, mercury monitoring",
        "Nielsen, R. (2005) — Liquid metal embrittlement of aluminium by mercury, NACE",
        "US EPA Method 1631e — Mercury in water",
    ]
    for i, ref in enumerate(refs, 1):
        p = doc.add_paragraph(f"{i}. {ref}")
        for run in p.runs:
            run.font.size = Pt(9)
    
    # ── Footer note ──
    doc.add_paragraph()
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("Docentenhandleiding v1.0 — JVG Safety Training — 15 april 2026 — Vertrouwelijk")
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x99, 0x99, 0x99)
    run.italic = True
    
    doc.save(OUT_DOCENT)
    print(f"✅ Docentenhandleiding opgeslagen: {OUT_DOCENT}")


# ══════════════════════════════════════════════════════════════════
# CURSISTEN WERKBOEK
# ══════════════════════════════════════════════════════════════════
def build_cursisten_werkboek():
    doc = Document()
    
    for section in doc.sections:
        section.top_margin = Cm(2.0)
        section.bottom_margin = Cm(2.0)
        section.left_margin = Cm(2.5)
        section.right_margin = Cm(2.5)
    
    # ── Cover ──
    for _ in range(3):
        doc.add_paragraph()
    
    add_logo(doc)
    doc.add_paragraph()
    
    title = doc.add_paragraph()
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = title.add_run("CURSISTEN WERKBOEK")
    run.font.size = Pt(28)
    run.font.color.rgb = JVG_BLUE
    run.bold = True
    
    subtitle = doc.add_paragraph()
    subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = subtitle.add_run("Awareness Training — Kwik (Mercury/Hg)")
    run.font.size = Pt(16)
    run.font.color.rgb = JVG_ACCENT
    
    meta = doc.add_paragraph()
    meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = meta.add_run("Niveau: Gevorderd | Doelgroep: Medewerkers (olie, gas, petrochemie, offshore)\nDuur: 30–45 min | Versie: v1.0 | 15 april 2026")
    run.font.size = Pt(10)
    run.font.color.rgb = RGBColor(0x66, 0x66, 0x66)
    
    # Name fields
    doc.add_paragraph()
    for field in ["Naam: ________________________________", "Datum: ________________________________", "Locatie: ________________________________"]:
        p = doc.add_paragraph(field)
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        for run in p.runs:
            run.font.size = Pt(11)
    
    doc.add_page_break()
    
    # ── Leerdoelen ──
    add_styled_heading(doc, "Leerdoelen", level=1)
    add_body(doc, "Na deze training kun je:")
    
    ledoelen = [
        "De drie kwikvormen benoemen en hun eigenschappen beschrijven",
        "Blootstellingsroutes kwantificeren en toxicokinetische distributie uitleggen",
        "Acute en chronische gezondheidseffecten onderscheiden per kwikvorm",
        "Nederlandse OEL-waarden en biologische grenswaarden parafraseren",
        "De STOP-strategie toepassen op een kwikwerkpleksituatie",
        "Een kwikspill classificeren en de juiste noodprocedure volgen",
        "Specifieke risico's van kwik in olie & gas benoemen",
        "Een kwikmeting interpreteren en consequenties formuleren",
    ]
    for i, ld in enumerate(ledoelen, 1):
        add_bullet(doc, f"{i}. {ld}")
    
    doc.add_page_break()
    
    # ── Module Content (student version) ──
    add_styled_heading(doc, "Module 1: Kwik — Eigenschappen en Vormen", level=1)
    
    add_styled_heading(doc, "Elementair kwik (Hg⁰)", level=2)
    props = [
        "Enige vloeibare metaal bij standaardomstandigheden (smeltpunt −38,83°C)",
        "Zilverwit, metallische glans | Dichtheid: 13,534 g/cm³",
        "Dampdruk bij 20°C: 0,00185 mmHg — reeds aanzienlijk bij kamertemperatuur",
        "Relatieve dampdichtheid: ~6,9 (ten opzichte van lucht) — accumuleert in lage ruimtes",
        "Kwikdamp is KLEURLOOS en REUKLOOS — geen sensorische waarschuwing",
    ]
    for p_text in props:
        add_bullet(doc, p_text)
    
    add_styled_heading(doc, "Dampdrukcurve", level=2)
    dp_data = [
        ["20°C", "0,00185 mmHg", "Kamertemperatuur — continue emissie"],
        ["40°C", "0,012 mmHg", "Zomers/warme ruimtes"],
        ["100°C", "0,27 mmHg", "Verhitte oppervlakken"],
        ["150°C", "1,2 mmHg", "Industriële processen"],
        ["250°C", "12 mmHg", "Risicozone — hoge dampvorming"],
    ]
    add_table_from_data(doc, ["Temperatuur", "Dampdruk", "Context"], dp_data)
    
    add_styled_heading(doc, "Anorganische kwikverbindingen", level=2)
    inorg = [
        ["Kwik(I)-chloride (calomel)", "Hg₂Cl₂", "Wit poeder, weinig oplosbaar"],
        ["Kwik(II)-chloride (sublimaat)", "HgCl₂", "Zeer toxisch, hoog oplosbaar"],
        ["Kwik(II)-oxide", "HgO", "Rood/geel poeder, batterijen"],
        ["Kwiksulfide (cinnaber)", "HgS", "Rood, stabiele eindvorm decontaminatie"],
    ]
    add_table_from_data(doc, ["Vorm", "Formule", "Kenmerken"], inorg)
    
    add_styled_heading(doc, "Organische kwikverbindingen", level=2)
    org = [
        "Methylkwik (CH₃Hg⁺): Lipofiel, passeert BBB, bioaccumuleert (vis), halfwaardetijd ~70 dagen",
        "Dimethylkwik ((CH₃)₂Hg): Zeer vluchtig, extreem toxisch, breekvlamig",
        "Ethylkwik: Historisch fungicide (EU verboden sinds 1991)",
        "Fenylkwik: Historisch fungicide/zaadcoating",
    ]
    for p_text in org:
        add_bullet(doc, p_text)
    
    doc.add_page_break()
    
    # ── Module 2 ──
    add_styled_heading(doc, "Module 2: Kwik in de Industrie", level=1)
    
    add_styled_heading(doc, "Typische kwikconcentraties", level=2)
    industry = [
        ["Aardgas", "Geassocieerd met reservoir", "0,1 – 5.000 µg/Nm³"],
        ["Condensaat", "Opgelost in vloeistoffase", "1 – 200 µg/kg"],
        ["Ruwe olie", "Opgelost/gesuspendeerd", "0,01 – 10 mg/kg"],
        ["PVC (petrochemie)", "HgCl₂ katalysator", "Varieert"],
        ["Chloor-alkali (historisch)", "Kwik-cel proces", "1 – 50 g Hg/ton Cl₂"],
        ["Tandheelkunde", "Amalgam (50% Hg)", "—"],
        ["Fluorescentielampen", "Amalgam", "3 – 5 mg/lamp"],
    ]
    add_table_from_data(doc, ["Industrie", "Bron", "Concentratie"], industry)
    
    add_styled_heading(doc, "Olie & Gas — Kwikspecifiek", level=2)
    add_bullet(doc, "Kwik komt VAN NATURE voor in geologische formaties")
    add_bullet(doc, "Seizoenspatronen: hogere concentraties in warme periodes")
    add_bullet(doc, "Aluminiumcorrosie: Hg + Al → amalgam → intergranulaire corrosie → catastrofaal falen")
    add_bullet(doc, "EU-emissiebeleid: Nederlandse gaswinning onderhevig aan monitoring")
    
    doc.add_page_break()
    
    # ── Module 3 ──
    add_styled_heading(doc, "Module 3: Blootstellingsroutes en Toxicokinetiek", level=1)
    
    add_styled_heading(doc, "Absorptiepercentages", level=2)
    abs_data = [
        ["Inhalatie (damp)", "~80%", "~10-30%", "~60-80%"],
        ["Dermal", "<0,01%", "~2-5%", "~5-10%"],
        ["Oraal (GI)", "<0,01%", "~7-15%", ">95%"],
    ]
    add_table_from_data(doc, ["Route", "Elementair Hg⁰", "Anorganisch Hg²⁺", "Methylkwik"], abs_data)
    
    add_styled_heading(doc, "Distributie in het lichaam", level=2)
    add_bullet(doc, "Hg⁰: Longen → bloed → BBB → hersenen, nieren. Oxideert tot Hg²⁺.")
    add_bullet(doc, "Hg²⁺: Bloed → bindt aan glutathion → accumuleert in nieren, lever")
    add_bullet(doc, "CH₃Hg⁺: GI → bloed → BBB → hersenen → PLACENTA → fetus (10-50× hoger dan moederbloed)")
    add_bullet(doc, "Bindt aan sulfhydrylgroepen (−SH) → enzymdisruptie")
    
    add_styled_heading(doc, "Biologische halfwaardetijden", level=2)
    half_life = [
        ["Hg⁰ (heel lichaam)", "~58 dagen"],
        ["Hg²⁺ (nieren)", "~30-60 dagen"],
        ["CH₃Hg⁺ (heel lichaam)", "~70-80 dagen"],
        ["CH₃Hg⁺ (hersenen)", "~230 dagen"],
    ]
    add_table_from_data(doc, ["Vorm / Orgaan", "Halfwaardetijd"], half_life)
    
    add_styled_heading(doc, "Uitscheiding", level=2)
    add_bullet(doc, "Anorganisch: Urine (>80%), feces, zweet, speeksel")
    add_bullet(doc, "Methylkwik: Feces (~90%), urine (minimaal)")
    add_bullet(doc, "Haren/nagels: passieve uitscheiding — historische biomarker")
    
    doc.add_page_break()
    
    # ── Module 4 ──
    add_styled_heading(doc, "Module 4: Gezondheidseffecten", level=1)
    
    add_styled_heading(doc, "Acute blootstelling", level=2)
    acute = [
        ["Chemische pneumonitis", "Hg⁰ damp", ">1-5 mg/m³"],
        ["Stomatitis, kwiklijn", "Alle vormen", "Variabel"],
        ["Braken, diarree, abdominale pijn", "Hg²⁺ zouten (oraal)", ">50 mg"],
        ["Tremor, ataxie, dysartrie", "Hg⁰ damp", ">0,5 mg/m³"],
        ["Shock, nierfalen", "HgCl₂ (oraal)", ">1 g (potentieel fataal)"],
    ]
    add_table_from_data(doc, ["Symptoom", "Kwikvorm", "Blootstellingsniveau"], acute)
    
    add_styled_heading(doc, "Chronisch — Elementair kwik", level=2)
    chronic = [
        ["Tremor ('hatter's shakes')", ">50 µg/m³", "Cerebellaire disfunctie"],
        ["Erethisme", ">25 µg/m³", "Prikkelbaarheid, geheugenverlies, depressie"],
        ["Nefrotoxiciteit", ">25 µg/g creatinine", "Tubulaire schade, proteinurie"],
        ["Neurocognitieve achteruitgang", ">20 µg/m³", "Concentratie-, geheugenverlies"],
    ]
    add_table_from_data(doc, ["Effect", "Drempelwaarde", "Mechanisme"], chronic)
    
    add_styled_heading(doc, "Minamata Disease (Methylkwik)", level=2)
    add_bullet(doc, "Cerebellaire ataxie: coördinatieverlies, wankelgang")
    add_bullet(doc, "Gezichtsveldbeperking, gehoorverlies, spasticiteit")
    add_bullet(doc, "Perifere neuropathie: paresthesieën handen/voeten")
    add_bullet(doc, "Fetaal: microcefalie, verstandelijke beperking, blindheid, doofheid")
    add_body(doc, "Historisch: Minamata Japan 1956, Niigata 1965, Irak 1971-72", italic=True)
    
    doc.add_page_break()
    
    # ── Module 5 ──
    add_styled_heading(doc, "Module 5: Wettelijk Kader", level=1)
    
    add_styled_heading(doc, "Nederlandse Arbowaarden", level=2)
    arbo = [
        ["MAC-waarde (TWA-8h)", "0,025 mg/m³", "Arbobesluit bijlage XI-A"],
        ["STEL (15 min)", "0,075 mg/m³ (3× MAC)", "Arbobesluit"],
        ["BGW — Urine", "<20 µg/g creatinine", "SER"],
        ["BGW — Bloed", "<15 µg/L totaal Hg", "SER"],
        ["Actiewaarde", "0,0125 mg/m³ (50% MAC)", "Arbobesluit"],
    ]
    add_table_from_data(doc, ["Parameter", "Waarde", "Referentie"], arbo)
    
    add_styled_heading(doc, "EU- en internationale classificatie", level=2)
    classif = [
        ["EU CLP/REACH", "SVHC", "Substance of Very High Concern"],
        ["EU KMR", "Repr. 1B (H360Df)", "Schadelijk voor ongeboren kind"],
        ["EU KMR", "STOT RE 1 (H372)", "Specifieke doelorgaan toxiciteit"],
        ["IARC", "Groep 3", "Niet classificeerbaar carcinogeen"],
        ["EU CLP", "Aquatic Acute/Chronic 1", "Zeer toxisch waterorganismen"],
    ]
    add_table_from_data(doc, ["Kader", "Classificatie", "Detail"], classif)
    
    add_styled_heading(doc, "Belangrijke verordeningen", level=2)
    add_bullet(doc, "EU Verordening 2017/852: verbod productie/import/export kwik")
    add_bullet(doc, "Minamata Convention (UNEP 2013): 140+ landen, NL geratificeerd 2017")
    add_bullet(doc, "REACH: SVHC, autorisatieplicht, Restrictie Annex XVII")
    add_bullet(doc, "NCvB: GEO 1801 (kwikintoxicatie), GEO 1802 (kwiknefrose) — meldingsplicht")
    
    doc.add_page_break()
    
    # ── Module 6 ──
    add_styled_heading(doc, "Module 6: Meten en Monitoring", level=1)
    
    add_styled_heading(doc, "Luchtmetingen", level=2)
    air_meas = [
        ["Jerome 411-X", "Gold film amperometrie", "0,003 mg/m³", "Draagbaar, real-time"],
        ["Lumex RA-915+", "Zeeman-AAS", "0,001 mg/m³", "Draagbaar, hoog gevoelig"],
        ["Hopcalite tube", "Adsorptie + lab AAS/AFS", "0,0005 mg/m³", "TWA-bemonstering"],
        ["Pump + tube (NIOSH)", "Persoonlijke bemonstering", "0,001 mg/m³", "Persoonlijke blootstelling"],
    ]
    add_table_from_data(doc, ["Instrument", "Principe", "Detectielimiet", "Toepassing"], air_meas)
    
    add_styled_heading(doc, "Biologische monitoring", level=2)
    bio = [
        ["Totaal kwik", "Urine", "Anorganisch Hg²⁺", "<20 µg/g creatinine", "Halfjaarlijks"],
        ["Totaal kwik", "Bloed", "Totaal Hg", "<15 µg/L", "Acute incidenten"],
        ["Methylkwik", "Bloed", "CH₃Hg⁺ specifiek", "<15 µg/L (totaal)", "Indicatiegericht"],
        ["Totaal kwik", "Haren/nagels", "CH₃Hg⁺ (historisch)", "Geen limiet", "Forensisch"],
    ]
    add_table_from_data(doc, ["Parameter", "Matrix", "Vorm", "Grenswaarde", "Frequentie"], bio)
    
    add_styled_heading(doc, "Meetstrategie (NEN-EN 689)", level=2)
    add_bullet(doc, "Minimaal 3 representatieve metingen per werkplek/functie")
    add_bullet(doc, "Groep 1 (<10% MAC), Groep 2 (10-50%), Groep 3 (>50%)")
    add_bullet(doc, "TWA = 8-uur gemiddelde; STEL = 15-minuut gemiddelde")
    
    doc.add_page_break()
    
    # ── Module 7 ──
    add_styled_heading(doc, "Module 7: STOP-strategie", level=1)
    add_body(doc, "Hiërarchie: Bron → Technisch → Organisatorisch → Persoonlijk (IN DEZE VOLGORDE!)", bold=True)
    
    add_styled_heading(doc, "S — Bronmaatregelen", level=2)
    source = [
        ["Digitale sensoren", "★★★★★", "Eliminatie"],
        ["MRU (actieve kool)", "★★★★☆", "Sterke reductie"],
        ["Amalgamvrije tandheelkunde", "★★★★★", "Eliminatie"],
        ["LED-verlichting", "★★★★★", "Eliminatie"],
        ["Membranelektrolyse", "★★★★★", "Eliminatie"],
    ]
    add_table_from_data(doc, ["Maatregel", "Effectiviteit", "Niveau"], source)
    
    add_styled_heading(doc, "T — Technische maatregelen", level=2)
    add_bullet(doc, "Lokale afzuiging: minimaal 0,5 m/s vangsnelheid (EN 14175)")
    add_bullet(doc, "Ventilatie: minimaal 6 ACH in kwikwerkruimtes")
    add_bullet(doc, "Mercurysorb-filters (koper/zink-sulfide of geïmpregneerde actieve kool)")
    add_bullet(doc, "Gesloten systemen: gastight verbindingen, double-seal")
    add_bullet(doc, "Continue kwikdampmonitoring met alarm (>50% MAC)")
    
    add_styled_heading(doc, "O — Organisatorische maatregelen", level=2)
    add_bullet(doc, "Werkvergunning verplicht bij kwikblootstellingsrisico")
    add_bullet(doc, "Blootstellingsregister per medewerker")
    add_bullet(doc, "Jobrotatie: maximale blootstellingstijd per shift")
    add_bullet(doc, "PAGO met biologische monitoring")
    add_bullet(doc, "Jaarlijkse herhalingstraining")
    add_bullet(doc, "Zwangere vrouwen en <18 jaar: GEEN werk met kwik (Repr. 1B)")
    
    add_styled_heading(doc, "P — Persoonlijke beschermingsmiddelen", level=2)
    pbm = [
        ["Adembescherming", "P3 + gasfilter Hg (EN 371)", "Blootstelling >actiewaarde of spill"],
        ["Handschoenen", "Nitril, minimaal 0,5 mm, dubbel", "Contact met kwikhoudend materiaal"],
        ["Beschermende kleding", "Wegwerp overal type 5/6", "Kwikwerkruimtes"],
        ["Veiligheidsbril", "Spatbril of gezichtsscherm", "Spill-gevoelig werk"],
        ["Hygiëne", "NIET eten/drinken/roken op werkplek", "Altijd"],
    ]
    add_table_from_data(doc, ["PBM", "Specificatie", "Toepassing"], pbm)
    
    add_styled_heading(doc, "Spill-kit inhoud", level=2)
    add_bullet(doc, "Zwavelpoeder → vormt HgS (stabiel, niet-vluchtig)")
    add_bullet(doc, "Amalgamerende spons")
    add_bullet(doc, "Speciale stofzuiger (HEPA + actieve kool) — NOOIT standaard stofzuiger!")
    add_bullet(doc, "Afsluitbare containers (glas/HDPE)")
    add_bullet(doc, "PBM-set + instructiekaart")
    
    add_styled_heading(doc, "Decontaminatieprotocol (10 stappen)", level=2)
    decon_steps = [
        "Zone afzetten — minimum 3 m rondom spill",
        "Ventilatie maximaliseren — geen recirculatie",
        "PBM dragen — masker P3+Hg, handschoenen, overal, bril",
        "Zwavelpoeder royaal aanbrengen over kwikdruppels",
        "15 minuten laten reageren (HgS-vorming)",
        "Opruimen met amalgamerende spons → afsluitbare container",
        "Oppervlak decontamineren (detergent + zwaveloplossing)",
        "Nmeten — concentratie moet <0,025 mg/m³ zijn",
        "Afvoer als gevaarlijk afval (Euralcode 16 05 06*)",
        "Documenteren — incidentenrapport, metingsrapport, afvoerbon",
    ]
    for i, step in enumerate(decon_steps, 1):
        add_bullet(doc, f"{i}. {step}")
    
    doc.add_page_break()
    
    # ── Module 8 ──
    add_styled_heading(doc, "Module 8: Kwik in Olie & Gas", level=1)
    
    add_styled_heading(doc, "Kwikconcentratievariabiliteit", level=2)
    var_factors = [
        ["Reservoortype", "Gascondensaatvelden: hoger dan droge gasvelden"],
        ["Temperatuur", "Hogere temperatuur → meer Hg in gasfase"],
        ["Seizoen", "Zomer: hogere concentraties (verhoogde dampdruk)"],
        ["Putlocatie", "Variatie factor 10-100 tussen putten in zelfde veld"],
        ["Productiefase", "Depletion: concentratie kan stijgen of dalen"],
    ]
    add_table_from_data(doc, ["Factor", "Invloed"], var_factors)
    
    add_styled_heading(doc, "Aluminiumcorrosie — Catastrofaal falen", level=2)
    add_body(doc, "Hg⁰ → Contact Al → Amalgam → Intergranulaire corrosie → Wanddikte vermindering → Catastrofaal falen")
    add_body(doc, "In LNG cryogene installaties (−162°C): brittle fracture → explosie/lekkage risico")
    add_body(doc, "Zelfs lage concentraties (<10 µg/Nm³) kunnen op termijn leiden tot corrosie!", bold=True)
    
    add_styled_heading(doc, "MRU Types", level=2)
    mru = [
        ["Actieve kool (geïmpregneerd)", "Adsorptie + chemisorptie", ">99%"],
        ["Sulfur-geïmpregneerde kool", "HgS-binding", ">99,5%"],
        ["Metaloxide sorbent", "Chemisorptie ZnO/CuO", ">99%"],
        ["Koudetrappers (cryogenic)", "Condensatie", ">95%"],
    ]
    add_table_from_data(doc, ["Type MRU", "Principe", "Efficiëntie"], mru)
    
    add_styled_heading(doc, "Case Study: Skikda LNG (2004)", level=2)
    add_bullet(doc, "Locatie: Skikda LNG complex, Sonatrach, Algerije")
    add_bullet(doc, "Explosie in LNG trein — 27 doden, 74 gewonden")
    add_bullet(doc, "Kwik-gerelateerde aluminiumcorrosie als BIJDRAGENDE factor")
    add_bullet(doc, "Les: materiaalselectie (geen Al bij Hg) en monitoring zijn essentieel")
    
    doc.add_page_break()
    
    # ── Module 9 ──
    add_styled_heading(doc, "Module 9: Noodprocedure bij Kwikspill", level=1)
    
    add_styled_heading(doc, "Kleine spill (<25 ml / ~340 g)", level=2)
    small_spill = [
        ["1", "Zone evacueren (3 m)", "Eerste medewerker"],
        ["2", "Ventilatie maximaliseren", "Eerste medewerker"],
        ["3", "SBD/leidinggevende informeren", "Eerste medewerker"],
        ["4", "Spill-kit halen, PBM dragen", "Getrainde medewerker"],
        ["5", "Zwavelpoeder aanbrengen", "Getrainde medewerker"],
        ["6", "15 minuten laten reageren", "—"],
        ["7", "Opruimen → afsluitbare container", "Getrainde medewerker"],
        ["8", "Oppervlak decontamineren", "Getrainde medewerker"],
        ["9", "Nmeten — <0,025 mg/m³", "HSEQ"],
        ["10", "Zone vrijgeven", "HSEQ"],
    ]
    add_table_from_data(doc, ["Stap", "Actie", "Verantwoordelijke"], small_spill)
    
    add_styled_heading(doc, "Grote spill (>25 ml / onbekend)", level=2)
    add_bullet(doc, "ALGEMEEN ALARM / ONTRUIMING")
    add_bullet(doc, "Afsluiten ventilatie (recirculatie UIT, exhaust AAN)")
    add_bullet(doc, "Zone afzetten — minimum 10 m, toegang verboden")
    add_bullet(doc, "Professionele saneringsfirma inschakelen")
    add_bullet(doc, "Continue monitoring + documentatie")
    
    add_styled_heading(doc, "Brand met kwik", level=2)
    add_bullet(doc, "Blussen met DROOG POEDER of CO₂ — NOOIT WATER")
    add_bullet(doc, "Na brand: volledige kwikdampmeting en -sanering")
    
    add_styled_heading(doc, "Persoonlijke besmetting", level=2)
    personal = [
        ["Kwik op huid", "Wassen met water en zeep (geen oplosmiddelen)"],
        ["Kwik op kleding", "Uittrekken → gevaarlijk afval"],
        ["Kwik in oog", "Minimaal 15 min spoelen lauw water → medische controle"],
        ["Inademing damp", "Direct frisse lucht → medische controle"],
        ["Ingestie", "Direct medische hulp — GEEN braken opwekken"],
    ]
    add_table_from_data(doc, ["Situatie", "Actie"], personal)
    
    doc.add_page_break()
    
    # ── Module 10 ──
    add_styled_heading(doc, "Module 10: Praktijk en Casuïstiek", level=1)
    
    add_styled_heading(doc, "Casus 1: Gebroken thermometer in kelder", level=2)
    add_body(doc, "Situatie: Gebroken kwikthermometer in kelderopslag, zilveren druppels op betonnen vloer, beperkte ventilatie.")
    add_body(doc, "Correcte procedure:", bold=True)
    add_bullet(doc, "SBD/leidinggevende waarschuwen — niet zelf opruimen")
    add_bullet(doc, "Kelder afsluiten, ventilatie maximaliseren")
    add_bullet(doc, "Getrainde medewerker met spill-kit + PBM")
    add_bullet(doc, "Zwavelpoeder → 15 min → opruimen → meting")
    add_bullet(doc, "Kelder pas vrijgeven na <0,025 mg/m³")
    add_body(doc, "Leerpunt: Kwikdamp is zwaarder dan lucht — accumuleert in kelders.", italic=True)
    
    add_styled_heading(doc, "Casus 2: Kwikverdacht materiaal bij pijpleiding", level=2)
    add_body(doc, "Situatie: Donkere afzetting in filter/separator aardgaspijpleiding. Geen MRU upstream.")
    add_body(doc, "Correcte procedure:", bold=True)
    add_bullet(doc, "Niet aanraken — gastight monstername")
    add_bullet(doc, "Analyse op kwik (CV-AAS of ICP-MS)")
    add_bullet(doc, "Bij bevestiging: gevaarlijk afval + risicobeoordeling (aluminium?)")
    add_bullet(doc, "Advies: MRU installeren, materiaalkeuze herzien")
    add_body(doc, "Leerpunt: Afwezigheid MRU ≠ afwezigheid kwik.", italic=True)
    
    add_styled_heading(doc, "Casus 3: Fluorescentielampen vervangen", level=2)
    add_body(doc, "Situatie: 50 fluorescentielampen vervangen, 1 lamp breekt.")
    add_body(doc, "Correcte procedure:", bold=True)
    add_bullet(doc, "Ruimte evacueren (15 min ventilatie)")
    add_bullet(doc, "Opruimen met dik karton/papier — GEEN stofzuiger!")
    add_bullet(doc, "Fragmenten met tape oprapen")
    add_bullet(doc, "Afvoer als klein chemisch afval (20 01 23*)")
    add_body(doc, "Leerpunt: 3-5 mg kwik per lamp. Cumulatie bij grootschalig vervangen.", italic=True)
    
    doc.add_page_break()
    
    # ── Key Messages ──
    add_styled_heading(doc, "Key Messages", level=1)
    key_msgs = [
        "Kwikdamp is onzichtbaar én reukloos — je merkt het niet tot het te laat is",
        "MAC-waarde is 0,025 mg/m³ — bij >50% (actiewaarde 0,0125) zijn maatregelen verplicht",
        "STOP-strategie: Bron → Technisch → Organisatorisch → Persoonlijk (in deze volgorde!)",
        "Kwik in aardgas is reëel — MRU en materiaalselectie zijn noodzaak",
        "NOOIT standaard stofzuiger bij kwik — dampverspreiding",
        "Biologische monitoring: urine <20 µg/g creatinine, bloed <15 µg/L",
        "Zwangere vrouwen: geen werk met kwik (Repr. 1B — H360Df)",
        "Bij spill: altijd meten ná opruiming — pas vrijgeven bij <0,025 mg/m³",
    ]
    for i, msg in enumerate(key_msgs, 1):
        add_bullet(doc, f"{i}. {msg}")
    
    doc.add_page_break()
    
    # ── Quiz ──
    add_styled_heading(doc, "Quiz — Kenniscontrole (15 vragen)", level=1)
    add_body(doc, "Cirkel het juiste antwoord. Eén antwoord per vraag.")
    
    quiz_questions = [
        ("V1", "Wat is de dampdruk van elementair kwik bij 20°C?", [
            "A) 0,00012 mmHg", "B) 0,00185 mmHg", "C) 0,0185 mmHg", "D) 0,185 mmHg"
        ]),
        ("V2", "Wat is de Nederlandse MAC-waarde (TWA-8h) voor kwikdamp?", [
            "A) 0,010 mg/m³", "B) 0,025 mg/m³", "C) 0,050 mg/m³", "D) 0,100 mg/m³"
        ]),
        ("V3", "Welke blootstellingsroute heeft de hoogste absorptie voor elementair kwik?", [
            "A) Orale opname (~50%)", "B) Dermal contact (~30%)", "C) Inhalatie (~80%)", "D) Oogcontact (~10%)"
        ]),
        ("V4", "Wat is de IARC-classificatie voor kwik?", [
            "A) Groep 1", "B) Groep 2A", "C) Groep 2B", "D) Groep 3"
        ]),
        ("V5", "Wat is de biologische halfwaardetijd van methylkwik in de hersenen?", [
            "A) ~30 dagen", "B) ~70 dagen", "C) ~150 dagen", "D) ~230 dagen"
        ]),
        ("V6", "Een medewerker breekt een fluorescentielamp in een kelder. Eerste actie?", [
            "A) Direct opruimen met bezem", "B) Kelder evacueren en ventileren", "C) Standaard stofzuiger gebruiken", "D) Fragmenten in prullenbak"
        ]),
        ("V7", "Kwikmeting: 0,018 mg/m³ (TWA-8h). Wat is correct?", [
            "A) Geen actie nodig", "B) Actiewaarde overschreden — AH-strategie verplicht", "C) Direct ontruimen", "D) Alleen PBM dragen"
        ]),
        ("V8", "Welke PBM-combinatie is correct voor kwikdamp?", [
            "A) FFP2 + katoenen handschoenen", "B) P3 + Hg filter + nitril handschoenen", "C) P3-filter + latex handschoenen", "D) Mondkapje + veiligheidsbril"
        ]),
        ("V9", "Laatste stap vóór vrijgave zone bij kleine kwikspill:", [
            "A) Afvoerbon invullen", "B) Kwikdampmeting — <0,025 mg/m³", "C) Vloer dweilen met water", "D) Incident rapporteren aan pers"
        ]),
        ("V10", "Aluminium in cryogenic heat exchangers + kwik = ?", [
            "A) Geen risico", "B) Amalgam → intergranulaire corrosie → catastrofaal falen", "C) Alleen oppervlakteroest", "D) Verhoogde thermische geleidbaarheid"
        ]),
        ("V11", "Medewerker: trillende handen, prikkelbaarheid. Urine: 35 µg/g creatinine. Conclusie?", [
            "A) Niet werkgerelateerd", "B) BGW overschreden — werkplek stilleggen, medische evaluatie", "C) Acceptable — toeval", "D) Bloedmeting vereist"
        ]),
        ("V12", "Aardgasveld: piek 3.000 µg/Nm³. MRU efficiëntie 99,5%. Resterend?", [
            "A) 0,15 µg/Nm³", "B) 15 µg/Nm³", "C) 150 µg/Nm³", "D) 1.500 µg/Nm³"
        ]),
        ("V13", "Bodem: 25 mg/kg Hg. Interventiewaarde: 10 mg/kg. Actie?", [
            "A) Geen sanering", "B) Sanering vereist conform Wet bodembescherming", "C) Alleen monitoren", "D) Gewoon doorwerken"
        ]),
        ("V14", "Zwangere medewerkster in lab met kwikverbindingen. Repr. 1B. Actie?", [
            "A) Geen beperkingen", "B) PBM voldoende", "C) Herplaatsing naar kwikvrije werkplek", "D) Schriftelijke toestemming bedrijfsarts"
        ]),
        ("V15", "Zwavelpoeder + kwik = welk reactieproduct?", [
            "A) HgSO₄ (oplosbaar)", "B) HgS kinzinnabar (stabiel, niet-vluchtig)", "C) Hg₂S (onstabiel)", "D) HgO (vluchtig)"
        ]),
    ]
    
    for code, question, options in quiz_questions:
        add_body(doc, f"{code}. {question}", bold=True)
        for opt in options:
            p = doc.add_paragraph(f"    {opt}")
            for run in p.runs:
                run.font.size = Pt(10)
        doc.add_paragraph()
    
    doc.add_page_break()
    
    # ── Praktijke Opdracht ──
    add_styled_heading(doc, "Praktijke Opdracht: Kwik-Risicobeoordeling", level=1)
    add_body(doc, "Doel: Pas de STOP-strategie en kwikspecifieke kennis toe op een realistische werksituatie.", italic=True)
    add_body(doc, "Werkgroep: 3-4 personen | Duur: 30-45 min")
    
    add_styled_heading(doc, "Situatie", level=2)
    add_body(doc, "Je bent HSEQ-coördinator op een gasopwerkingsstation. Tijdens een routine-inspectie constateer je:")
    sit_items = [
        "Aardgas met 150 µg/Nm³ kwikconcentratie",
        "MRU: 3 maanden geleden laatst onderhouden (interval: 6 maanden)",
        "4 aluminium heat exchangers (in bedrijf sinds 2008)",
        "12 kwikthermometers als back-up",
        "Laatste bio-monitoring: 14 maanden geleden (toen: 8 µg/g creatinine)",
        "Spill-kit: niet gecontroleerd sinds 2 jaar",
        "Medewerker meldt: trillende vingers, concentratieproblemen",
    ]
    for item in sit_items:
        add_bullet(doc, item)
    
    add_styled_heading(doc, "Deel A — Risicobeoordeling (15 min)", level=2)
    add_body(doc, "1. Classificeer elk punt volgens de STOP-strategie")
    add_body(doc, "2. Bepaal prioriteit (kritiek / hoog / medium / laag) met argumentatie")
    add_body(doc, "3. Identificeer acute vs. chronische risico's")
    
    add_styled_heading(doc, "Deel B — Actieplan (15 min)", level=2)
    add_body(doc, "1. Stel een concreet actieplan op met minimaal 8 acties")
    add_body(doc, "2. Per actie: verantwoordelijke, deadline, middelen")
    add_body(doc, "3. Welke acties vereisen onmiddellijke uitvoering (<24 uur)?")
    
    add_styled_heading(doc, "Deel C — Rapportage (10 min)", level=2)
    add_body(doc, "1. Management summary (max. 200 woorden)")
    add_body(doc, "2. Welke wettelijke kaders worden overschreden?")
    add_body(doc, "3. Advies aan de directie")
    
    # Work space
    doc.add_page_break()
    add_styled_heading(doc, "Werkruimte — Deel A: STOP-classificatie", level=2)
    
    ws_table = doc.add_table(rows=9, cols=4)
    ws_table.style = 'Table Grid'
    headers = ["Geconstateerd punt", "STOP-laag", "Prioriteit", "Argumentatie"]
    for j, h in enumerate(headers):
        ws_table.rows[0].cells[j].text = h
    style_table(ws_table)
    
    doc.add_page_break()
    add_styled_heading(doc, "Werkruimte — Deel B: Actieplan", level=2)
    
    ap_table = doc.add_table(rows=9, cols=4)
    ap_table.style = 'Table Grid'
    ap_headers = ["Actie", "Verantwoordelijke", "Deadline", "Middelen"]
    for j, h in enumerate(ap_headers):
        ap_table.rows[0].cells[j].text = h
    style_table(ap_table)
    
    doc.add_page_break()
    add_styled_heading(doc, "Werkruimte — Deel C: Management Summary", level=2)
    for _ in range(15):
        doc.add_paragraph("_" * 80)
    
    doc.add_page_break()
    add_styled_heading(doc, "Notities", level=2)
    for _ in range(25):
        doc.add_paragraph("_" * 80)
    
    # ── Footer ──
    doc.add_paragraph()
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("Cursisten Werkboek v1.0 — JVG Safety Training — 15 april 2026")
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x99, 0x99, 0x99)
    run.italic = True
    
    doc.save(OUT_CURSIST)
    print(f"✅ Cursisten Werkboek opgeslagen: {OUT_CURSIST}")


if __name__ == "__main__":
    os.makedirs(os.path.dirname(OUT_DOCENT), exist_ok=True)
    build_docentenhandleiding()
    build_cursisten_werkboek()
    print("\n✅ Beide DOCX-bestanden gegenereerd.")
