#!/usr/bin/env python3
"""
PGS-15 D1 v2.0 & D2 v2.0 Generator voor Phoenix Metals
JvG Consultancy — 16 april 2026
"""

from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT
import os
from datetime import datetime

LOGO_PATH = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
OUTPUT_DIR = "/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx"
CHANGELOG = "/root/projects/jg/2026-pgs15-phoenix-metals/logs/changelog.md"

def setup_doc(title):
    doc = Document()
    # Page 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)
    
    # Style defaults
    style = doc.styles['Normal']
    font = style.font
    font.name = 'Calibri'
    font.size = Pt(11)
    font.color.rgb = RGBColor(0x33, 0x33, 0x33)
    
    # Heading styles
    for i in range(1, 4):
        hs = doc.styles[f'Heading {i}']
        hs.font.color.rgb = RGBColor(0x1B, 0x3A, 0x5C)
        hs.font.name = 'Calibri'
    
    return doc

def add_header_footer(doc, title_text):
    for section in doc.sections:
        # Header
        header = section.header
        hp = header.paragraphs[0]
        hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        run = hp.add_run("JvG Consultancy | ")
        run.font.size = Pt(8)
        run.font.color.rgb = RGBColor(0x99, 0x99, 0x99)
        run = hp.add_run(title_text)
        run.font.size = Pt(8)
        run.font.color.rgb = RGBColor(0x1B, 0x3A, 0x5C)
        
        # Footer
        footer = section.footer
        fp = footer.paragraphs[0]
        fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = fp.add_run("JvG Consultancy — Vertrouwelijk — Phoenix Metals B.V.")
        run.font.size = Pt(7)
        run.font.color.rgb = RGBColor(0x99, 0x99, 0x99)

def add_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Light Grid Accent 1'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header row
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = h
        for p in cell.paragraphs:
            for r in p.runs:
                r.font.bold = True
                r.font.size = Pt(9)
    # Data rows
    for ri, row in enumerate(rows):
        for ci, val in enumerate(row):
            cell = table.rows[ri + 1].cells[ci]
            cell.text = str(val)
            for p in cell.paragraphs:
                for r in p.runs:
                    r.font.size = Pt(9)
    return table

def p(doc, text, bold=False, size=None):
    par = doc.add_paragraph()
    run = par.add_run(text)
    if bold:
        run.bold = True
    if size:
        run.font.size = Pt(size)
    return par

def ref(text, source):
    """Append a reference citation to text."""
    return f"{text} ({source})"


# ============================================================
# D1 v2.0
# ============================================================
def generate_d1():
    doc = setup_doc("PGS15 Kennisdossier Phoenix Metals D1 v2.0")
    add_header_footer(doc, "D1 v2.0 | PGS-15 Kennisdossier")
    
    # Title page
    doc.add_paragraph()
    doc.add_paragraph()
    title = doc.add_paragraph()
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = title.add_run("PGS-15 KENNISDOSSIER\nPhoenix Metals B.V.")
    run.font.size = Pt(26)
    run.font.color.rgb = RGBColor(0x1B, 0x3A, 0x5C)
    run.bold = True
    
    subtitle = doc.add_paragraph()
    subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = subtitle.add_run("D1 v2.0 — Opslag van Verpakte Gevaarlijke Stoffen\nConform PGS 15:2025 Nieuwe Stijl")
    run.font.size = Pt(14)
    run.font.color.rgb = RGBColor(0x4A, 0x6F, 0x8C)
    
    doc.add_paragraph()
    meta = doc.add_paragraph()
    meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = meta.add_run(
        "JvG Consultancy\n"
        "Opdrachtgever: Phoenix Metals B.V.\n"
        "Locatie: Westerduinweg 3, IJmuiden / Plant One Rotterdam\n"
        f"Datum: 16 april 2026\n"
        "Versie: 2.0\n"
        "Status: Definitief\n"
        "Auteur: J. van Gemert, HSEQ Consultant"
    )
    run.font.size = Pt(10)
    
    doc.add_page_break()
    
    # --- Chapter 1: Executive Summary ---
    doc.add_heading("1. Executive Summary", level=1)
    p(doc, ref(
        "Dit kennisdossier biedt een uitgebreide analyse van de toepassing van PGS 15:2025 Nieuwe Stijl op de opslag van gevaarlijke stoffen door Phoenix Metals B.V. "
        "Phoenix Metals ontwikkelt een hydrometallurgisch proces voor extractie van vanadium, ijzer, calcium en magnesium uit staalslakken van Tata Steel Netherlands. "
        "De pilot plant, geschaald naar 3.000 liter per batch, verwerkt jaarlijks 7.200 kg staalslakken en maakt gebruik van zwavelzuur (H₂SO₄), natriumhydroxide (NaOH), zoutzuur (HCl) en diverse hulpchemicaliën.",
        "Phoenix Metals HSE Policy-V1, §1; Haalbaarheidsstudie V04, §2"
    ))
    p(doc, ref(
        "Kernbevindingen: Alle opgeslagen stoffen vallen onder ADR-klasse 8 (bijtend) of klasse 9 (milieugevaarlijk). Bij dedicated opslag van onbrandbare bijtende stoffen geldt uitsluitend het basisveiligheidsniveau. "
        "Er is geen Wbdbo-eis van toepassing en er is geen VBB-installatie vereist. De kritieke scheidingseis betreft de strikte gescheiden opslag van H₂SO₄ (zuur) en NaOH (base) vanwege hun exotherme reactie bij menging. "
        "Phoenix Metals valt met ~117 ton totaal aan bijtende stoffen (op volle schaal) onder de BRZO/Seveso-lagere drempel, maar de pilot plant blijft ver onder deze drempel.",
        "PGS 15:2025, §4.2, Tabel 6; PGS 15:2025, Bijlage E"
    ))
    
    # --- Chapter 2: PGS 15:2025 Overzicht ---
    doc.add_heading("2. PGS 15:2025 Overzicht", level=1)
    doc.add_heading("2.1 Wat is PGS 15?", level=2)
    p(doc, ref(
        "PGS 15 is de Publicatiereeks Gevaarlijke Stoffen richtlijn voor de opslag van verpakte gevaarlijke stoffen. "
        "De editie PGS 15:2025 (versie 1.0, januari 2025) is de 'Nieuwe Stijl' uitgave die voldoet aan het Besluit activiteiten leefomgeving (Bal) onder de Omgevingswet. "
        "PGS 15 bevat voorschriften voor binnenopslag, buitenopslag, brandveiligheidsopslagkasten, (tank)containers en tijdelijke opslag.",
        "PGS 15:2025, §1.1–1.2"
    ))
    doc.add_heading("2.2 Nieuwe Stijl Kenmerken", level=2)
    p(doc, ref(
        "De Nieuwe Stijl-indeling hanteert een risicobenadering: het vereiste veiligheidsniveau (basis, A, B, C) wordt bepaald door de combinatie van stofeigenschappen (ADR-klasse, verpakkingsgroep, vlampunt) en opgeslagen hoeveelheid. "
        "Dit vervangt het vroegere rigide classificatiesysteem door een flexibeler, risicogebaseerd kader. "
        "Het toepassingsgebied omvat ADR-klassen 2–6.2, 8, 9, CMR-/CLP-stoffen, afvalstoffen en gewasbeschermingsmiddelen.",
        "PGS 15:2025, §1.1; PGS 15:2025, §4.1"
    ))
    doc.add_heading("2.3 Toepassingsgebied voor Phoenix Metals", level=2)
    p(doc, ref(
        "Voor Phoenix Metals zijn de volgende ADR-klassen relevant:\n"
        "• ADR-klasse 8 (bijtende stoffen): H₂SO₄ (UN 1830/2796), NaOH (UN 1824), HCl (UN 1789)\n"
        "• ADR-klasse 9 (milieugevaarlijk): Vanadiumoplossingen (UN 3082)\n"
        "• ADR-klasse 5.1 (oxiderend): Waterstofperoxide, natriumpersulfaat\n"
        "• ADR-klasse 6.1 (giftig): Staalslakken (PG III)\n\n"
        "Alle genoemde klassen vallen binnen het toepassingsgebied van PGS 15:2025.",
        "PGS 15:2025, Tabel 1; Uitgangspuntendocument, §2; Chemicals Master v2.1.0"
    ))
    
    # --- Chapter 3: Opgeslagen Stoffen ---
    doc.add_heading("3. Phoenix Metals Opgeslagen Stoffen", level=1)
    doc.add_heading("3.1 Chemisch Register", level=2)
    p(doc, ref(
        "Het Chemicals Master Register v2.1.0 bevat 6 geregistreerde stoffen. De uitgangspunten voor de pilot plant specificeren additionele stoffen en volumes.",
        "Chemicals Master v2.1.0; Uitgangspuntendocument"
    ))
    
    add_table(doc,
        ["Stof", "ADR", "PG", "UN-nummer", "CAS", "Verpakking", "Max. op locatie"],
        [
            ["H₂SO₄ 75%", "8", "II", "UN 1830", "7664-93-9", "Jerrycan 10L", "30 L"],
            ["H₂SO₄ 50%", "8", "II", "UN 2796", "7664-93-9", "Jerrycan 10L", "70 L"],
            ["H₂SO₄ 25%", "8", "III", "UN 2796", "7664-93-9", "Jerrycan 25L", "100 L"],
            ["H₂SO₄ 98% (pilot)", "8", "II", "UN 1830", "7664-93-9", "IBC", "4.368 kg"],
            ["NaOH 50%", "8", "II", "UN 1824", "1310-73-2", "Jerrycan 25L", "100 L"],
            ["NaOH 50% (pilot)", "8", "II", "UN 1824", "1310-73-2", "Tank", "11.850 kg"],
            ["HCl 35% (pilot)", "8", "II", "UN 1789", "7647-01-0", "Tank", "5.610 kg"],
            ["Vanadiumoplossing", "9", "—", "UN 3082", "—", "Tank/IBC", "Varieert"],
            ["Waterstofperoxide", "5.1", "—", "—", "—", "—", "792 kg"],
            ["Natriumpersulfaat", "5.1", "—", "—", "—", "—", "768 kg"],
        ]
    )
    p(doc, ref("Bron: Chemicals Master v2.1.0; Uitgangspuntendocument Phoenix Metals IJmuiden", "Chemicals Master v2.1.0; Uitgangspuntendocument"), size=9)
    
    doc.add_heading("3.2 Gevarenidentificatie per Stof", level=2)
    add_table(doc,
        ["Stof", "H-zinnen", "CLP-classificatie", "Specifieke risico's"],
        [
            ["H₂SO₄", "H290, H314", "Skin Corr. 1A, Eye Damage 1", "Exotherme reactie met water/basen; corrosief voor metalen"],
            ["NaOH 50%", "H290, H314", "Skin Corr. 1A, Eye Damage 1", "Exotherme reactie met zuren; kristallisatie <12°C"],
            ["HCl 35%", "H290, H314, H335", "Skin Corr. 1A, Eye Damage 1, STOT SE 3", "Giftige dampen (HCl-gas)"],
            ["Vanadiumoplossing", "H302, H315, H319, H335, H341, H412", "Acute Tox. 4, Skin Irrit. 2, Eye Irrit. 2, STOT SE 3, Muta. 2, Aquatic Chronic 3", "CMR-verdenking (H341); milieugevaarlijk"],
            ["Waterstofperoxide", "H271, H302, H314, H332", "Ox. Liq. 1, Acute Tox. 4, Skin Corr. 1A", "Sterk oxiderend; brandbevorderend"],
        ]
    )
    p(doc, ref("Bron: MSDS Sulfuric acid 25-75%; MSDS Sodium hydroxide 50%; Phoenix Metals Chemicals Master v2.1.0", "MSDS H₂SO₄; MSDS NaOH; Chemicals Master v2.1.0"), size=9)
    
    # --- Chapter 4: Ondergrenzen & Veiligheidsniveaus ---
    doc.add_heading("4. Ondergrenzen & Veiligheidsniveaus", level=1)
    doc.add_heading("4.1 Ondergrenzen PGS 15 (Tabel 2)", level=2)
    p(doc, ref(
        "PGS 15 is pas van toepassing wanneer opgeslagen hoeveelheden de ondergrens overschrijden. Voor Phoenix Metals relevante ondergrensen:",
        "PGS 15:2025, §2.1, Tabel 2"
    ))
    add_table(doc,
        ["ADR-klasse", "Verpakkingsgroep", "Ondergrens"],
        [
            ["8 (H₂SO₄, NaOH, HCl)", "II/III", "250 kg"],
            ["9 (vanadiumoplossing)", "Alle", "250 kg"],
            ["5.1 (H₂O₂, persulfaat)", "II/III", "50 kg"],
            ["6.1 (staalslakken)", "III", "50 kg"],
        ]
    )
    doc.add_heading("4.2 Veiligheidsniveau Bepaling (Tabel 6)", level=2)
    p(doc, ref(
        "Het vereiste veiligheidsniveau wordt bepaald door stofeigenschappen en hoeveelheid. Voor Phoenix Metals is de analyse als volgt:\n\n"
        "• H₂SO₄ (ADR 8, VG II, onbrandbaar, vlampunt n.v.t.): Basisveiligheidsniveau\n"
        "• NaOH (ADR 8, VG II, onbrandbaar): Basisveiligheidsniveau\n"
        "• Vanadiumoplossingen (ADR 9, onbrandbaar/niet brandonderhoudend): Basisveiligheidsniveau\n\n"
        "Conclusie: Bij dedicated opslag van uitsluitend onbrandbare bijtende stoffen (ADR-8 VG II/III) en milieugevaarlijke stoffen (ADR-9) is uitsluitend het BASISVEILIGHEIDSNIVEAU vereist. "
        "Er is geen aanvullend veiligheidsniveau (A, B of C) van toepassing, mits geen vermenging met brandbare of toxische stoffen plaatsvindt.",
        "PGS 15:2025, §4.2, Tabel 6"
    ))
    doc.add_heading("4.3 Grenswaarden (Tabel 7)", level=2)
    p(doc, ref(
        "Bij opslag van meer dan 2.500 kg ADR-klasse 8 en/of 9 stoffen wordt het relevante veiligheidsniveau van toepassing. "
        "Voor de pilot plant met maximaal ~11.850 kg NaOH op locatie overschrijdt deze grenswaarde. Echter, omdat het betreft onbrandbare ADR-8 VG II-stoffen in dedicated opslag, blijft het basisveiligheidsniveau van toepassing. "
        "De uitzonderingsbepaling van §4.3 is hierbij van belang.",
        "PGS 15:2025, §4.3, Tabel 7"
    ))
    
    # --- Chapter 5: Opslageisen per Stofklasse ---
    doc.add_heading("5. Opslageisen per Stofklasse", level=1)
    doc.add_heading("5.1 ADR-klasse 8 — Bijtende Stoffen", level=2)
    p(doc, ref(
        "Specifieke eisen voor ADR-klasse 8 (bijtende stoffen) zoals van toepassing op Phoenix Metals:\n\n"
        "1. Opslagvoorziening: Dedicated opslag voor onbrandbare bijtende stoffen vereist alleen basisveiligheidsniveau\n"
        "2. Wbdbo: Geen Wbdbo-eis bij dedicated opslag van onbrandbare ADR-8 VG II/III\n"
        "3. Scheiding: Zuren en basen strikt gescheiden opslaan (H₂SO₄ en NaOH in aparte vakken of voorzieningen)\n"
        "4. Opvang: 110% grootste verpakking of 10% totaal (wat meer is)\n"
        "5. Materialen: Opvangvoorziening moet bestand zijn tegen de bijtende stof (geen onbeschermd metaal bij H₂SO₄)\n"
        "6. Verdieping: Beperking niet van toepassing voor onbrandbare ADR-8 VG II/III\n"
        "7. PBM's: Zuurbestand/base-bestendig materiaal vereist\n"
        "8. Neutralisatiemiddelen: Beschikbaar bij opslag (natriumcarbonaat/soda voor H₂SO₄; citroenzuur/azijnzuur voor NaOH)\n"
        "9. Condenscorrosie: Bij buitenopslag rekening houden met corrosie aan verpakkingen en constructie",
        "PGS 15:2025, §15.1"
    ))
    doc.add_heading("5.2 ADR-klasse 9 — Milieugevaarlijke Stoffen", level=2)
    p(doc, ref(
        "Voor vanadiumoplossingen (UN 3082, ADR-klasse 9):\n\n"
        "1. Opslagvoorziening: Alleen basisveiligheidsniveau vereist bij dedicated opslag\n"
        "2. Wbdbo: Geen Wbdbo-eis bij dedicated opslag\n"
        "3. Verdieping: Beperking niet van toepassing\n"
        "4. Bluswateropvang: 100% van nominale capaciteit bij veiligheidsniveau A (i.v.m. milieugevaarlijkheid)\n"
        "5. Etikettering: \"Dode boom/vis\" symbool (ADR 5.2.1.8.3) op verpakking",
        "PGS 15:2025, §15.2"
    ))
    doc.add_heading("5.3 ADR-klasse 5.1 — Oxiderende Stoffen", level=2)
    p(doc, ref(
        "Voor waterstofperoxide en natriumpersulfaat (ADR-klasse 5.1):\n\n"
        "• Ondergrens: 50 kg (PG II/III)\n"
        "• Scheiding: Vakindeling vereist ten opzichte van ADR-klasse 8 (V-scheiding per Tabel 9)\n"
        "• Opslag: Gescheiden van brandbare en bijtende stoffen; droog en koel bewaren\n"
        "• Maximumhoeveelheid pilot: H₂O₂ 792 kg + persulfaat 768 kg = 1.560 kg",
        "PGS 15:2025, Tabel 9; Uitgangspuntendocument"
    ))
    
    # --- Chapter 6: Bouwkundige Eisen ---
    doc.add_heading("6. Bouwkundige Eisen", level=1)
    doc.add_heading("6.1 Wbdbo (M21)", level=2)
    p(doc, ref(
        "Bij dedicated opslag van H₂SO₄ en NaOH (ADR-klasse 8, VG II, onbrandbaar) geldt GEEN Wbdbo-eis, mits:\n"
        "• Opslag <10.000 kg: altijd vrijgesteld\n"
        "• Opslag >10.000 kg: alle andere goederen/verpakkingen ook onbrandbaar/niet brandonderhoudend\n"
        "• Vrije ruimte van 2 m tot andere activiteiten, duidelijk zichtbaar op vloer",
        "PGS 15:2025, §5.1, M21"
    ))
    doc.add_heading("6.2 Opvangvoorzieningen (M30)", level=2)
    p(doc, ref(
        "Bij basisveiligheidsniveau geldt voor H₂SO₄ en NaOH: opvangcapaciteit = 110% van grootste verpakking of 10% van totale inhoud (wat groter is). "
        "De opvangvoorziening moet bestand zijn tegen de opgeslagen vloeistoffen. Voor H₂SO₄ zijn constructies van PP (polypropyleen) of met PP-gelining geschikt. "
        "De Fusion-tanks (41,5 kL) in de 1M-liter configuratie zijn voorzien van secundaire containments van 110% grootste tankinhoud (45,65 kL per bekken).",
        "PGS 15:2025, §6.1, M30; Plant Layout; D1 v1.0"
    ))
    doc.add_heading("6.3 Bluswateropvang (M32)", level=2)
    p(doc, ref(
        "Bluswateropvang is alleen vereist bij veiligheidsniveau A. Aangezien Phoenix Metals uitsluitend basisveiligheidsniveau vereist, is bluswateropvang niet verplicht. "
        "Echter, als best practice en ter bescherming van het milieu (vooral i.v.m. ADR-klasse 9 vanadiumoplossingen) wordt geadviseerd om een bluswateropvangvoorziening te overwegen.",
        "PGS 15:2025, §6.2, M32"
    ))
    doc.add_heading("6.4 Brandwerendheid (M33)", level=2)
    p(doc, ref(
        "Voor onbrandbare bijtende stoffen in dedicated opslag gelden geen specifieke brandwerendheidseisen voor constructie-onderdelen. "
        "Dit volgt uit de Wbdbo-vrijstelling voor ADR-8 VG II/III onbrandbare stoffen. "
        "Indien de opslagvoorziening echter binnen een gebouw met andere activiteiten is gesitueerd, gelden de algemene Bbl-eisen voor brandcompartimentering.",
        "PGS 15:2025, §5.4, M24–M27"
    ))
    
    # --- Chapter 7: Scheiding ---
    doc.add_heading("7. Scheiding & Vakindeling", level=1)
    doc.add_heading("7.1 Onverenigbare Combinaties (M35, Bijlage E)", level=2)
    p(doc, ref(
        "De kritieke scheidingseis voor Phoenix Metals betreft de scheiding van H₂SO₄ (zuur) en NaOH (base). Bij gelijktijdig vrijkomen ontstaat een sterk exotherme reactie met hitteontwikkeling, spatten en vrijkomen van corrosieve dampen. "
        "Deze stoffen moeten in afzonderlijke vakken of aparte opslagvoorzieningen worden opgeslagen.",
        "PGS 15:2025, Bijlage E; MSDS H₂SO₄; MSDS NaOH"
    ))
    add_table(doc,
        ["Combinatie", "Risico", "Scheidingsmethode"],
        [
            ["H₂SO₄ + NaOH", "Exotherme reactie, spatten, corrosieve dampen", "Apart vak of aparte opslagvoorziening"],
            ["H₂SO₄ + brandbare stoffen (ADR 3)", "Reactie, brandbevordering", "Vakindeling"],
            ["NaOH + aluminium (ADR 4.3)", "Waterstofontwikkeling", "Vakindeling"],
            ["H₂SO₄ + oxiderend (ADR 5.1)", "Versterkte corrosie/reactie", "Vakindeling"],
            ["H₂SO₄ + vanadiumoplossing (ADR 9)", "Geen direct gevaar", "Geen scheiding vereist (tenzij reactief)"],
        ]
    )
    p(doc, ref("Bron: PGS 15:2025, Bijlage E, Tabel 9", "PGS 15:2025, Bijlage E"), size=9)
    
    doc.add_heading("7.2 Scheidingstabel ADR-klassen", level=2)
    add_table(doc,
        ["", "Klasse 3", "Klasse 5.1", "Klasse 6.1", "Klasse 8", "Klasse 9"],
        [
            ["Klasse 8 (zuur)", "B", "V", "B", "Zie §7.1", "B"],
            ["Klasse 8 (base)", "B", "V", "B", "Zie §7.1", "B"],
            ["Klasse 9", "B", "B", "B", "B", "—"],
            ["Klasse 5.1", "V", "—", "BA", "V", "B"],
        ]
    )
    p(doc, "Legenda: V = Vakindeling; B = Vakscheiding; BA = Aparte opslagvoorziening; — = Geen scheiding", size=9)
    
    # --- Chapter 8: Brandveiligheid ---
    doc.add_heading("8. Brandveiligheid", level=1)
    doc.add_heading("8.1 VBB-systeem (M96, M99)", level=2)
    p(doc, ref(
        "Een vastopgesteld brandbeheersings- en brandblussysteem (VBB) is alleen vereist bij veiligheidsniveau A of hoger. "
        "Aangezien Phoenix Metals bij dedicated opslag uitsluitend basisveiligheidsniveau heeft, is een VBB-installatie NIET verplicht. "
        "Maximum oppervlakte zonder VBB: 1.000 m² bij ≤20.000 kg en 2.500 m² bij >20.000 kg.",
        "PGS 15:2025, §9.4, M99; PGS 15:2025, §5.2, M15"
    ))
    doc.add_heading("8.2 Draagbaar Blustoestel (M95)", level=2)
    p(doc, ref(
        "Ongeacht het veiligheidsniveau zijn voldoende draagbare brandblusmiddelen vereist, afgestemd op de aard van de opgeslagen stoffen. "
        "Minimum: twee 6 kg poederblussers of equivalent. Bij opslag van bijtende stoffen dient minimaal één CO₂-blusser aanwezig te zijn voor elektrailverts. "
        "Blusmiddelen dienen jaarlijks gekeurd te worden conform NEN 2559.",
        "PGS 15:2025, §9.2, M95"
    ))
    doc.add_heading("8.3 Bedrijfsbrandweer (M97)", level=2)
    p(doc, ref(
        "Een bedrijfsbrandweer is vereist bij (tank)containeropslag en bij veiligheidsniveau A met >20.000 kg brandbare stoffen. "
        "Voor Phoenix Metals (basisveiligheidsniveau, onbrandbare stoffen) is een bedrijfsbrandweer niet verplicht. "
        "Wel is een BHV-organisatie vereist conform de Arbowetgeving. Phoenix Metals beschikt over een BHV-organisatie via Plant One Rotterdam.",
        "PGS 15:2025, §9.3; Phoenix Metals BNP-V1; Wet veiligheidsregio's, art. 31"
    ))
    
    # --- Chapter 9: Veiligheidsafstanden ---
    doc.add_heading("9. Veiligheidsafstanden", level=1)
    p(doc, ref(
        "Interne veiligheidsafstanden conform PGS 15:2025:",
        "PGS 15:2025, §8"
    ))
    add_table(doc,
        ["Maatregel", "Afstand", "Toelichting"],
        [
            ["Vrije ruimte tot andere activiteiten (M21)", "2 meter", "Bij onbrandbare ADR-8/9 opslag zonder Wbdbo-eis"],
            ["Opslag in vluchtroute (M130)", "Verboden", "Opslagvoorziening mag niet in vluchtroute staan"],
            ["Brandbare materialen (M134)", "2 meter", "Binnen 2 m van opslag: geen brandbare materialen"],
            ["Buitenwand tijdelijke opslag", "1 meter", "Vrijgehouden"],
            ["Open zijde tijdelijke opslag", "2 meter", "Vrijgehouden"],
            ["Goederen tot open zijde", "50 cm", "Minimaal"],
        ]
    )
    p(doc, ref(
        "Voor de Phoenix Metals-locatie (Westerduinweg 3, IJmuiden) dient een specifieke afstandenstoets te worden uitgevoerd in het kader van de omgevingsvergunning, "
        "inclusief externe veiligheidsafstanden conform Bal en Bkl. De haalbaarheidsstudie (Arcadis, 2025) bevestigt dat de locatie in een havengebied is gesitueerd met voldoende afstand tot kwetsbare objecten.",
        "Haalbaarheidsstudie V04, §3; PGS 15:2025, §8; Bal art. 3.27"
    ))
    
    # --- Chapter 10: Tijdelijke Opslag ---
    doc.add_heading("10. Tijdelijke Opslag", level=1)
    p(doc, ref(
        "Tijdelijke opslag is opslag voorafgaand aan of aansluitend op transport. Maximaal 10.000 kg per brandcompartiment (zonder personeel) of 30.000 kg (met deskundig personeel).",
        "PGS 15:2025, §7.6.2"
    ))
    add_table(doc,
        ["Parameter", "Zonder personeel", "Met personeel"],
        [
            ["Max. gevaarlijke stoffen", "10.000 kg", "10.000 kg"],
            ["Max. totaal", "20.000 kg", "20.000 kg"],
            ["Constructie", "3 zijden, ≥3 m, 60 min BW", "2 m vrij rondom, gemarkeerd"],
            ["Brandbare vloeistoffen (ADR 3)", "Max. 2.000 kg", "Max. 2.000 kg"],
        ]
    )
    p(doc, ref(
        "Voor Phoenix Metals: H₂SO₄ VG II en NaOH VG II zijn toegestaan in tijdelijke opslag. H₂SO₄ VG I is UITGESLOTEN. "
        "Buiten werktijd moet alles regulier worden opgeslagen volgens PGS 15.",
        "PGS 15:2025, §17.2, M146; PGS 15:2025, §17.4, M157–M161"
    ))
    
    # --- Chapter 11: Scenario's ---
    doc.add_heading("11. Scenario's (S1–S16)", level=1)
    p(doc, ref(
        "PGS 15:2025 definieert oorzaakscenario's (S1–S10) en gevolgscenario's (S11–S16). De relevantie voor Phoenix Metals is als volgt:",
        "PGS 15:2025, §14"
    ))
    add_table(doc,
        ["Scenario", "Omschrijving", "Relevantie PM", "Maatregelen"],
        [
            ["S1", "Verpakking aangereden", "HOOG — vrachtverkeer bij opslag", "Stootblokken; verkeersmanagement"],
            ["S2", "Verpakking valt/faalt", "MIDDEN — IBC/jerrycan hantering", "Stapelvoorschriften; training"],
            ["S5", "Veroudering verpakking", "MIDDEN — lange opslag", "Periodieke inspectie (M45)"],
            ["S7", "Fouten bij monstername", "MIDDEN — laboratoriumactiviteiten", "TRA; werkvergunning"],
            ["S8–S10", "Brand (diverse)", "LAAG — onbrandbare stoffen", "Alleen bij vermenging relevant"],
            ["S11", "Vrijkomen gevaarlijke stof", "HOOG — lekkage bijtende stoffen", "Opvangvoorziening; lekdetectie"],
            ["S12", "Verspreiding damp/vloeistof", "HOOG — H₂SO₄/NaOH dampen", "Ventilatie; opvang; neutralisatie"],
            ["S13–S16", "Brandescapaties", "LAAG — onbrandbaar", "Preventie; geen VBB nodig"],
        ]
    )
    
    # --- Chapter 12: BRZO/Seveso ---
    doc.add_heading("12. BRZO/Seveso-toets", level=1)
    p(doc, ref(
        "Het Besluit risico's zware ongevallen (BRZO 2015) implementeert de Seveso III-richtlijn. Phoenix Metals moet worden getoetst aan de drempelwaarden:",
        "BRZO 2015; PGS 15:2025, Bijlage Wettelijk Kader"
    ))
    add_table(doc,
        ["Criterium", "Drempelwaarde", "Phoenix Metals (pilot)", "Status"],
        [
            ["H314 (bijtend) — lage drempel", "50 ton per stof", "NaOH ~11.850 kg", "ONDER drempel"],
            ["H314 — totale hoeveelheid", "200 ton", "~117 ton (volle schaal)", "ONDER drempel (vol); PILOT: ver onder"],
            ["Vanadium oxide (H341/H412)", "50 ton", "<1 ton", "Ver onder drempel"],
            ["Seveso-status", "—", "—", "GEEN Seveso-inrichting"],
        ]
    )
    p(doc, ref(
        "Conclusie: De pilot plant van Phoenix Metals valt ver onder alle Seveso-drempelwaarden. Er is geen veiligheidsrapportageplicht. "
        "Op volle schaal (1M liter fabriek) nadert de totale hoeveelheid bijtende stoffen (~117 ton) de lagere drempel (200 ton), maar blijft daaronder. "
        "NTA 8620 kan als best practice worden gehanteerd voor het veiligheidsbeheerssysteem.",
        "Haalbaarheidsstudie V04, §4; BRZO-overzicht Phoenix Metals"
    ))
    
    # --- Chapter 13: Vergunningscontext ---
    doc.add_heading("13. Vergunningscontext", level=1)
    doc.add_heading("13.1 Vooroverleg", level=2)
    p(doc, ref(
        "Op 23 september 2023 vond vooroverleg plaats tussen Phoenix Metals (Stijn van Zelst, Jorick van Gemert), Arcadis (Gijs Jacobs, Peter Dikkeboom) en ODIJ (Mark Diependaal, Michel van Tunen). "
        "Kernafspraken:\n"
        "• RIE is NIET van toepassing (pilot plant = geen industriële fabricageschaal)\n"
        "• Opslagtank vloeistoffen (Bal 3.24): grootste tank 42 m³ < 150 m³ → meldingsplicht, geen vergunning\n"
        "• Opslaan gevaarlijke stoffen (Bal 3.27): <10.000 kg → meldingsplicht\n"
        "• Seveso: geen opmerkingen ODIJ\n"
        "• MBA-categorisatie: §3.2.8 en §3.2.9 mogelijk van toepassing",
        "Vooroverleg 23-09-2023, ODij/Arcadis/PM"
    ))
    doc.add_heading("13.2 Haalbaarheidsstudie", level=2)
    p(doc, ref(
        "Arcadis heeft een haalbaarheidsstudie (concept V04, 12 december 2025) uitgevoerd. Kernbevindingen:\n"
        "• Locatie: Westerduinweg 3, IJmuiden, havengebied\n"
        "• Bestemming: \"Bedrijf - Havengebonden\" + \"Waarde - Archeologie\"\n"
        "• Mogelijk buitenplanse procedure (bopa) nodig\n"
        "• Nabij natuurgebied Kennemerland-Zuid (~750 m): AERIUS-berekening nodig\n"
        "• Geluid: inpasbaarheidstoets nodig (MTG 56 dB(A))\n"
        "• Water: geen lozing op oppervlaktewater; afvalwater via tankwagen naar erkende verwerker",
        "Haalbaarheidsstudie V04, Arcadis 2025"
    ))
    doc.add_heading("13.3 Uitgangspunten", level=2)
    p(doc, ref(
        "Het uitgangspuntendocument definieert drie schaalgrootten: 6M liter, 1,5M liter en pilot plant. Voor de pilot plant gelden de volgende sleutelfiguren:\n"
        "• Personeel: 4 personen (2 shift, 2 staf)\n"
        "• Bedrijfstijd: 5 werkdagen/week, 260 dagen/jaar\n"
        "• Totaal grondstoffen op locatie: 7.728 kg\n"
        "• Verwachte operationele start: halverwege 2026",
        "Uitgangspuntendocument Phoenix Metals IJmuiden"
    ))
    
    # --- Chapter 14: Strategisch Actieplan ---
    doc.add_heading("14. Strategisch Actieplan", level=1)
    p(doc, ref(
        "Op basis van de analyse worden de volgende strategische acties aanbevolen:", "PGS 15:2025; Phoenix Metals HSE Policy-V1"
    ))
    actions = [
        ("Direct (Q2 2026)", [
            "Scheiding H₂SO₄ en NaOH implementeren: aparte vakken met fysieke scheiding (muurtje of lekbak)",
            "Opvangvoorziening installeren: 110% grootste verpakking of 10% totaal, zuurbestendig materiaal (PP)",
            "Neutralisatiemiddelen positioneren: soda (Na₂CO₃) bij H₂SO₄-opslag; citroenzuur bij NaOH-opslag",
            "Nooddouche + oogdoucher installeren nabij opslagvoorzieningen",
            "ADR-etikettering (klasse 8, ≥20×20 cm) aanbrengen op opslagvoorzieningen",
            "Calamiteiteninstructie + lekkage-instructie zichtbaar ophangen",
        ]),
        ("Korte termijn (Q3 2026)", [
            "Stoffenlijst en plattegrond (hardcopy) beschikbaar maken voor brandweer",
            "PBM-matrix formaliseren en koppelen aan werkvergunningensysteem",
            "RI&E actualiseren met PGS-15 specifieke risico's",
            "Training medewerkers: veilig werken met bijtende stoffen",
            "Vergunningsaanvraag indienen (omgevingsvergunning + AERIUS-toets)",
        ]),
        ("Middellange termijn (Q4 2026+)", [
            "Periodiek inspectieprogramma opzetten (verpakkingen, opvangvoorzieningen, PBM's)",
            "Documentatiebeheer: keuringsrapporten, keuringen, onderhoudslogboek",
            "Vorbereiding opschaling 1M liter: herbeoordeling veiligheidsniveaus, BRZO-drempelwaarden",
            "HSE Management System implementeren conform HSE Policy-V1",
        ]),
    ]
    for phase, items in actions:
        doc.add_heading(phase, level=2)
        for item in items:
            doc.add_paragraph(item, style='List Bullet')
    
    # --- Chapter 15: Referenties ---
    doc.add_heading("15. Referenties", level=1)
    refs = [
        "PGS 15:2025 versie 1.0 (januari 2025) — Opslag van verpakte gevaarlijke stoffen. Publicatiereeks Gevaarlijke Stoffen.",
        "Arcadis Nederland B.V. (2025). Rapport haalbaarheidsstudie Phoenix Metals V04 (concept). 12 december 2025.",
        "Phoenix Metals B.V. (2024). Registration Chemicals MASTER v2.1.0. 29 november 2024.",
        "Phoenix Metals B.V. (2025). HSE Policy V1. Ondertekend: Stijn van Zelst, 1 januari 2025.",
        "Phoenix Metals B.V. (2024). Bedrijfsnoodplan (BNP) Plant One Rotterdam V1.",
        "Phoenix Metals B.V. (2024). PBM Matrix Phoenix Metals Draft 1.",
        "Phoenix Metals B.V. (2024). PBM Beleid PS-201-NL V1.0.",
        "MSDS Sulfuric Acid 25-75%. Carl Roth.",
        "MSDS Sodium Hydroxide 50%. Carl Roth.",
        "Phoenix Metals B.V. (2025). Uitgangspuntendocument Phoenix Metals IJmuiden.",
        "Verslag vooroverleg 23 september 2023. Phoenix Metals, Arcadis, ODIJ.",
        "Phoenix Metals B.V. PFD P2-PFD-001-01 Rev.03 (1M liter plant).",
        "Phoenix Metals B.V. Plant Layout (1M liter plant). Schaal 1:75.",
        "Phoenix Metals B.V. Overzicht BRZO Elementen en VBS.",
        "Besluit activiteiten leefomgeving (Bal), artikelen 3.24, 3.27, 3.148.",
        "Besluit bouwwerken leefomgeving (Bbl). Brandcompartimentering, bereikbaarheid.",
        "Arbeidsomstandighedenwet, Arbobesluit hoofdstuk 4 (gevaarlijke stoffen).",
        "BRZO 2015 (Besluit risico's zware ongevallen 2015). Seveso III-richtlijn.",
        "CLP-verordening (EG) 1272/2008.",
        "REACH (EG) 1907/2006.",
        "ADR 2025 — Accord européen relatif au transport international des marchandises Dangereuses par Route.",
        "NEN 6068 — Bepaling weerstand tegen branddoorslag en brandoverslag.",
        "NEN 6069 — Brandwerendheid van constructie-onderdelen.",
    ]
    for i, r in enumerate(refs, 1):
        doc.add_paragraph(f"[{i}] {r}", style='List Number')
    
    # Save
    path = os.path.join(OUTPUT_DIR, "PGS15_Kennisdossier_Phoenix_Metals_D1_v2.0.docx")
    doc.save(path)
    print(f"D1 v2.0 opgeslagen: {path}")
    return path


# ============================================================
# D2 v2.0
# ============================================================
def generate_d2():
    doc = setup_doc("PGS15 Veilig Werken HSEQ Phoenix Metals D2 v2.0")
    add_header_footer(doc, "D2 v2.0 | Veilig Werken & HSEQ")
    
    # Title page
    doc.add_paragraph()
    doc.add_paragraph()
    title = doc.add_paragraph()
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = title.add_run("VEILIG WERKEN & HSEQ FRAMEWORK\nPhoenix Metals B.V.")
    run.font.size = Pt(26)
    run.font.color.rgb = RGBColor(0x1B, 0x3A, 0x5C)
    run.bold = True
    
    subtitle = doc.add_paragraph()
    subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = subtitle.add_run("D2 v2.0 — Opslag & Logistiek Veilig Werken\nConform PGS 15:2025 Nieuwe Stijl")
    run.font.size = Pt(14)
    run.font.color.rgb = RGBColor(0x4A, 0x6F, 0x8C)
    
    doc.add_paragraph()
    meta = doc.add_paragraph()
    meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = meta.add_run(
        "JvG Consultancy\n"
        "Opdrachtgever: Phoenix Metals B.V.\n"
        "Locatie: Westerduinweg 3, IJmuiden / Plant One Rotterdam\n"
        f"Datum: 16 april 2026\n"
        "Versie: 2.0\n"
        "Status: Definitief\n"
        "Auteur: J. van Gemert, HSEQ Consultant"
    )
    run.font.size = Pt(10)
    
    doc.add_page_break()
    
    # --- Chapter 1: Executive Summary ---
    doc.add_heading("1. Executive Summary", level=1)
    p(doc, ref(
        "Dit document beschrijft het Veilig Werken & HSEQ Framework voor opslag en logistiek van gevaarlijke stoffen bij Phoenix Metals B.V. "
        "Het koppelt PGS 15:2025-voorschriften aan operationele procedures, PBM-matrix, noodprocedures en trainingseisen. "
        "Het framework is gebaseerd op het HSE Management System van Phoenix Metals (HSE Policy V1) en het Bedrijfsnoodplan (BNP-V1).",
        "Phoenix Metals HSE Policy-V1, §1; PGS 15:2025, §10; BNP-V1"
    ))
    p(doc, ref(
        "Kernmaatregelen: Alle werkzaamheden met bijtende stoffen vereisen een voorafgaande TRA (Task Risk Analysis) en werkvergunning. "
        "De PBM-matrix specificeert per activiteit de vereiste beschermingsmiddelen. "
        "Lekkage- en brandprocedures zijn gekoppeld aan het BNP van Plant One Rotterdam. "
        "De 8-stappen laad-/losprocedure vormt de operationele ruggengraat voor alle logistieke handelingen.",
        "PE-290-01 Control of Work; PBM Matrix Draft 1; BNP-V1; D2 v1.0"
    ))
    
    # --- Chapter 2: Opslagfaciliteiten ---
    doc.add_heading("2. Opslagfaciliteiten Beschrijving", level=1)
    doc.add_heading("2.1 Tankconfiguratie (1M Liter Fabriek)", level=2)
    p(doc, ref(
        "De 1M liter vanadiumelektrolytfabriek omvat de volgende opslagfaciliteiten, gebaseerd op het Process Flow Diagram (PFD P2-PFD-001-01 Rev.03) en de Plant Layout:",
        "PFD P2-PFD-001-01 Rev.03; Plant Layout"
    ))
    add_table(doc,
        ["Tank/Voorziening", "Inhoud", "Type", "Stof", "Secundair containment"],
        [
            ["Sulfuric Acid Tank", "41,5 kL", "Fusion (PP-gelined)", "H₂SO₄", "110% = 45,65 kL"],
            ["Anolyte Tank", "41,5 kL", "Fusion (PP-gelined)", "Vanadium-anolyt", "110% = 45,65 kL"],
            ["Catholyte Tank 1", "41,5 kL", "Fusion (PP-gelined)", "Vanadium-katholyt", "110% = 45,65 kL"],
            ["Catholyte Tank 2", "41,5 kL", "Fusion (PP-gelined)", "Vanadium-katholyt", "110% = 45,65 kL"],
            ["DI Water Tank", "25,2 kL", "Fusion", "Demi-water", "—"],
            ["Process Waste Tank", "30 kL", "DS Polymaster", "Procesafval", "—"],
            ["Vanadium Dosing Tank", "4 kL", "—", "V₂O₅-oplossing", "—"],
            ["Dissolution Tank", "10 kL", "Fusion", "Reactiemengsel", "—"],
            ["Bunded H₂SO₄ IBC", "IBC", "Bunded", "H₂SO₄ (kleine volumes)", "Inherent (bunded)"],
        ]
    )
    
    doc.add_heading("2.2 Pilot Plant Configuratie", level=2)
    p(doc, ref(
        "Voor de pilot plant (Westerduinweg 3, IJmuiden) gelden kleinere volumes:\n"
        "• H₂SO₄ 98%: max 4.368 kg in IBC's\n"
        "• NaOH 50%: max 11.850 kg in centrale opslagtanks\n"
        "• HCl 35%: max 5.610 kg in tanks\n"
        "• H₂O₂: max 792 kg\n"
        "• Staalslakken: max 1.800 kg in big bags\n"
        "• Personeel: 4 personen (2 shift, 2 staf)",
        "Uitgangspuntendocument; Haalbaarheidsstudie V04"
    ))
    
    doc.add_heading("2.3 Procesoverzicht", level=2)
    p(doc, ref(
        "Het hydrometallurgische proces omvat de volgende hoofdstanden:\n"
        "1. Invoer V₂O₅ en staalslakken → schroeftransporteur → dissolution tank\n"
        "2. Menging met zwavelzuur (80°C, atmosferisch) → oplossing van vanadium\n"
        "3. Filtratie → scheiding vast/vloeibaar\n"
        "4. Elektrochemische reductie (reductiecellen bank 1 & 2) → vanadiumelektrolyt\n"
        "5. Opslag in anolyte/katholyte tanks → dosering en afvoer\n"
        "6. Scrubber met centrifugale ventilator → emissiecontrole\n"
        "7. Warmtewisselaars → temperatuursbeheersing\n"
        "8. Proceswatertreatment via RO-installatie en koeltoren",
        "PFD P2-PFD-001-01 Rev.03; Demo Process VR"
    ))
    
    # --- Chapter 3: Laad- en Losprocedures ---
    doc.add_heading("3. Laad- en Losprocedures", level=1)
    doc.add_heading("3.1 Algemene 8-Stappen Procedure", level=2)
    p(doc, ref(
        "Alle laad- en losoperaties met gevaarlijke stoffen volgen de gestandaardiseerde 8-stappen procedure:",
        "D2 v1.0; PE-290-01 Control of Work"
    ))
    steps = [
        ("Stap 1: TRA uitvoeren", "Task Risk Analysis met betrokken medewerkers. Identificatie risico's: chemisch (bijting, reactie), fysiek (druk, vallen), omgevingsfactoren (weer, verlichting). Documentatie verplicht."),
        ("Stap 2: Werkvergunning", "Aanvragen en goedkeuren werkvergunning (Control of Work, PE-290-01). Geldigheidsduur: maximaal 1 werkdag. Herkeuring bij wijzigingen."),
        ("Stap 3: PBM-check", "Verificatie PBM's conform PBM-matrix (§5). Minimaal: zuurbestendige handschoenen, veiligheidsbril, beschermende kleding, laarzen. Adembescherming bij vernevelingsrisico."),
        ("Stap 4: Niveaucheck tank", "Verificatie vullingsgraad ontvangende tank. Max 95% vullingsgraad (overloopbeveiliging met high-level alarm + interlock bij 95%)."),
        ("Stap 5: Slangen en koppelingen controle", "Visuele inspectie slangen, koppelingen, aarding. Geen beschadigingen, correcte materialen (PP/PTFE voor bijtende stoffen). Droogproef verplicht."),
        ("Stap 6: Nooddouche beschikbaar", "Verificatie bereikbaarheid nooddouche + oogdoucher binnen 10 seconden loopafstand. Test waterdoorstroming."),
        ("Stap 7: Communicatie", "Buddy-systeem: minimaal 2 personen bij laad-/losoperaties. Portofoon bereikbaarheid. Informeren portier/calamiteitenpost."),
        ("Stap 8: Brandblusmiddelen", "Minimaal 2 poederblussers (6 kg) in directe nabijheid. CO₂-blusser voor elektrailverts."),
    ]
    for title, desc in steps:
        p(doc, f"{title}: {desc}")
    
    doc.add_heading("3.2 Stofspecifieke Maatregelen", level=2)
    doc.add_heading("3.2.1 H₂SO₄ Lossen", level=3)
    p(doc, ref(
        "• Aarding vrachtwagen en opslagtank verplicht (statische elektriciteit)\n"
        "• Veiligheidslang (PTFE-geleid) met droge lucht voorblazen\n"
        "• Droogproef: slang en leiding spoelen met lucht vóór vullen\n"
        "• Niveau-indicator continu monitoren (max 95%)\n"
        "• Na lossen: spoelen leidingen met water → opvangen in opvangvoorziening\n"
        "• Logboek bijhouden: volume, tijd, leverancier, afwijkingen",
        "MSDS H₂SO₄; PGS 15:2025, M45; D2 v1.0"
    ))
    doc.add_heading("3.2.2 NaOH 50% Lossen", level=3)
    p(doc, ref(
        "• Temperatuurscontrole: NaOH 50% kristalliseert bij <12°C → verwarmingstracing verplicht bij koude weersomstandigheden\n"
        "• Geleidelijk pompen: exotherme reactierisico bij menging met water/zuren\n"
        "• Aparte slangen en koppelingen: NAUIT gedeelde equipment met H₂SO₄\n"
        "• Spatwanden of -schermen bij lospunt\n"
        "• Containe picking: NaOH in aparte vakken van H₂SO₄ (minimaal fysieke scheiding)",
        "MSDS NaOH; PGS 15:2025, Bijlage E"
    ))
    
    # --- Chapter 4: Tankinspectie & Onderhoud ---
    doc.add_heading("4. Tankinspectie & Onderhoud", level=1)
    doc.add_heading("4.1 Inspectieprogramma (M84)", level=2)
    p(doc, ref(
        "Periodieke keuring van opslagfaciliteiten conform PGS 15:2025 §7.4.2:",
        "PGS 15:2025, §12, M84"
    ))
    add_table(doc,
        ["Component", "Frequentie", "Norm", "Verantwoordelijke"],
        [
            ["Tank-exterieur (corrosie, lekkage)", "Maandelijks", "Visueel + gedocumenteerd", "Operator"],
            ["Tank-interieur (als leeg)", "Jaarlijks of bij lediging", "NEN-EN 14015 / API 653", "Inspectiebedrijf"],
            ["Lekdetectiesysteem (dubbelwandig)", "Continu + maandelijks functioneel", "Fabrikantspecificatie", "Operator"],
            ["Overloopbeveiliging (95% interlock)", "Maandelijks", "Functioneel test", "Operator"],
            ["Opvangvoorzieningen", "Maandelijks", "Visueel (scheuren, lekkage)", "Operator"],
            ["Slangen en koppelingen", "Per gebruik + jaarlijks", "Visueel + drukproef", "Operator"],
            ["Nooddouche / oogdoucher", "Wekelijks", "Functioneel test (waterdoorstroming)", "Operator"],
            ["Brandblusmiddelen", "Jaarlijks", "NEN 2559", "Keuringsinstantie"],
            ["Verpakkingen (IBC/jerrycan)", "Bij ontvangst + opslag", "M45: beschadiging, corrosie, lekkage", "Magazijnmedewerker"],
        ]
    )
    
    doc.add_heading("4.2 Preventief Onderhoud", level=2)
    p(doc, ref(
        "Preventief onderhoud conform PS-510 Preventief Onderhoud en OEM-vereisten:\n"
        "• Fusion-tanks: jaarlijkse inspectie PP-gelining (scheuren, blaarvorming)\n"
        "• Pompen en leidingen: halfjaarlijks (seals, packings, corrosie)\n"
        "• Verwarmingstracing (NaOH): jaarlijks vóór winterseizoen\n"
        "• Elektrochemische cellen: conform fabrikantspecificatie\n"
        "• Scrubber: driemaandelijks (vulling, doorstroming)\n"
        "• KO- en PA-compressoren: conform OEM-schema",
        "PS-510 Preventief Onderhoud; Plant Layout; PFD"
    ))
    
    # --- Chapter 5: PBM-Matrix ---
    doc.add_heading("5. PBM-Matrix", level=1)
    p(doc, ref(
        "De PBM-matrix is gebaseerd op de PBM Matrix Draft 1 en het PBM Beleid PS-201-NL V1.0. Per activiteit worden de vereiste beschermingsmiddelen gespecificeerd:",
        "PBM Matrix Draft 1; PS-201-NL PBM Beleid V1.0; PGS 15:2025, §10, M85/M88"
    ))
    add_table(doc,
        ["Activiteit", "Handschoenen", "Bril/Masker", "Kleding", "Laarzen", "Adembescherming"],
        [
            ["H₂SO₄ laden/lossen", "PVC/nitril (zuurbestendig)", "Face shield + bril", "Zuurbestendig pak", "Zuurbestendig", "Bij verneveling: FFP3"],
            ["NaOH laden/lossen", "Nitril/neopreen", "Face shield + bril", "Beschermkleding", "Chemisch bestendig", "Bij verneveling: FFP3"],
            ["Vanadium hantering", "Nitril", "Veiligheidsbril", "Beschermkleding", "Staalneus", "FFP3 (H341 mutageen)"],
            ["Monstername", "Stofspecifiek", "Veiligheidsbril", "Lab jas", "Gesloten schoeisel", "Afhangkek (STOF)"],
            ["Tankinspectie (extern)", "Werkhandschoenen", "Veiligheidsbril", "Werkkleding", "Staalneus", "Nee"],
            ["Tankinspectie (intern)", "Chemisch bestendig", "Full face masker", "Chemisch pak", "Chemisch bestendig", "JA (SCBA of luchtlijn)"],
            ["Onderhoud leidingen", "Stofspecifiek", "Veiligheidsbril", "Werkkleding", "Staalneus", "Bij risico"],
            ["Lekkage opruimen", "Stofspecifiek + dik", "Face shield", "Chemisch pak", "Chemisch bestendig", "JA (FFP3 of SCBA)"],
            ["H₂O₂ hantering", "Nitril", "Veiligheidsbril", "Beschermkleding", "Staalneus", "Bij verneveling"],
        ]
    )
    p(doc, ref("Bron: PBM Matrix Draft 1; PS-201-NL; MSDS H₂SO₄; MSDS NaOH; PGS 15:2025, M85", "PBM Matrix; PS-201-NL"), size=9)
    
    # --- Chapter 6: Noodprocedures ---
    doc.add_heading("6. Noodprocedures", level=1)
    doc.add_heading("6.1 Lekkageprocedure", level=2)
    p(doc, ref(
        "Bij lekkage van bijtende stoffen (H₂SO₄, NaOH, HCl) geldt de volgende procedure conform PGS 15:2025 M120 en het BNP-V1:",
        "PGS 15:2025, M120; BNP-V1; PGS 15:2025, M119"
    ))
    steps = [
        "1. ALARM: Waarschuw omstandigheden; evacueer directe omgeving (min 10 m)",
        "2. BEVEILIG: Draag volledige PBM's (zie §5: lekkage opruimen)",
        "3. BRON: Stop lekkage indien veilig mogelijk (afsluiten klep, rechtop zetten container)",
        "4. OPVANG: Stuur lekkende vloeistof naar opvangvoorziening of gebruik nood-opvang",
        "5. NEUTRALISEER: Strooi neutralisatiemiddel (soda voor H₂SO₄; citroenzuur voor NaOH)",
        "6. ABSORBEER: Gebruik zuur/base-bestendig absorptiemateriaal",
        "7. RUIM OP: Verzamel gemorst materiaal in goedgekeurde afvalcontainer (ADR)",
        "8. SPOEL: Spoel oppervlak met overvloedig water (opvangen in opvangvoorziening)",
        "9. RAPPORT: Meld incident aan HSE Manager; documenteer in incidentenregister",
        "10. EVALUATIE: Root-cause analyse conform HSE Policy-V1, §4",
    ]
    for s in steps:
        doc.add_paragraph(s, style='List Bullet')
    
    doc.add_heading("6.2 Brandprocedure", level=2)
    p(doc, ref(
        "Hoewel H₂SO₄ en NaOH onbrandbaar zijn, kan brand ontstaan door externe oorzaken of reactie met brandbare materialen. "
        "Procedure conform BNP-V1 en PGS 15:2025 M115/M121:",
        "BNP-V1; PGS 15:2025, M115, M121"
    ))
    steps = [
        "1. ALARM: Activeer brandalarm; bel 112 (of interne noodlijn)",
        "2. EVACUEER: Via aangewezen vluchtroutes naar verzamelpunt",
        "3. BHV: BHV'er beoordeelt situatie; inzet draagbaar blustoestel indien veilig",
        "4. BRANDWEER: Bij brand in/nabij opslag gevaarlijke stoffen → direct brandweer inschakelen",
        "5. INFORMATIE: Overhandig stoffenlijst + plattegrond aan brandweer (M116/M117)",
        "6. BEHEERS: Laat bluswater niet in riolering/oppervlaktewater stromen (M29)",
        "7. COMMUNICEER: Informeer Workpermit Coördinator → Piketfunctionaris → Hoofd BHV",
    ]
    for s in steps:
        doc.add_paragraph(s, style='List Bullet')
    
    doc.add_heading("6.3 Evacuatieprocedure", level=2)
    p(doc, ref(
        "Evacuatie conform BNP-V1 Plant One Rotterdam:\n"
        "• Ontruimingssignaal → medewerkers verlaten gebouw via vluchtroutes\n"
        "• Verzamelpunt: projectenkantoor/aangewezen locatie\n"
        "• Ontruimingsleiders controleren volledigheid ontruiming\n"
        "• Portier (24/7 beschikbaar) coördineert externe communicatie\n"
        "• Bij aankomst OVD (Officier van Dienst): overdracht commando aan Gezamenlijke Brandweer",
        "BNP-V1, §Ontruiming; BNP-V1, §Calamiteitenorganisatie"
    ))
    
    doc.add_heading("6.4 Koppeling BNP", level=2)
    p(doc, ref(
        "Het BNP van Phoenix Metals is een toevoeging op het BNP van Plant One Rotterdam (POR) en Huntsman Rotterdam. "
        "Calamiteitenorganisatie:\n"
        "• Workpermit Coördinator → eerste aanspreekpunt\n"
        "• Piketfunctionaris → coördinatie bij afwezigheid\n"
        "• Ontruimingsleiders → uitvoering evacuatie\n"
        "• BHV'ers → eerste hulp en brandbestrijding\n"
        "• Portier terrein 5210 → 24/7 bereikbaar\n"
        "• Hoofd BHV → algehele coördinatie\n"
        "• Gezamenlijke Brandweer → externe hulpverlening (neemt over bij OVD-aankomst)",
        "BNP-V1, §Calamiteitenorganisatie"
    ))
    
    # --- Chapter 7: Arbowetgeving ---
    doc.add_heading("7. Arbowetgeving", level=1)
    doc.add_heading("7.1 CMR-stoffen", level=2)
    p(doc, ref(
        "Vanadiumoplossingen dragen H341 (verdacht van het veroorzaken van genetische defecten) → CMR-categorie 2. "
        "Conform Arbobesluit art. 4.1c is blootstelling aan CMR-stoffen zo veel mogelijk te beperken. "
        "Maatregelen:\n"
        "• Substitutie-overweging: documenteren waarom vanadium niet vervangbaar is\n"
        "• Technische maatregelen: gesloten systeem, lokale afzuiging\n"
        "• Organisatorische maatregelen: beperking blootstellingstijd, minimaal aantal personen\n"
        "• PBM's: FFP3-adembescherming, handschoenen, beschermkleding\n"
        "• Registratie: blootstellingsregister conform Arbobesluit art. 4.17",
        "Arbobesluit art. 4.1c; Chemicals Master v2.1.0; MSDS vanadium (H341)"
    ))
    doc.add_heading("7.2 MAC-waarden", level=2)
    p(doc, ref(
        "Maximum Arbeidsplaats Concentraties (MAC) voor relevante stoffen:\n"
        "• H₂SO₄ (damp/aerosol): 0,1 mg/m³ (TGG-15min)\n"
        "• NaOH (aerosol): 2 mg/m³ (TGG-15min)\n"
        "• HCl (gas): 3 mg/m³ (TGG-8h), 7,5 mg/m³ (TGG-15min)\n"
        "• Vanadium (V₂O₅, respirabel): 0,025 mg/m³ (TGG-8h)\n\n"
        "Monitoring: Periodieke arbeidshygiënische metingen bij activiteiten met blootstellingsrisico. "
        "Resultaten registreren in blootstellingsregister.",
        "SER MAC-waardenlijst; Arbobesluit art. 4.2"
    ))
    doc.add_heading("7.3 PAGO (Periodiek Arbeidsgezondheidkundig Onderzoek)", level=2)
    p(doc, ref(
        "Medewerkers die regelmatig werken met CMR-stoffen (vanadium, H341) of bijtende stoffen hebben recht op PAGO. "
        "Het PAGO moet minimaal de volgende aspecten bevatten:\n"
        "• Longfunctieonderzoek (inhalatie blootstelling)\n"
        "• Huidonderzoek (contact bijtende stoffen)\n"
        "• Oogonderzoek (spatrisico)\n"
        "• Blootstellingsregistratie\n"
        "Frequentie: bij aanvang dienstverband, daarna periodiek (meestal 2-jaarlijks) of bij verandering werkzaamheden.",
        "Arbobesluit art. 4.17; Arbowet art. 5; HSE Policy-V1, §5"
    ))
    
    # --- Chapter 8: RI&E-koppeling ---
    doc.add_heading("8. RI&E-koppeling", level=1)
    p(doc, ref(
        "De Risico-Inventarisatie en -Evaluatie (RI&E) van Phoenix Metals is gekoppeld aan de PGS-15 maatregelen als volgt:",
        "RI&E Inventarisatie PhoenixMetals; RI&E MKB; RI&E Action Plan"
    ))
    add_table(doc,
        ["PGS-15 Maatregel", "RI&E-Risico", "Beheersmaatregel", "Status"],
        [
            ["Scheiding H₂SO₄/NaOH (M35)", "Chemische reactie bij menging", "Fysieke scheiding; aparte vakken", "Te implementeren"],
            ["Opvangvoorziening (M30)", "Bodem-/waterverontreiniging", "110% grootste verpakking", "Te implementeren"],
            ["PBM's (M85)", "Blootstelling bijtende stoffen", "PBM-matrix per activiteit", "Draft → formaliseren"],
            ["Lekkage-instructie (M120)", "Onvoldoende kennis/voorbereiding", "Procedure + training", "Te implementeren"],
            ["Brandblusmiddelen (M95)", "Onvoldoende bluscapaciteit", "Min. 2× 6 kg poederblusser", "Te implementeren"],
            ["Inspectieprogramma (M84/M45)", "Veroudering apparatuur", "Periodieke keuringstabel", "Te implementeren"],
            ["Training (M85)", "Onvoldoende deskundigheid", "Training matrix + jaarlijkse herhaling", "Deels (opleiding matrix 2024)"],
            ["CMR-beheersing (H341)", "Genetische schade vanadium", "Gesloten systeem + FFP3 + PAGO", "Te implementeren"],
        ]
    )
    p(doc, ref(
        "Het RI&E Actieplan (2024) bevat prioriteiten en deadlines. De PGS-15 specifieke acties dienen te worden toegevoegd aan het actieplan.",
        "RI&E Action Plan; RI&E MKB Inventarisatie"
    ))
    
    # --- Chapter 9: Training & Competentie ---
    doc.add_heading("9. Training & Competentie", level=1)
    doc.add_heading("9.1 Verplichte Trainingen", level=2)
    p(doc, ref(
        "Conform PGS 15:2025 §7.4.3 en HSE Policy-V1 §4 zijn de volgende trainingen verplicht:",
        "PGS 15:2025, §13.2; HSE Policy-V1, §4; Opleiding matrix 2024"
    ))
    add_table(doc,
        ["Training", "Doelgroep", "Frequentie", "Inhoud"],
        [
            ["Veilig werken met bijtende stoffen", "Alle medewerkers", "Bij aanstelling + jaarlijks", "H₂SO₄/NaOH gevaren, PBM's, lekkageprocedure, nooddouche"],
            ["PGS-15 bewustzijn", "Operators + HSE", "Bij aanstelling + 2-jaarlijks", "PGS-15 basis, veiligheidsniveaus, scheiding, opvang"],
            ["Laad-/losprocedures", "Logistiek personeel", "Bij aanstelling + jaarlijks", "8-stappen procedure, stofspecifieke maatregelen, TRA"],
            ["BHV/BNP", "BHV'ers", "Jaarlijks + drill", "Evacuatie, brandbestrijding, eerste hulp, stoffenlijst"],
            ["ADR-bewustzijn", "Logistiek personeel", "Bij aanstelling", "ADR-classificatie, etikettering, transportveiligheid"],
            ["Chemische veiligheid (exposure)", "Alle medewerkers", "Jaarlijks", "CMR-stoffen, MAC-waarden, PAGO, blootstellingsregister"],
            ["MOC (Management of Change)", "Leidinggevenden + HSE", "Bij wijziging", "Beoordeling risico's bij proces/wijzigingen (PE-202-01)"],
            ["PSSR (Pre-Startup Safety Review)", "Operators + HSE", "Bij opstart", "Veiligheidsreview voor ingebruikname (HS-P-0018)"],
        ]
    )
    
    doc.add_heading("9.2 Competentiemanagement", level=2)
    p(doc, ref(
        "Competentiemanagement conform de opleiding matrix 2024 en HSE Policy-V1:\n"
        "• Elke medewerker heeft een competentieprofiel met vereiste en behaalde trainingen\n"
        "• Trainingen worden gedocumenteerd en geregistreerd\n"
        "• Jaarlijkse evaluatie van competenties door leidinggevende\n"
        "• Externe deskundigheid (arbeidshygiënist, veiligheidskundige) beschikbaar via JvG Consultancy\n"
        "• Periodieke hercertificering conform geldigheidstermijnen",
        "Opleiding matrix 2024; HSE Policy-V1, §5; PE-210-04 Document Control V14"
    ))
    
    # --- Chapter 10: Referenties ---
    doc.add_heading("10. Referenties", level=1)
    refs = [
        "PGS 15:2025 versie 1.0 (januari 2025) — Opslag van verpakte gevaarlijke stoffen.",
        "Phoenix Metals B.V. (2025). HSE Policy V1.",
        "Phoenix Metals B.V. (2024). Bedrijfsnoodplan (BNP) Plant One Rotterdam V1.",
        "Phoenix Metals B.V. (2024). PBM Matrix Phoenix Metals Draft 1.",
        "Phoenix Metals B.V. PBM Beleid PS-201-NL V1.0.",
        "MSDS Sulfuric Acid 25-75%. Carl Roth.",
        "MSDS Sodium Hydroxide 50%. Carl Roth.",
        "Phoenix Metals B.V. (2024). Chemicals Master v2.1.0.",
        "Phoenix Metals B.V. (2025). Uitgangspuntendocument Phoenix Metals IJmuiden.",
        "Phoenix Metals B.V. PFD P2-PFD-001-01 Rev.03.",
        "Phoenix Metals B.V. Plant Layout (1M liter plant).",
        "Phoenix Metals B.V. Demo Process VR.",
        "Phoenix Metals B.V. PE-290-01 Control of Work.",
        "Phoenix Metals B.V. PE-202-01 Management of Change V1.",
        "Phoenix Metals B.V. HS-P-0018 Procedure PSSR.",
        "Phoenix Metals B.V. PE-240-01 Gevaarlijke Stoffen Procedure.",
        "Phoenix Metals B.V. PE-210-04 Document Control V14.",
        "Phoenix Metals B.V. PS-510 Preventief Onderhoud.",
        "Phoenix Metals B.V. PS-230-PBZO Beleid.",
        "Phoenix Metals B.V. Opleiding Matrix 2024.",
        "Phoenix Metals B.V. RI&E Inventarisatie.",
        "Phoenix Metals B.V. RI&E MKB Inventarisatie.",
        "Phoenix Metals B.V. RI&E Action Plan.",
        "Arcadis (2025). Rapport haalbaarheidsstudie V04 (concept).",
        "Verslag vooroverleg 23 september 2023.",
        "Arbeidsomstandighedenwet / Arbobesluit.",
        "Besluit activiteiten leefomgeving (Bal).",
        "BRZO 2015 / Seveso III-richtlijn.",
        "CLP-verordening (EG) 1272/2008.",
        "REACH (EG) 1907/2006.",
        "ADR 2025.",
        "NEN 2559 — Keuring draagbare brandblusmiddelen.",
        "NEN-EN 14015 — Verticale cilindrische tanks.",
    ]
    for i, r in enumerate(refs, 1):
        doc.add_paragraph(f"[{i}] {r}", style='List Number')
    
    # Save
    path = os.path.join(OUTPUT_DIR, "PGS15_Veilig_Werken_HSEQ_Phoenix_Metals_D2_v2.0.docx")
    doc.save(path)
    print(f"D2 v2.0 opgeslagen: {path}")
    return path


if __name__ == "__main__":
    os.makedirs(OUTPUT_DIR, exist_ok=True)
    d1_path = generate_d1()
    d2_path = generate_d2()
    print(f"\n✅ Beide documenten gegenereerd:")
    print(f"   D1: {d1_path}")
    print(f"   D2: {d2_path}")
