#!/usr/bin/env python3
"""Generate Kwik Awareness Training PPTX — JvG huisstijl #003366."""

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

# ── Config ──────────────────────────────────────────────────────────
OUTPUT = "/root/projects/jg/2026-pbm-KWIK/deliverables/pptx/kwik-awareness_v1.0.pptx"
LOGO   = "/root/projects/jg/assets/branding/jvg-logo-white-large.png"

DARK   = RGBColor(0x00, 0x33, 0x66)   # #003366
WHITE  = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT  = RGBColor(0xE8, 0xEE, 0xF4)   # subtle bg
ACCENT = RGBColor(0x00, 0x7B, 0xBF)   # lighter blue accent
DARK_TEXT = RGBColor(0x1A, 0x1A, 0x1A)
GRAY   = RGBColor(0x66, 0x66, 0x66)

prs = Presentation()
prs.slide_width  = Inches(13.333)
prs.slide_height = Inches(7.5)
SLD_W = prs.slide_width
SLD_H = prs.slide_height

# ── Helpers ─────────────────────────────────────────────────────────
def add_bg(slide, color):
    bg = slide.background
    fill = bg.fill
    fill.solid()
    fill.fore_color.rgb = color

def add_rect(slide, left, top, width, height, fill_color, alpha=None):
    shp = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, height)
    shp.fill.solid()
    shp.fill.fore_color.rgb = fill_color
    shp.line.fill.background()
    return shp

def add_textbox(slide, left, top, width, height, text, font_size=18, color=WHITE, bold=False, alignment=PP_ALIGN.LEFT, font_name="Calibri"):
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame
    tf.word_wrap = True
    p = tf.paragraphs[0]
    p.text = text
    p.font.size = Pt(font_size)
    p.font.color.rgb = color
    p.font.bold = bold
    p.font.name = font_name
    p.alignment = alignment
    return txBox

def add_bullet_slide(slide, bullets, left, top, width, height, font_size=16, color=DARK_TEXT, spacing=Pt(6)):
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame
    tf.word_wrap = True
    for i, bullet in enumerate(bullets):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        p.text = bullet
        p.font.size = Pt(font_size)
        p.font.color.rgb = color
        p.font.name = "Calibri"
        p.space_after = spacing
        p.level = 0
    return txBox

def add_logo(slide, left=Inches(0.4), top=Inches(0.3)):
    if os.path.exists(LOGO):
        slide.shapes.add_picture(LOGO, left, top, height=Inches(0.6))

def add_footer(slide, text="JvG HSEQ — Awareness Training Kwik"):
    add_rect(slide, Inches(0), Inches(7.1), SLD_W, Inches(0.4), DARK)
    add_textbox(slide, Inches(0.5), Inches(7.12), Inches(10), Inches(0.35), text, font_size=10, color=WHITE)

def make_content_slide(title_text, bullets=None, sub_text=None, extra_blocks=None):
    """Standard content slide: dark header bar, logo, footer, bullets."""
    slide = prs.slides.add_slide(prs.slide_layouts[6])  # blank
    add_bg(slide, WHITE)
    # Header bar
    add_rect(slide, Inches(0), Inches(0), SLD_W, Inches(1.2), DARK)
    add_logo(slide)
    add_textbox(slide, Inches(1.2), Inches(0.25), Inches(11), Inches(0.7), title_text, font_size=30, color=WHITE, bold=True)
    # Subtitle
    if sub_text:
        add_textbox(slide, Inches(1.2), Inches(0.85), Inches(11), Inches(0.35), sub_text, font_size=14, color=RGBColor(0xAA,0xCC,0xEE))
    # Bullets
    if bullets:
        add_bullet_slide(slide, bullets, Inches(0.8), Inches(1.5), Inches(11.5), Inches(5.4), font_size=17, color=DARK_TEXT)
    # Extra blocks (list of dicts with 'title','items')
    if extra_blocks:
        y = Inches(1.5)
        for block in extra_blocks:
            add_textbox(slide, Inches(0.8), y, Inches(11.5), Inches(0.4), block.get('title',''), font_size=20, color=DARK, bold=True)
            y += Inches(0.45)
            if block.get('items'):
                add_bullet_slide(slide, block['items'], Inches(1.0), y, Inches(11.3), Inches(4.5), font_size=15, color=DARK_TEXT, spacing=Pt(4))
                y += Inches(0.35) * min(len(block['items']), 8)
    add_footer(slide)
    return slide

def make_section_divider(module_num, title, subtitle=""):
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_bg(slide, DARK)
    add_rect(slide, Inches(0), Inches(3.0), SLD_W, Inches(0.06), ACCENT)
    add_textbox(slide, Inches(1), Inches(2.0), Inches(11), Inches(0.8), f"MODULE {module_num}", font_size=22, color=ACCENT, bold=True)
    add_textbox(slide, Inches(1), Inches(3.3), Inches(11), Inches(1.2), title, font_size=40, color=WHITE, bold=True)
    if subtitle:
        add_textbox(slide, Inches(1), Inches(4.6), Inches(11), Inches(0.6), subtitle, font_size=18, color=RGBColor(0xAA,0xCC,0xEE))
    add_footer(slide, "JvG HSEQ — Awareness Training Kwik")
    return slide

# ── SLIDE 1: Title ─────────────────────────────────────────────────
slide = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(slide, DARK)
add_rect(slide, Inches(0), Inches(3.5), SLD_W, Inches(0.06), ACCENT)
if os.path.exists(LOGO):
    slide.shapes.add_picture(LOGO, Inches(5.7), Inches(0.6), height=Inches(1.2))
add_textbox(slide, Inches(1), Inches(2.2), Inches(11.3), Inches(1.0), "AWARENESS TRAINING", font_size=20, color=ACCENT, bold=True, alignment=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(3.8), Inches(11.3), Inches(1.5), "Kwik (Mercury / Hg)", font_size=48, color=WHITE, bold=True, alignment=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(5.3), Inches(11.3), Inches(0.5), "Olie, Gas, Petrochemie & Offshore", font_size=20, color=RGBColor(0xAA,0xCC,0xEE), alignment=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(5.8), Inches(11.3), Inches(0.5), "Niveau: Gevorderd  |  Duur: 30–45 min  |  Versie v1.0 — April 2026", font_size=14, color=GRAY, alignment=PP_ALIGN.CENTER)
add_footer(slide)

# ── SLIDE 2: Agenda ────────────────────────────────────────────────
agenda_items = [
    "1.  Kwik — Eigenschappen en Vormen",
    "2.  Kwik in de Industrie — Bronnen en Toepassingen",
    "3.  Blootstellingsroutes en Toxicokinetiek",
    "4.  Gezondheidseffecten — Acuut en Chronisch",
    "5.  Wettelijk Kader — OEL's en Classificatie",
    "6.  Meten en Monitoring",
    "7.  Preventieve Maatregelen — STOP-strategie",
    "8.  Kwik in Olie & Gas — Specifieke Risico's",
    "9.  Noodprocedure bij Kwikspill",
    "10. Praktijk en Casuïstiek",
]
make_content_slide("Agenda", agenda_items, sub_text="10 modules • 30–45 min")

# ── SLIDE 3: Leerdoelen (1/2) ──────────────────────────────────────
ld1 = [
    "1. De drie kwikvormen (elementair, anorganisch, organisch) benoemen en fysisch-chemische eigenschappen beschrijven",
    "2. Blootstellingsroutes kwantificeren (inhalatie 80%, dermaal, oraal) en toxicokinetische distributie uitleggen",
    "3. Acute en chronische gezondheidseffecten onderscheiden per kwikvorm, inclusief drempelwaarden",
    "4. Nederlandse OEL-waarden (TWA-8h, STEL-15min) en biologische grenswaarden parafraseren uit het Arbobesluit",
]
make_content_slide("Leerdoelen (1/2)", ld1, sub_text="Na afronding kan de medewerker:")

# ── SLIDE 4: Leerdoelen (2/2) ──────────────────────────────────────
ld2 = [
    "5. De STOP-strategie (Bron, Technisch, Organisatorisch, Persoonlijk) toepassen op een kwikwerkpleksituatie",
    "6. Een kwikspill classificeren (klein/groot) en de juiste noodprocedure volgen",
    "7. Specifieke risico's van kwik in olie & gas (aluminiumcorrosie, MRU) benoemen en mitigerende maatregelen beschrijven",
    "8. Een kwikmeting interpreteren (OEL vs. biologische grenswaarde) en consequenties voor actie formuleren",
]
make_content_slide("Leerdoelen (2/2)", ld2, sub_text="Na afronding kan de medewerker:")

# ══════════════════════════════════════════════════════════════════
# MODULE 1: Eigenschappen en Vormen (3 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(1, "Kwik — Eigenschappen en Vormen", "3 min")

make_content_slide("Elementair Kwik (Hg⁰)", [
    "Enige metaal dat bij standaardomstandigheden vloeibaar is (smeltpunt −38,83°C, kookpunt 356,73°C)",
    "Zilverwit, metallische glans — dichtheid 13,534 g/cm³",
    "Dampdruk bij 20°C: 0,00185 mmHg — reeds aanzienlijk bij kamertemperatuur",
    "Dampdrukcurve: 40°C → 0,012 mmHg  |  100°C → 0,27 mmHg  |  250°C → 12 mmHg",
    "Relatieve dampdichtheid ~6,9 — accumuleert in lage ruimtes, kelders, putten",
    "Kwikdamp: kleurloos én reukloos — GEEN sensorische waarschuwing mogelijk",
], sub_text="Fysisch-chemische eigenschappen")

make_content_slide("Anorganische & Organische Kwikverbindingen", [
    "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 (HgS, cinnaber) — zeer laag oplosbaar, stabiele eindvorm bij decontaminatie",
    "",
    "Methylkwik (CH₃Hg⁺) — lipofiel, passeert BBB, halfwaardetijd hersenen ~230 dagen",
    "Dimethylkwik ((CH₃)₂Hg) — zeer vluchtig, extreem toxisch, breekvlamig",
    "Ethylkwik / Fenylkwik — historisch als fungicide (EU-verbod sinds 1991)",
], sub_text="Anorganisch: Hg²⁺ zouten  |  Organisch: methyl-, dimethyl-, ethyl-, fenylkwik")

# ══════════════════════════════════════════════════════════════════
# MODULE 2: Bronnen en Toepassingen (2 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(2, "Kwik in de Industrie", "Bronnen en Toepassingen • 4 min")

make_content_slide("Typische Kwikconcentraties per Industrie", [
    "Olie & gas — Aardgas: 0,1 – 5.000 µg/Nm³ (reservoir-afhankelijk)",
    "Olie & gas — Condensaat: 1 – 200 µg/kg",
    "Olie & gas — Ruwe olie: 0,01 – 10 mg/kg",
    "Petrochemie — PVC (HgCl₂ katalysator): varieert mg/kg",
    "Chloor-alkali (historisch): 1 – 50 g Hg/ton Cl₂",
    "Tandheelkunde — Amalgam: 50% Hg",
    "Fluorescentielampen: 3 – 5 mg/lamp",
    "Goudwinning — Amalgamatie: kg/locatie",
], sub_text="Kwik komt van nature voor in geologische formaties")

make_content_slide("Kwik in Olie & Gas — Specifiek", [
    "Aardgas: kwik van nature in geologische formaties; sterk variabel per veld",
    "Seizoenspatronen: hogere concentraties in warme periodes (verhoogde dampdruk)",
    "Corrosierisico: Hg + Al → amalgam → intergranulaire corrosie → catastrofaal falen",
    "EU-emissiebeleid: Nederlandse gaswinning onderhevig aan monitoring",
    "",
    "Uitdovende toepassingen:",
    "   • Chloor-alkali: membraanelektrolyse vervangt kwik-cel sinds ~2010",
    "   • Meetinstrumenten: digitale sensoren vervangen kwikthermometers",
    "   • Tandheelkunde: amalgam uitfaserend (EU-verbod <15 jaar vanaf jan 2025)",
])

# ══════════════════════════════════════════════════════════════════
# MODULE 3: Blootstellingsroutes (2 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(3, "Blootstellingsroutes en Toxicokinetiek", "4 min")

make_content_slide("Blootstellingsroutes en Absorptiepercentages", [
    "Elementair Hg⁰ — Inhalatie ~80% | Dermal <0,01% | Oraal <0,01%",
    "Anorganisch Hg²⁺ — Inhalatie ~10-30% | Dermal ~2-5% | Oraal ~7-15%",
    "Methylkwik CH₃Hg⁺ — Inhalatie ~60-80% | Dermal ~5-10% | Oraal >95%",
    "",
    "Distributie Hg⁰: Longen → bloedbaan → BBB → hersenen, nieren, lever",
    "   → oxideert in rode bloedcellen tot Hg²⁺",
    "Distributie Hg²⁺: bindt aan glutathion → accumuleert in nieren (prox. tubuli)",
    "Distributie CH₃Hg⁺: GI → bloed → BBB → cerebellaire cortex → PLACENTA (10-50× moeder)",
    "Bindt aan sulfhydrylgroepen (−SH) van eiwitten → enzymdisruptie",
], sub_text="Absorptie verschilt dramatisch per kwikvorm en route")

make_content_slide("Biologische Halfwaardetijden en Uitscheiding", [
    "Hg⁰ (heel lichaam): ~58 dagen",
    "Hg²⁺ (nieren): ~30-60 dagen",
    "CH₃Hg⁺ (heel lichaam): ~70-80 dagen",
    "CH₃Hg⁺ (hersenen): ~230 dagen — LANGE RETENTIE",
    "",
    "Uitscheiding anorganisch: urine (>80%), feces, zweet, speeksel",
    "Uitscheiding methylkwik: feces (~90%, enterohepatische cyclus), urine (minimaal)",
    "Haren/nagels: passieve uitscheiding — historische biomarker methylkwik",
])

# ══════════════════════════════════════════════════════════════════
# MODULE 4: Gezondheidseffecten (3 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(4, "Gezondheidseffecten", "Acuut en Chronisch • 5 min")

make_content_slide("Acute Blootstelling", [
    "Chemische pneumonitis — Hg⁰ damp >1-5 mg/m³",
    "Stomatitis, gingivitis, kwiklijn (blauwe lijn op tandvlees)",
    "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)",
])

make_content_slide("Chronische Blootstelling — Elementair & Kwikzouten", [
    "Tremor (\"hatter's shakes\") — cerebellaire/basale ganglia disfunctie — >50 µg/m³",
    "Erethisme — prikkelbaarheid, geheugenverlies, slapeloosheid, depressie — >25 µg/m³",
    "Nefrotoxiciteit — tubulaire schade, proteinurie — >25 µg/g creatinine",
    "Neurocognitieve achteruitgang — concentratie, geheugen, reactietijd — >20 µg/m³",
    "Autonome disfunctie — hartkloppingen, hyperhidrose",
    "",
    "Kwikzouten (Hg²⁺): proximale tubulusnecrose → proteinurie → nierfalen",
    "Kwiknefrose: erkende beroepsziekte (NCvB code 1802)",
    "",
    "Historisch: \"Mad as a Hatter\" — 18e/19e eeuw, Hg(NO₃)₂ in viltbehandeling",
])

make_content_slide("Chronische Blootstelling — Methylkwik (Minamata)", [
    "Cerebellaire ataxie — coördinatieverlies, wankelgang, dysmetrie",
    "Gezichtsveldbeperking — concentrische constrictie",
    "Gehoorverlies — sensorineuraal",
    "Spasticiteit — verhoogde spierspanning, hyperreflexie",
    "Perifere neuropathie — paresthesieën, handen en voeten",
    "",
    "Fetaal: ERNSTIGE cerebrale schade — microcefalie, verstandelijke beperking, blindheid, doofheid",
    "",
    "Minamata, Japan 1956 | Niigata 1965 | Irak 1971-72",
])

# ══════════════════════════════════════════════════════════════════
# MODULE 5: Wettelijk Kader (3 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(5, "Wettelijk Kader", "OEL's en Classificatie • 5 min")

make_content_slide("Nederlandse Arbowaarden", [
    "MAC-waarde (TWA-8h): 0,025 mg/m³ — Arbobesluit bijlage XI-A",
    "STEL (15 min): 0,075 mg/m³ (3× MAC)",
    "Actiewaarde: 0,0125 mg/m³ — bij >50% MAC: arbeidshygiënische strategie verplicht",
    "Biologische grenswaarde — Urine: <20 µg/g creatinine (SER)",
    "Biologische grenswaarde — Bloed: <15 µg/L totaal Hg (SER)",
])

make_content_slide("EU- en Internationale Classificatie", [
    "EU CLP/REACH: SVHC (Substance of Very High Concern)",
    "EU KMR: Repr. 1B (H360Df) — schadelijk voor ongeboren kind; vruchtbaarheid",
    "EU KMR: STOT RE 1 (H372) — doelorgaan toxiciteit (zenuwstelsel, nieren)",
    "IARC: Groep 3 — niet classificeerbaar carcinogeniciteit",
    "EU CLP: Aquatic Acute 1 (H400), Aquatic Chronic 1 (H410)",
    "",
    "EU Verordening 2017/852 — verbod productie/import/export kwik",
    "Minamata Convention (UNEP 2013) — 140+ landen, NL geratificeerd 2017",
    "REACH — SVHC, autorisatieplicht, Restrictie Annex XVII",
    "Arbobesluit art. 3.22-3.26 — veilige werkplek",
])

make_content_slide("Beroepsziektenregistratie (NCvB)", [
    "GEO 1801: Kwikintoxicatie (acute/chronische)",
    "GEO 1802: Kwiknefrose",
    "Melding: verplicht via bedrijfsarts bij vermoeden beroepsziekte",
    "Registratie: NCvB — Nederlands Centrum voor Beroepsziekten, AMC Amsterdam",
    "",
    "Afvalclassificatie:",
    "   • Kwikspill-materiaal: Euralcode 16 05 06* (gevaarlijk afval)",
    "   • MRU-sorbent (verzadigd): 16 05 06*",
    "   • Fluorescentielampen: 20 01 23*",
])

# ══════════════════════════════════════════════════════════════════
# MODULE 6: Meten en Monitoring (2 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(6, "Meten en Monitoring", "4 min")

make_content_slide("Lucht- en Biologische Monitoring", [
    "Jerome 411-X (gold film amperometrie) — 0,003 mg/m³, draagbaar real-time",
    "Lumex RA-915+ (Zeeman-AAS) — 0,001 mg/m³, hoge gevoeligheid",
    "Hopcalite tube + lab-analyse — 0,0005 mg/m³, TWA-bemonstering",
    "Persoonlijke bemonstering — NIOSH 6009/6007 — 0,001 mg/m³",
    "",
    "Biologisch — Urine: totaal Hg <20 µg/g creatinine (halfjaarlijks)",
    "Biologisch — Bloed: totaal Hg <15 µg/L (bij acute incidenten)",
    "Biologisch — Haren/nagels: methylkwik historisch (geen wettelijke limiet)",
], sub_text="Meetmethoden en detectielimieten")

make_content_slide("Meetstrategie conform NEN-EN 689", [
    "1. Inventarisatie: blootstellingspatronen (werkcycli, taken)",
    "2. Strategie: minimaal 3 representatieve metingen per werkplek/functie",
    "3. Indeling: Groep 1 (<10% MAC) | Groep 2 (10-50%) | Groep 3 (>50%)",
    "4. TWA: 8-uur tijdsgewogen gemiddelde; STEL: 15-minuutgemiddelde",
    "5. Documentatie: kalibratiecertificaat, datum, omstandigheden",
    "",
    "Compleet drempelwaardenoverzicht:",
    "   MAC (TWA-8h): 0,025 mg/m³  |  STEL (15 min): 0,075 mg/m³",
    "   Actiewaarde: 0,0125 mg/m³  |  BGW urine: 20 µg/g cr  |  BGW bloed: 15 µg/L",
])

# ══════════════════════════════════════════════════════════════════
# MODULE 7: STOP-strategie (3 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(7, "Preventieve Maatregelen — STOP-strategie", "5 min")

make_content_slide("S — Bronmaatregelen  &  T — Technische Maatregelen", [
    "BRON (Substitution):",
    "   Digitale sensoren (PT100), MRU bij gasverwerking, amalgamvrije tandheelkunde, LED-verlichting",
    "",
    "TECHNISCH:",
    "   Lokale afzuiging ≥0,5 m/s (EN 14175)",
    "   Ventilatie ≥6 ACH in kwikwerkruimtes",
    "   Mercurysorb-filters (koper/zink-sulfide, geïmpregneerde actieve kool)",
    "   Gesloten systemen — gastight verbindingen, double-seal",
    "   Vloeistofdichte vloeren",
    "   Continue kwikdampmonitoring met alarm (>50% MAC = 0,0125 mg/m³)",
])

make_content_slide("O — Organisatorisch  &  P — Persoonlijk", [
    "ORGANISATORISCH:",
    "   Werkvergunning verplicht bij kwikblootstellingsrisico",
    "   Blootstellingsregister per medewerker (taak, duur, concentratie)",
    "   Jobrotatie — maximale blootstellingstijd per shift",
    "   PAGO met biologische monitoring — jaarlijkse herhalingstraining",
    "   Zwangere vrouwen en <18 jaar: GEEN werk met kwik (Repr. 1B)",
    "",
    "PERSOONLIJK:",
    "   Halfgezichtsmasker P3 + gasfilter Hg (EN 371) — NIET FFP2",
    "   Nitril handschoenen ≥0,5 mm, dubbele handschoenentechniek",
    "   Wegwerp overal type 5/6, spatbril / gezichtsscherm",
    "   NIET eten, drinken of roken op werkplek",
])

make_content_slide("Spill-kit & Decontaminatieprotocol", [
    "Spill-kit: zwavelpoeder, amalgamerende spons, Hg-stofzuiger, afsluitbare containers, PBM-set",
    "",
    "Decontaminatie — 10 stappen:",
    "1. Zone afzetten (min. 3 m)  |  2. Ventilatie maximaliseren",
    "3. PBM dragen  |  4. Zwavelpoeder royaal aanbrengen",
    "5. 15 minuten laten reageren (HgS-vorming)",
    "6. Opruimen met amalgamerende spons → afsluitbare container",
    "7. Oppervlak decontamineren (detergent + zwaveloplossing)",
    "8. Nmeten — <0,025 mg/m³ vóór vrijgave",
    "9. Afval als gevaarlijk afval (Euralcode 16 05 06*)",
    "10. Documenteren — incidentrapport, metingsrapport, afvoerbon",
])

# ══════════════════════════════════════════════════════════════════
# MODULE 8: Olie & Gas (2 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(8, "Kwik in Olie & Gas", "Specifieke Risico's • 4 min")

make_content_slide("Aluminiumcorrosie en MRU", [
    "Hg⁰ (gasfase) + Al-oppervlak → Hg-aluminium amalgam",
    "→ Intergranulaire corrosie → wanddikte-vermindering → catastrofaal falen",
    "→ LNG cryogene installaties (−162°C): brittle fracture → explosie/lekkage",
    "",
    "Beïnvloedende factoren: temperatuur, vochtigheid, kwikconcentratie (<10 µg/Nm³ volstaat), materiaal",
    "",
    "Kwikremoval Units (MRU):",
    "   Actieve kool (geïmpregneerd): >99% efficiëntie",
    "   Sulfur-geïmpregneerde kool: >99,5%",
    "   Metaloxide sorbent (ZnO/CuO): >99%, hogere temp-bestendigheid",
    "   Koudetrappers: >95%, combinatie met gasbehandeling",
])

make_content_slide("Case Study: Skikda LNG Explosie (2004)", [
    "Locatie: Skikda LNG complex, Sonatrach, Algerije",
    "19 januari 2004 — Explosie in LNG trein",
    "27 doden, 74 gewonden",
    "",
    "Oorzaak: meervoudig; kwik-gerelateerde aluminiumcorrosie als BIJDRAGENDE FACTOR",
    "",
    "Lessen:",
    "   Zelfs na MRU kan residu-kwik langdurige corrosie veroorzaken",
    "   Materiaalselectie (geen Al bij Hg) en monitoring zijn essentieel",
    "   Branche-breed herzien materiaalselectie en MRU-specificaties",
    "",
    "Sampling: gastight (316SS/PTFE), verwarmde lijnen >120°C, CV-AAS of ICP-MS analyse",
])

# ══════════════════════════════════════════════════════════════════
# MODULE 9: Noodprocedure (2 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(9, "Noodprocedure bij Kwikspill", "4 min")

make_content_slide("Kleine Spill (<25 ml) & Grote Spill", [
    "KLEINE SPILL (<25 ml / ~340 g):",
    "1. Zone evacueren (3 m)  |  2. Ventilatie maximaliseren  |  3. SBD informeren",
    "4. Spill-kit + PBM  |  5. Zwavelpoeder → 15 min → opruimen",
    "6. Decontamineren  |  7. Nmeten <0,025 mg/m³  |  8. Zone vrijgeven",
    "",
    "GROTE SPILL (>25 ml / onbekend):",
    "1. ALGEMEEN ALARM / ontruiming  |  2. Recirculatie UIT, exhaust AAN",
    "3. HSEQ inschakelen  |  4. Zone afzetten min. 10 m",
    "5. Professionele saneringsfirma  |  6. Continue monitoring",
    "7. Documentatie + NCvB-melding  |  8. Verificatiemeting gecertificeerde partij",
])

make_content_slide("Brand met Kwik & Persoonlijke Besmetting", [
    "Brand met kwik:",
    "   Verhitting >357°C → kwikdamp — EVACUEREN",
    "   Blussen met DROOG POUDER of CO₂ — NOOIT WATER",
    "   Na brand: volledige kwikdampmeting en -sanering",
    "",
    "Persoonlijke besmetting:",
    "   Kwik op huid → onmiddellijk wassen met water en zeep (geen oplosmiddelen)",
    "   Kwik op kleding → uittrekken, als gevaarlijk afval",
    "   Kwik in oog → minimaal 15 min spoelen lauw water + medische controle",
    "   Inademing kwikdamp → frisse lucht + medische controle",
    "   Ingestie → direct medische hulp, GEEN braken opwekken",
])

# ══════════════════════════════════════════════════════════════════
# MODULE 10: Praktijk en Casuïstiek (3 slides)
# ══════════════════════════════════════════════════════════════════
make_section_divider(10, "Praktijk en Casuïstiek", "3 min")

make_content_slide("Casus 1 & 2", [
    "CASUS 1 — Gebroken thermometer in kelderopslag:",
    "   → Niet zelf opruimen; SBD waarschuwen; kelder afsluiten + ventileren",
    "   → Getrainde medewerker met PBM + spill-kit; zwavelpoeder → 15 min → opruimen",
    "   → Nmeten <0,025 mg/m³ vóór vrijgave; afvoer 16 05 06*",
    "   Leerpunt: kwikdamp is zwaarder dan lucht — accumuleert in kelders",
    "",
    "CASUS 2 — Kwikverdacht materiaal bij pijpleiding inspectie:",
    "   → Niet aanraken; gastight monstername; analyse CV-AAS/ICP-MS",
    "   → Bij bevestiging: kwikhoudend materiaal als gevaarlijk afval",
    "   → Is de pijpleiding van aluminium? → corrosie-inspectie",
    "   → Advies: MRU installeren, materiaalkeuze herzien",
    "   Leerpunt: afwezigheid MRU ≠ afwezigheid kwik",
])

make_content_slide("Casus 3 & Erkende Beroepsziekten", [
    "CASUS 3 — 50 fluorescentielampen vervangen, 1 breekt:",
    "   → Ruimte evacueren 15 min; niet stofzuigen!",
    "   → Fragmenten met dikke karton/tape oprapen",
    "   → Afvoer 20 01 23* via Wecycle/LightRec; PBM: handschoenen",
    "   Leerpunt: 3-5 mg Hg per lamp; cumulatie bij grootschalig vervangen",
    "",
    "Erkende beroepsziekten (NCvB):",
    "   GEO 1801: Kwikintoxicatie (acute/chronische)",
    "   GEO 1802: Kwiknefrose",
])

# ══════════════════════════════════════════════════════════════════
# DISCUSSIE (1 slide)
# ══════════════════════════════════════════════════════════════════
make_content_slide("Discussievragen", [
    "D1. Jouw installatie gebruikt Al heat exchangers zonder MRU. Hoe beargumenteer je preventieve MRU-installatie (STOP + Skikda)?",
    "D2. Biologische monitoring 18 maanden niet uitgevoerd. Risico's, corrigerende acties, verantwoording richting directie?",
    "D3. Medewerker weigert P3+Hg masker (\"oncomfortabel\", meting ver onder MAC). Hoe ga je hiermee om?",
    "D4. Kosten-batenanalyse: kwikhoudende meetinstrumenten vervangen door digitale alternatieven?",
    "D5. Offshore platform: kwik in condensaat 800 µg/Nm³, MRU uitgevallen. Onmiddellijke acties?",
    "D6. Minamata Convention — hoe kan een intl. O&G bedrijf bijdragen buiten eigen operaties?",
], sub_text="6 stellingen voor groepsdiscussie")

# ══════════════════════════════════════════════════════════════════
# SAMENVATTING (1 slide)
# ══════════════════════════════════════════════════════════════════
make_content_slide("Samenvatting — Key Messages", [
    "1. Kwikdamp is onzichtbaar én reukloos — je merkt het niet tot het te laat is",
    "2. MAC-waarde: 0,025 mg/m³ — bij >50% (actiewaarde 0,0125) zijn maatregelen verplicht",
    "3. STOP-strategie: Bron → Technisch → Organisatorisch → Persoonlijk (in deze volgorde!)",
    "4. Kwik in aardgas is reëel — MRU en materiaalselectie zijn noodzaak",
    "5. NOOIT standaard stofzuiger bij kwik — dampverspreiding → catastrofaal",
    "6. Biologische monitoring: urine <20 µg/g creatinine, bloed <15 µg/L",
    "7. Zwangere vrouwen: geen werk met kwik (Repr. 1B — H360Df)",
    "8. Bij spill: altijd meten ná opruiming — pas vrijgeven bij <0,025 mg/m³",
])

# ══════════════════════════════════════════════════════════════════
# AFSLUITING (1 slide)
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(slide, DARK)
add_rect(slide, Inches(0), Inches(3.5), SLD_W, Inches(0.06), ACCENT)
if os.path.exists(LOGO):
    slide.shapes.add_picture(LOGO, Inches(5.7), Inches(1.0), height=Inches(1.2))
add_textbox(slide, Inches(1), Inches(3.8), Inches(11.3), Inches(1.0), "Vragen?", font_size=44, color=WHITE, bold=True, alignment=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(5.0), Inches(11.3), Inches(0.5), "JvG HSEQ — Awareness Training Kwik — v1.0", font_size=16, color=RGBColor(0xAA,0xCC,0xEE), alignment=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(5.5), Inches(11.3), Inches(0.5), "Neem contact op met uw HSEQ-afdeling voor vragen of aanvullende trainingen.", font_size=14, color=GRAY, alignment=PP_ALIGN.CENTER)
add_footer(slide)

# ── Save ───────────────────────────────────────────────────────────
os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
prs.save(OUTPUT)
print(f"✅ PPTX saved: {OUTPUT}")
print(f"   Slides: {len(prs.slides)}")
