#!/usr/bin/env python3
"""Genereer PGS-15 Studiegids Non-Experts v1.0 — Phoenix Metals IJmuiden"""

from docx import Document
from docx.shared import Pt, Cm, Inches, RGBColor, Emu
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

DOC_PATH = "/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx/PGS15_Studiegids_NonExperts_v1.0.docx"
LOGO_PATH = "/root/projects/jg/2026-pgs15-phoenix-metals/assets/branding/jvg-consultancy-logo.jpg"
PRIMARY = RGBColor(0x00, 0x33, 0x66)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
TEXT_DARK = RGBColor(0x1F, 0x29, 0x37)
WARNING_COLOR = RGBColor(0xF5, 0x9E, 0x0B)
ERROR_COLOR = RGBColor(0xEF, 0x44, 0x44)

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 set_cell_border(cell, **kwargs):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcBorders = parse_xml(f'<w:tcBorders {nsdecls("w")}></w:tcBorders>')
    for edge, val in kwargs.items():
        element = parse_xml(
            f'<w:{edge} {nsdecls("w")} w:val="{val["val"]}" w:sz="{val["sz"]}" w:space="0" w:color="{val["color"]}"/>'
        )
        tcBorders.append(element)
    tcPr.append(tcBorders)

def add_header_row(table, texts):
    row = table.rows[0]
    for i, text in enumerate(texts):
        cell = row.cells[i]
        cell.text = ""
        p = cell.paragraphs[0]
        run = p.add_run(text)
        run.bold = True
        run.font.color.rgb = WHITE
        run.font.size = Pt(11)
        run.font.name = "Calibri"
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        set_cell_shading(cell, "003366")

def add_data_row(table, row_idx, texts, bold_first=False):
    row = table.rows[row_idx]
    for i, text in enumerate(texts):
        cell = row.cells[i]
        cell.text = ""
        p = cell.paragraphs[0]
        run = p.add_run(text)
        run.font.size = Pt(10)
        run.font.name = "Calibri"
        run.font.color.rgb = TEXT_DARK
        if bold_first and i == 0:
            run.bold = True
        if row_idx % 2 == 0:
            set_cell_shading(cell, "F8F9FA")

def add_callout(doc, emoji, title, text, border_color="F59E0B"):
    """Add a styled callout paragraph"""
    p = doc.add_paragraph()
    pPr = p._p.get_or_add_pPr()
    # Left border via paragraph
    pBdr = parse_xml(
        f'<w:pBdr {nsdecls("w")}>'
        f'  <w:left w:val="single" w:sz="24" w:space="8" w:color="{border_color}"/>'
        f'</w:pBdr>'
    )
    pPr.append(pBdr)
    ind = parse_xml(f'<w:ind {nsdecls("w")} w:left="360" w:right="360"/>')
    pPr.append(ind)
    
    run1 = p.add_run(f"{emoji} {title}: ")
    run1.bold = True
    run1.font.name = "Calibri"
    run1.font.size = Pt(11)
    run1.font.color.rgb = PRIMARY
    
    run2 = p.add_run(text)
    run2.font.name = "Calibri"
    run2.font.size = Pt(11)
    run2.font.color.rgb = TEXT_DARK

def setup_headers_footers(section):
    """Add running headers and footers to a section"""
    # Header
    header = section.header
    header.is_linked_to_previous = False
    hp = header.paragraphs[0]
    hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    run = hp.add_run("JvG Consultancy | PGS-15 Studiegids")
    run.font.name = "Calibri"
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x37, 0x41, 0x51)
    
    # Footer
    footer = section.footer
    footer.is_linked_to_previous = False
    fp = footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = fp.add_run("© 2026 JvG Consultancy | HSEQ | 26 april 2026")
    run.font.name = "Calibri"
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x37, 0x41, 0x51)

def main():
    doc = Document()
    
    # Set default font
    style = doc.styles['Normal']
    font = style.font
    font.name = "Calibri"
    font.size = Pt(11)
    font.color.rgb = TEXT_DARK
    
    # Set margins
    for section in doc.sections:
        section.top_margin = Cm(2.5)
        section.bottom_margin = Cm(2.5)
        section.left_margin = Cm(2.5)
        section.right_margin = Cm(2.5)
    
    setup_headers_footers(doc.sections[0])
    
    # ===== VOORBLAD =====
    # Add some spacing
    for _ in range(4):
        doc.add_paragraph()
    
    # Logo
    if os.path.exists(LOGO_PATH):
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run()
        run.add_picture(LOGO_PATH, width=Inches(2.5))
    
    # Title
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("PGS-15 STUDIEGIDS")
    run.bold = True
    run.font.size = Pt(32)
    run.font.color.rgb = PRIMARY
    run.font.name = "Calibri"
    
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("Voor Medewerkers zonder HSEQ-achtergrond")
    run.font.size = Pt(16)
    run.font.color.rgb = RGBColor(0x37, 0x41, 0x51)
    run.font.name = "Calibri"
    
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("Phoenix Metals IJmuiden")
    run.font.size = Pt(14)
    run.font.color.rgb = PRIMARY
    run.font.name = "Calibri"
    run.bold = True
    
    doc.add_paragraph()
    
    # Meta-data tabel
    meta_data = [
        ["Project", "PGS-15 Compliance Phoenix Metals"],
        ["Document", "Studiegids Non-Experts"],
        ["Versie", "1.0"],
        ["Datum", "26 april 2026"],
        ["Auteur", "JvG Consultancy — HSEQ Divisie"],
        ["Classificatie", "Vertrouwelijk — Intern gebruik"],
    ]
    table = doc.add_table(rows=len(meta_data), cols=2)
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    for i, (k, v) in enumerate(meta_data):
        cell0 = table.rows[i].cells[0]
        cell0.text = ""
        r = cell0.paragraphs[0].add_run(k)
        r.bold = True
        r.font.size = Pt(10)
        r.font.name = "Calibri"
        r.font.color.rgb = WHITE
        set_cell_shading(cell0, "003366")
        
        cell1 = table.rows[i].cells[1]
        cell1.text = ""
        r = cell1.paragraphs[0].add_run(v)
        r.font.size = Pt(10)
        r.font.name = "Calibri"
        r.font.color.rgb = TEXT_DARK
    
    doc.add_paragraph()
    
    # Vertrouwelijkheidsclausule
    add_callout(doc, "🔒", "Vertrouwelijk",
                "Dit document is uitsluitend bestemd voor medewerkers van Phoenix Metals IJmuiden. "
                "Reproductie of distributie buiten de organisatie is niet toegestaan zonder schriftelijke toestemming van JvG Consultancy.",
                "EF4444")
    
    # ===== INHOUDSOPGAVE =====
    doc.add_page_break()
    h = doc.add_heading("Inhoudsopgave", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    toc_items = [
        "1. Waarom deze studiegids?",
        "2. Wat is PGS 15?",
        "3. Welke stoffen heeft Phoenix Metals?",
        "4. Wat zijn ADR-klassen?",
        "5. Veiligheidsniveaus uitgelegd",
        "6. De belangrijkste regel: Stoffenscheiding",
        "7. Wat betekent dit voor jou als medewerker?",
        "8. Wat te doen bij een incident",
        "9. Woordenlijst",
        "10. Zelftest",
    ]
    for item in toc_items:
        p = doc.add_paragraph(item)
        p.paragraph_format.space_after = Pt(4)
        p.paragraph_format.left_indent = Cm(1)
    
    # ===== HOOFDSTUKKEN =====
    
    # --- 1. Waarom deze studiegids? ---
    doc.add_page_break()
    h = doc.add_heading("1. Waarom deze studiegids?", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    doc.add_paragraph(
        "Phoenix Metals IJmuiden werkt dagelijks met gevaarlijke stoffen. "
        "Niet alleen de HSEQ-afdeling, maar elke medewerker die in de buurt komt van de opslaglocaties "
        "moet weten wat daar staat, waarom de regels zijn zoals ze zijn, en wat je moet doen als er iets misgaat."
    )
    doc.add_paragraph(
        "Deze studiegids legt de belangrijkste regels uit in gewone taal. "
        "Na het lezen weet je welke stoffen er op je werkplek staan, waarom ze gescheiden moeten worden bewaard, "
        "en welke vijf gouden regels je elke dag moet onthouden."
    )
    
    add_callout(doc, "📌", "Leerdoelen",
                "Na het lezen van deze gids kun je (1) de zes stoffen bij Phoenix Metals benoemen, "
                "(2) uitleggen waarom stoffenscheiding belangrijk is, (3) de vijf gouden regels toepassen, "
                "en (4) weten wat je bij een incident moet doen.")
    
    # --- 2. Wat is PGS 15? ---
    h = doc.add_heading("2. Wat is PGS 15?", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    doc.add_paragraph(
        "PGS 15 is een Nederlandse richtlijn die precies beschrijft hoe je gevaarlijke stoffen veilig kunt opslaan. "
        "PGS staat voor Publicatiereeks Gevaarlijke Stoffen. Het is geen wettelijke plicht op zich, "
        "maar als bedrijf ben je volgens de Omgevingswet en de Arbowet verplicht om aan te tonen dat je opslag veilig is. "
        "PGS 15 is daarvan de meest geaccepteerde manier. [1]"
    )
    doc.add_paragraph(
        "De richtlijn bestaat omdat er in het verleden ernstige incidenten zijn geweest met opslag van gevaarlijke stoffen: "
        "branden, ontploffingen en chemische reacties die medewerkers en omwonenden in gevaar brachten. "
        "Door duidelijke regels te hanteren — over hoe je stoffen scheidt, welke lekbakken je nodig hebt, "
        "en hoe groot een opslagruimte mag zijn — wordt het risico geminimaliseerd."
    )
    doc.add_paragraph(
        "PGS 15 geldt voor elk bedrijf in Nederland dat gevaarlijke stoffen in verpakking opslaat: "
        "van kleine metaalverwerkende bedrijven zoals Phoenix Metals tot grote chemische fabrieken. "
        "De regels schalen mee: een bedrijf met 300 liter bijtende stoffen hoeft veel minder maatregelen te treffen "
        "dan een bedrijf met 20.000 liter, maar de basisregels gelden altijd."
    )
    doc.add_paragraph(
        "De nieuwste versie van PGS 15 dateert uit 2025 en bevat 238 pagina's aan richtlijnen, tabellen en bijlagen. "
        "Voor Phoenix Metals zijn vooral de hoofdstukken over stoffenscheiding (Bijlage E, Tabel 9), "
        "vloeistofopvang (maatregel M30) en drempelwaarden (Tabel 6 en 7) relevant. "
        "De volledige tekst is beschikbaar via de bedrijfsleiding of de HSEQ-adviseur."
    )
    doc.add_paragraph(
        "Een belangrijk uitgangspunt van PGS 15 is de zogeheten zorgplicht (maatregel MW1): "
        "de werkgever moet aantoonbaar zorgen dat de opslag veilig is. "
        "Dat betekent niet alleen dat de juiste lekbakken aanwezig zijn, maar ook dat medewerkers "
        "weten welke stoffen er staan, wat de gevaren zijn en wat ze bij een incident moeten doen. "
        "Daarom is deze studiegids belangrijk: het is onderdeel van de zorgplicht."
    )
    
    # --- 3. Welke stoffen heeft Phoenix Metals? ---
    h = doc.add_heading("3. Welke stoffen heeft Phoenix Metals?", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    doc.add_paragraph(
        "Phoenix Metals IJmuiden heeft zes stoffen op de opslaglocatie (rack voor het lab). "
        "In totaal gaat het om ongeveer 315 kg/l verdeeld over jerrycans en canisters. "
        "De meeste stoffen zijn vloeibaar en verpakt in jerrycans van 10 of 25 liter. "
        "Twee stoffen zijn vast (poeder) en zitten in canisters. Hieronder een overzicht."
    )
    
    # Stoffentabel
    table = doc.add_table(rows=7, cols=4)
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    add_header_row(table, ["Stof", "Gevaar", "Hoe herken je het?", "Volume"])
    substances = [
        ["Natriumhydroxide (NaOH) 50%", "Bijtend (base)", "Jerrycan, etiket met corrosie-symbool (🔥🧪 vloeistof op hand)", "4×25 l = 100 l"],
        ["Zwavelzuur (H₂SO₄) 75%", "Bijtend (zuur)", "Jerrycan, etiket met corrosie-symbool", "3×10 l = 30 l"],
        ["Zwavelzuur (H₂SO₄) 50%", "Bijtend (zuur)", "Jerrycan, etiket met corrosie-symbool", "7×10 l = 70 l"],
        ["Zwavelzuur (H₂SO₄) 25%", "Bijtend (zuur, verdund)", "Jerrycan, etiket met corrosie-symbool", "4×25 l = 100 l"],
        ["Aluminiumsulfaat", "Niet-ADR (zout)", "Canister, wit poeder/korrel", "2×2,5 kg = 5 kg"],
        ["Calciumoxide (CaO)", "Bijtend (reageert met water)", "Canister, wit poeder", "2×5 kg = 10 kg"],
    ]
    for i, row_data in enumerate(substances):
        add_data_row(table, i + 1, row_data, bold_first=True)
    
    doc.add_paragraph()
    
    add_callout(doc, "⛔", "WAARSCHUWING — NOOIT mengen",
                "Deze stoffen mogen NOOIT met elkaar gemengd worden. "
                "Natriumhydroxide (base) en zwavelzuur (zuur) reageren heftig met elkaar. "
                "Dat kan leiden tot spatten, hitteontwikkeling en vrijkomen van gevaarlijke dampen. "
                "Zelfs de restanten in een lekbak kunnen al een reactie veroorzaken.",
                "EF4444")
    
    doc.add_paragraph()
    doc.add_paragraph(
        "Herken de stoffen aan het etiket op de verpakking. Elk etiket toont gevarensymbolen "
        "(pictogrammen met rode ruitjes) en de naam van de stof. Twijfel je? Vraag het je leidinggevende."
    )
    doc.add_paragraph(
        "Wat doen deze stoffen bij Phoenix Metals? Natriumhydroxide en zwavelzuur worden gebruikt "
        "in het metaalverwerkingsproces, onder andere voor het reinigen en etsen van metalen oppervlakken. "
        "Aluminiumsulfaat dient als hulpstof in het proces. Calciumoxide wordt gebruikt voor "
        "pH-correctie en als droogmiddel. Hoewel de volumes beperkt zijn (maximaal 100 liter per stof), "
        "zijn de gevaren reëel: bijtend voor huid en ogen, en reactief bij menging."
    )
    doc.add_paragraph(
        "Belangrijk: de concentratie van zwavelzuur varieert (25%, 50%, 75%). "
        "Hoe hoger het percentage, hoe agressiever het zuur. "
        "Maar zelfs het 25% zwavelzuur kan bijtend zijn en mag niet onderschat worden. "
        "Behandel elke jerrycan met hetzelfde respect, ongeacht de concentratie."
    )
    
    # --- 4. Wat zijn ADR-klassen? ---
    h = doc.add_heading("4. Wat zijn ADR-klassen?", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    doc.add_paragraph(
        "ADR-klassen zijn een soort postcode-systeem voor gevaarlijke stoffen. "
        "Het ADR (Accord européen) is een Europees verdrag dat regelt hoe gevaarlijke stoffen "
        "worden vervoerd — en die classificatie wordt ook gebruikt voor opslag. [2] "
        "Elke stof krijgt een klasse op basis van het belangrijkste gevaar. "
        "Net als dat een postcode vertelt in welke wijk een huis staat, vertelt de ADR-klasse "
        "welk type gevaar je kunt verwachten."
    )
    doc.add_paragraph(
        "Er zijn 9 ADR-klassen, elk voor een ander type gevaar:"
    )
    
    adr_classes = [
        "Klasse 1 — Explosieven",
        "Klasse 2 — Gassen",
        "Klasse 3 — Brandbare vloeistoffen",
        "Klasse 4 — Brandbare vaste stoffen",
        "Klasse 5 — Oxiderende stoffen",
        "Klasse 6 — Giftige en infectieuze stoffen",
        "Klasse 7 — Radioactieve stoffen",
        "Klasse 8 — Bijtende stoffen",
        "Klasse 9 — Overige gevaarlijke stoffen",
    ]
    for cls in adr_classes:
        p = doc.add_paragraph(cls, style='List Bullet')
        p.paragraph_format.space_after = Pt(2)
    
    add_callout(doc, "💡", "Voor Phoenix Metals",
                "Alleen klasse 8 (bijtende stoffen) is relevant. Natriumhydroxide en zwavelzuur zijn allebei "
                "bijtend — ze kunnen de huid, ogen en materialen aantasten. Aluminiumsulfaat en calciumoxide "
                "vallen buiten het ADR-systeem, maar vereisen toch voorzichtigheid.")
    
    # --- 5. Veiligheidsniveaus ---
    doc.add_page_break()
    h = doc.add_heading("5. Veiligheidsniveaus uitgelegd", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    doc.add_paragraph(
        "PGS 15 kent verschillende veiligheidsniveaus, afhankelijk van hoeveel je opslaat. "
        "Hoe meer je hebt, hoe strenger de regels. Dit is logisch: 100 liter bijtend spul is minder risico "
        "dan 20.000 liter. De niveaus worden bepaald door de zogeheten drempelwaarden uit Tabel 6 en Tabel 7 "
        "van PGS 15. [3]"
    )
    doc.add_paragraph(
        "De drempelwaarden verschillen per ADR-klasse en per verpakkinggroep (PG I, II, III). "
        "Voor ADR-klasse 8, verpakkinggroep II (waar de meeste Phoenix Metals-stoffen onder vallen), "
        "gelden de volgende grenzen: onder 10.000 kg is het basisniveau voldoende, tussen 10.000 en 20.000 kg "
        "moet niveau B worden toegepast, en boven 20.000 kg is niveau A verplicht."
    )
    
    # Niveautabel
    table = doc.add_table(rows=4, cols=3)
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    add_header_row(table, ["Niveau", "Wanneer?", "Wat betekent het?"])
    levels = [
        ["Basis", "< 10.000 kg ADR 8", "Lekbakken, scheiding, ventilatie, goede verpakking"],
        ["VN-B", "10.000 – 20.000 kg", "Basis + brandwerende constructie (60 min), blussysteem"],
        ["VN-A", "> 20.000 kg", "VN-B + automatische blussing, branddetectie met doormelding"],
    ]
    for i, row_data in enumerate(levels):
        add_data_row(table, i + 1, row_data, bold_first=True)
    
    doc.add_paragraph()
    
    add_callout(doc, "✅", "Goed nieuws voor Phoenix Metals",
                "Met ongeveer 390 kg aan bijtende stoffen valt Phoenix Metals ver onder de drempel van 10.000 kg. "
                "Dat betekent dat het basisveiligheidsniveau volstaat. Geen brandwerende muren of blusinstallaties nodig. "
                "Maar let op: de regel voor stoffenscheiding (hoofdstuk 6) geldt ALTIJD, ongeacht het niveau. [3]")
    
    doc.add_paragraph()
    doc.add_paragraph(
        "Wat het basisniveau in de praktijk betekent voor Phoenix Metals:"
    )
    
    basis_items = [
        "Alle vloeibare stoffen staan in lekbakken (minimaal 110% van het grootste verpakkingsvolume)",
        "Natriumhydroxide en zwavelzuur staan in aparte lekbakken met minimaal 2 meter afstand",
        "De opslagruimte is voldoende geventileerd (voorkom gasophoping)",
        "Verpakkingen zijn intact en goed gesloten",
        "Er is een instructiekaart aanwezig bij het rack met informatie over de stoffen",
    ]
    for item in basis_items:
        p = doc.add_paragraph(item, style='List Bullet')
        p.paragraph_format.space_after = Pt(4)
    
    # --- 6. Stoffenscheiding ---
    h = doc.add_heading("6. De belangrijkste regel: Stoffenscheiding", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    h2 = doc.add_heading("Waarom is scheiding zo belangrijk?", level=2)
    for run in h2.runs:
        run.font.color.rgb = PRIMARY
    
    doc.add_paragraph(
        "Somminge gevaarlijke stoffen reageren met elkaar als ze in contact komen. "
        "De gevaarlijkste combinatie bij Phoenix Metals is natriumhydroxide (een base) en zwavelzuur (een zuur). "
        "Als deze twee stoffen mengen — bijvoorbeeld door lekkage in dezelfde lekbak — ontstaat een "
        "exotherme reactie: er komt veel warmte vrij, het kan spatten en er ontstaan gevaarlijke dampen."
    )
    
    add_callout(doc, "⛔", "CRUCIALE REGEL",
                "Natriumhydroxide (NaOH) en zwavelzuur (H₂SO₄) mogen NOOIT in hetzelfde rack-vak staan. "
                "Ze vereisen aparte lekbakken en minimaal 2 meter afstand van elkaar. "
                "Ook calciumoxide moet apart van zwavelzuur worden opgeslagen.",
                "EF4444")
    
    h2 = doc.add_heading("Wat mag wel en niet samen?", level=2)
    for run in h2.runs:
        run.font.color.rgb = PRIMARY
    
    # Compatibiliteitstabel
    table = doc.add_table(rows=5, cols=4)
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    add_header_row(table, ["Stof A", "Stof B", "Samen?", "Waarom?"])
    combos = [
        ["H₂SO₄ 75%", "H₂SO₄ 50% / 25%", "✅ Ja", "Zelfde stof, zelfde gevarenklasse"],
        ["NaOH 50%", "H₂SO₄ (alle concentraties)", "⛔ Nee", "Zuur + base = gevaarlijke reactie"],
        ["NaOH 50%", "Aluminiumsulfaat", "⚠️ Beoordelen", "Base + zout, laat over aan specialist"],
        ["H₂SO₄", "Calciumoxide (CaO)", "⛔ Nee", "Zuur + base (CaO is sterk basisch)"],
    ]
    for i, row_data in enumerate(combos):
        add_data_row(table, i + 1, row_data, bold_first=True)
    
    doc.add_paragraph()
    
    h2 = doc.add_heading("Hoe wordt de scheiding gerealiseerd?", level=2)
    for run in h2.runs:
        run.font.color.rgb = PRIMARY
    
    steps = [
        "NaOH 50% staat in een eigen lekbak, in een gemarkeerd vak op het rack",
        "Alle zwavelzuur-concentraties (75%, 50%, 25%) staan samen in een andere lekbak, in een apart vak",
        "De afstand tussen het NaOH-vak en het H₂SO₄-vak is minimaal 2 meter",
        "Calciumoxide wordt apart opgeslagen, weg van alle zwavelzuurproducten",
        "Elk vak is gemarkeerd met tape of verf op de vloer",
    ]
    for i, step in enumerate(steps, 1):
        p = doc.add_paragraph(f"{i}. {step}")
        p.paragraph_format.space_after = Pt(4)
    
    doc.add_paragraph(
        "De reden voor de 2 meter afstand is dat bij een lekkage de vloeistof niet in de andere lekbak kan stromen. "
        "Zelfs als een jerrycan omvalt en lekt, blijft de lekbak de vloeistof opvangen. "
        "De afstand zorgt ervoor dat er geen kruisbesmetting kan optreden."
    )
    doc.add_paragraph(
        "De stoffenscheidingseis komt uit PGS 15 Bijlage E (Tabel 9). Deze tabel geeft voor elke combinatie "
        "van ADR-klassen aan of stoffen samen opgeslagen mogen worden. Voor ADR-klasse 8 ten opzichte van "
        "ADR-klasse 8 is het scheidingniveau 'A': apart brandcompartiment of 5 meter vrije zone. "
        "Omdat Phoenix Metals minder dan 10.000 kg opslaat, mag volgens uitzondering E.3 worden volstaan "
        "met 2 meter afstand en aparte lekbakken. Dat is de huidige oplossing."
    )
    doc.add_paragraph(
        "De markering op de vloer is essentieel. Zonder duidelijke markering weet je niet waar het ene vak "
        "ophoudt en het andere begint. Gebruik felle tape (geel/zwart of rood/wit) en plaats borden bij elk vak "
        "met de naam van de stof en het bijbehorende gevarensymbool. Dit maakt het voor iedereen direct duidelijk "
        "welke stoffen waar staan."
    )
    
    # --- 7. Wat betekent dit voor jou? ---
    doc.add_page_break()
    h = doc.add_heading("7. Wat betekent dit voor jou als medewerker?", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    doc.add_paragraph(
        "Je hoeft geen chemicus te zijn om veilig te werken met de stoffen bij Phoenix Metals. "
        "Houd je aan deze vijf gouden regels en je bent al een heel eind. "
        "Deze regels zijn afgeleid uit de PGS 15-basismaatregelen en gelden voor elke medewerker "
        "die in de buurt van de opslaglocatie komt — ook als je er alleen maar langs loopt."
    )
    
    # Gouden regels tabel
    table = doc.add_table(rows=6, cols=2)
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    add_header_row(table, ["#", "Gouden Regel"])
    rules = [
        ["1️⃣", "NOOIT stoffen mengen — Zuur en base gaan niet samen. Ook niet in lekbakken."],
        ["2️⃣", "Lekbakken controleren — Controleer dagelijks of lekbakken schoon en leeg zijn. Bij lekkage: direct melden."],
        ["3️⃣", "PBM dragen — Draag altijd handschoenen en veiligheidsbril als je in de buurt van de opslag komt."],
        ["4️⃣", "Morsen = melden — Een kleine mors kan groot worden. Meld het altijd, ook als je het zelf hebt opgeruimd."],
        ["5️⃣", "Vragen stellen — Twijfel je over iets? Vraag het. Geen vraag is te simpel als het om veiligheid gaat."],
    ]
    for i, row_data in enumerate(rules):
        add_data_row(table, i + 1, row_data)
    
    doc.add_paragraph()
    
    h2 = doc.add_heading("Dagelijkse checklist", level=2)
    for run in h2.runs:
        run.font.color.rgb = PRIMARY
    
    checklist = [
        "Zijn alle jerrycans goed gesloten en staan ze rechtop?",
        "Zijn de lekbakken schoon en niet overvol?",
        "Staat elke stof in de juiste lekbak (geen menging)?",
        "Is de markering op de vloer nog zichtbaar?",
        "Zijn er geen schade of lekkage zichtbaar aan verpakkingen?",
        "Is de toegang tot het rack vrij (geen obstakels)?",
    ]
    for item in checklist:
        p = doc.add_paragraph(f"☐  {item}")
        p.paragraph_format.space_after = Pt(4)
        p.paragraph_format.left_indent = Cm(1)
    
    # --- 8. Incident ---
    h = doc.add_heading("8. Wat te doen bij een incident", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    doc.add_paragraph(
        "Als er iets misgaat — lekkage, morsen, of een reactie tussen stoffen — volg dan dit stappenplan:"
    )
    
    steps_incident = [
        ("🛑", "STOP wat je aan het doen bent"),
        ("🏃", "VERWIJDER jezelf uit de directe omgeving (minimaal 5 meter afstand)"),
        ("📞", "BEL de noodcoördinator of je leidinggevende"),
        ("🧯", "LAAT de opschoning over aan getraind personeel — ruim NIET zelf op"),
        ("⏳", "WACHT op instructies voordat je terugkeert naar de werkplek"),
    ]
    for emoji, text in steps_incident:
        p = doc.add_paragraph()
        r = p.add_run(f"{emoji}  {text}")
        r.font.size = Pt(12)
        r.font.name = "Calibri"
        r.bold = True
        r.font.color.rgb = TEXT_DARK
        p.paragraph_format.space_after = Pt(6)
        p.paragraph_format.left_indent = Cm(1)
    
    doc.add_paragraph()
    
    add_callout(doc, "📞", "Noodnummers",
                "Interne noodcoördinator: [in te vullen door Phoenix Metals]\n"
                "Bedrijfsnoodnummer: [in te vullen]\n"
                "Nationale hulpdiensten: 112",
                "EF4444")
    
    doc.add_paragraph(
        "Bel altijd 112 als er mensen gewond zijn, als er grote hoeveelheden vloeistof lekken, "
        "of als je het niet meer onder controle hebt."
    )
    doc.add_paragraph(
        "Een incident kan zich op verschillende manieren voordoen: een jerrycan lekt, een container valt om, "
        "of er ontstaat een onverwachte reactie tussen stoffen. Ook kleine morsingen kunnen ernstige "
        "consequenties hebben als ze niet direct worden opgepakt. Daarom is dagelijks controleren "
        "van lekbakken en verpakkingen zo belangrijk — een kleine lekkage is makkelijker op te lossen "
        "dan een grote ramp."
    )
    doc.add_paragraph(
        "Phoenix Metals heeft een gedetailleerd calamiteitenplan. Hierin staat precies wat er moet gebeuren "
        "bij een incident: wie er gebeld moet worden, wie de decontaminatie uitvoert, waar de verzamelplek is, "
        "en welke externe hulpdiensten ingeschakeld moeten worden. Het plan is opgesteld volgens "
        "de eisen van de Omgevingswet en Arbowet en wordt jaarlijks getoetst."
    )
    
    # --- 9. Woordenlijst ---
    h = doc.add_heading("9. Woordenlijst", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    glossary = [
        ("ADR", "Accord européen — Europees verdrag voor vervoer van gevaarlijke stoffen. Bepaalt de 'klasse' van een stof."),
        ("PGS", "Publicatiereeks Gevaarlijke Stoffen — Nederlandse richtlijnen voor veilige opslag en gebruik."),
        ("SDS / VIB", "Safety Data Sheet / Veiligheidsinformatieblad — Document met alle veiligheidsinfo over een stof."),
        ("PBM", "Persoonlijke Beschermingsmiddelen — Handschoenen, bril, schort, etc."),
        ("Lekbak", "Een bak onder de verpakking die lekkende vloeistof opvangt. Moet minimaal 110% van het grootste verpakkingsvolume bevatten."),
        ("ADR-klasse 8", "Bijtende stoffen — stoffen die huid, ogen en materialen kunnen aantasten."),
        ("Base", "Een stof die in water een hoge pH geeft (zoals natriumhydroxide). Tegenovergestelde van zuur."),
        ("Zuur", "Een stof die in water een lage pH geeft (zoals zwavelzuur). Tegenovergestelde van base."),
        ("Exotherme reactie", "Een chemische reactie waarbij warmte vrijkomt. Kan leiden tot spatten of brand."),
        ("Brandcompartiment", "Een ruimte die door brandwerende muren/vloeren gescheiden is van andere ruimtes."),
        ("Compatibiliteitsmatrix", "Een tabel die laat zien welke stoffen wel en niet samen opgeslagen mogen worden."),
        ("Verpakkinggroep (PG)", "Geeft het risiconiveau aan: PG I = hoog, PG II = gemiddeld, PG III = laag."),
    ]
    
    table = doc.add_table(rows=len(glossary) + 1, cols=2)
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    add_header_row(table, ["Term", "Uitleg in gewone taal"])
    for i, (term, explanation) in enumerate(glossary):
        add_data_row(table, i + 1, [term, explanation], bold_first=True)
    
    # --- 10. Zelftest ---
    doc.add_paragraph()
    h = doc.add_heading("10. Zelftest", level=1)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
    
    doc.add_paragraph(
        "Test je kennis met deze vijf vragen. Noteer je antwoord en controleer met de antwoorden onderaan."
    )
    doc.add_paragraph(
        "De vragen gaan over de kernpunten van deze studiegids. Als je antwoorden niet alle antwoorden goed hebt, "
        "is dat geen probleem — dat betekent gewoon dat je de studiegids nogmaals moet doornemen. "
        "Veiligheid draait om voortdurende leer en alertness. Elke dag opnieuw bewust zijn van de gevaren "
        "is belangrijker dan perfect scoren op een test."
    )
    doc.add_paragraph(
        "Denk eraan: deze test is geen eindstation, maar een startpunt. Veiligheid is geen cijfer op een lijst, "
        "maat een continue houding. Naarmate je meer ervaring opdoet met de stoffen, zul je beter "
        "voelen wat wel en niet veilig is. Laat je bij twijfel altijd adviseren door een ervaren collega "
        "of de HSEQ-adviseur."
    )
    
    questions = [
        "Natriumhydroxide en zwavelzuur mogen in dezelfde lekbak staan. (Ja/Nee)",
        "Phoenix Metals valt onder het hoogste veiligheidsniveau (VN-A) van PGS 15. (Ja/Nee)",
        "Bij een lekkage moet je de rommel zelf zo snel mogelijk opruimen. (Ja/Nee)",
        "Je moet altijd handschoenen en een veiligheidsbril dragen bij de opslaglocatie. (Ja/Nee)",
        "Als je twijfelt over een stof, kun je het beste even aan je leidinggevende vragen. (Ja/Nee)",
    ]
    for i, q in enumerate(questions, 1):
        p = doc.add_paragraph(f"{i}. {q}")
        p.paragraph_format.space_after = Pt(6)
        p.paragraph_format.left_indent = Cm(1)
    
    doc.add_paragraph()
    
    # Antwoorden
    p = doc.add_paragraph()
    r = p.add_run("Antwoorden: ")
    r.bold = True
    r.font.name = "Calibri"
    r.font.color.rgb = PRIMARY
    r2 = p.add_run("1. Nee  |  2. Nee  |  3. Nee  |  4. Ja  |  5. Ja")
    r2.font.name = "Calibri"
    r2.font.color.rgb = TEXT_DARK
    
    doc.add_paragraph()
    
    # Bronnen
    doc.add_paragraph()
    h = doc.add_heading("Bronnen", level=2)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
    
    sources = [
        "[1] PGS 15:2025 — Publicatiereeks Gevaarlijke Stoffen, Opslag van verpakte gevaarlijke stoffen",
        "[2] ADR — Accord européen relatif au transport international des marchandises Dangereuses par Route",
        "[3] PGS 15:2025, Tabel 6 & Tabel 7 — Drempelwaarden veiligheidsniveaus",
        "[4] Omgevingswet — Artikel 1.1, zorgplicht en Artikel 8.7, externe veiligheid",
        "[5] Arbowet — Artikel 4.1c, verplichting veilige werkomstandigheden",
    ]
    for s in sources:
        p = doc.add_paragraph(s)
        p.paragraph_format.space_after = Pt(2)
        for run in p.runs:
            run.font.size = Pt(9)
            run.font.name = "Calibri"
    
    # Save
    os.makedirs(os.path.dirname(DOC_PATH), exist_ok=True)
    doc.save(DOC_PATH)
    print(f"✅ Opgeslagen: {DOC_PATH}")
    print(f"   Bestandsgrootte: {os.path.getsize(DOC_PATH):,} bytes")

if __name__ == "__main__":
    main()
