#!/usr/bin/env python3
"""Genereer D3 v2.0, D4 v2.0, Kennisdossier"""
import os, datetime
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

BASE = "/root/projects/jg/2026-pgs15-phoenix-metals"
DOCX_DIR = f"{BASE}/deliverables/docx"
LOGO_PATH = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
NOW = datetime.datetime.now().strftime("%d %B %Y")

os.makedirs(DOCX_DIR, exist_ok=True)

def make_doc(title, subtitle=""):
    doc = Document()
    style = doc.styles['Normal']
    style.font.name = 'Calibri'
    style.font.size = Pt(11)
    for level in range(1, 4):
        hs = doc.styles[f'Heading {level}']
        hs.font.color.rgb = RGBColor(0, 51, 102)
        hs.font.name = 'Calibri'
    section = doc.sections[0]
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2)
    header = section.header
    if os.path.exists(LOGO_PATH):
        hp = header.paragraphs[0]
        hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        run = hp.add_run()
        run.add_picture(LOGO_PATH, width=Inches(1.5))
    footer = section.footer
    fp = footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = fp.add_run(f"JvG Consultancy — {title}")
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(128, 128, 128)
    doc.add_paragraph("")
    doc.add_paragraph("")
    tp = doc.add_paragraph()
    tp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = tp.add_run(title)
    run.bold = True
    run.font.size = Pt(24)
    run.font.color.rgb = RGBColor(0, 51, 102)
    if subtitle:
        sp = doc.add_paragraph()
        sp.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = sp.add_run(subtitle)
        run.font.size = Pt(14)
        run.font.color.rgb = RGBColor(80, 80, 80)
    dp = doc.add_paragraph()
    dp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = dp.add_run(f"Phoenix Metals B.V. — Plant One Rotterdam\n{NOW}")
    run.font.size = Pt(11)
    run.font.color.rgb = RGBColor(100, 100, 100)
    doc.add_paragraph("")
    conf = doc.add_paragraph()
    conf.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = conf.add_run("CONFIDENTIAL — JvG Consultancy")
    run.font.size = Pt(9)
    run.font.color.rgb = RGBColor(180, 0, 0)
    doc.add_page_break()
    return doc

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

def bul(doc, text, level=0):
    p = doc.add_paragraph(text, style='List Bullet')
    p.paragraph_format.left_indent = Cm(1.27 + level * 0.63)

# ═══ D3 v2.0 ═══
def gen_d3():
    doc = make_doc("PGS-15 Veiligheidsinfo & Documentatie", "D3 v2.0 — Phoenix Metals B.V.")
    doc.add_heading("Inhoudsopgave", 1)
    for t in ["1. Management Summary","2. Opslaginstructies per Stof","3. SDS-Vereisten","4. Tank- en Leidingetikettering","5. Documentbeheer","6. PGS 15:2025 Paragraafreferenties"]:
        doc.add_paragraph(t)
    doc.add_page_break()

    doc.add_heading("1. Management Summary", 1)
    doc.add_paragraph("Dit document (D3 v2.0) bevat de volledige veiligheidsinformatie en documentatiestructuur voor Phoenix Metals B.V., conform PGS 15:2025 Nieuwe Stijl. Het omvat opslaginstructies per stof, SDS-vereisten, etikettering van tanks en leidingen, en een documentbeheersysteem met 11 verplichte documenttypen.")
    doc.add_paragraph("Belangrijke wijzigingen t.o.v. v1.0:")
    for b in ["Volledige uitlijning op PGS 15:2025 Nieuwe Stijl (scenario's S1-S16, maatregelen M1-M167)","Uitgebreide GHS/CLP-etiketteringsspecificaties","Documentbeheer uitgebreid naar 11 verplichte typen","SVHC-monitoring structuur geïntegreerd"]:
        bul(doc, b)

    doc.add_heading("2. Opslaginstructies per Stof", 1)
    
    # H2SO4
    doc.add_heading("2.1 Zwavelzuur (H₂SO₄)", 2)
    add_tbl(doc, ["Parameter","Waarde"],[
        ["ADR-klasse","8 (Bijtend)"],["UN-nummer","UN 1830 (>51%) / UN 2796 (≤51%)"],["Verpakkingsgroep","II"],["CAS-nummer","7664-93-9"],
        ["H-zinnen","H290: Kan corrosief zijn voor metalen; H314: Ernstige huidverbrandingen en oogletsel"],
        ["Concentraties op voorraad","25% (4×25L), 50% (7×10L), 75% (3×10L)"],["Totale voorraad","200 L"],
        ["Veiligheidsniveau","Basis (onbrandbaar, dedicated opslag)"],["Wbdbo-eis","Geen (onbrandbaar ADR-8 VG II)"],["Opvangcapaciteit","110% grootste verpakking of 10% totaal"],
    ])
    doc.add_paragraph("")
    doc.add_heading("Opslagvereisten H₂SO₄", 3)
    for b in ["Vorstvrij, droog en goed geventileerd opslaan","GESCHEIDEN van basen (NaOH) — PGS 15:2025 Bijlage E, §7.3",
              "GESCHEIDEN van oxiderende stoffen (ADR-klasse 5.1)","GESCHEIDEN van brandbare stoffen (ADR-klasse 3)",
              "Neutralisatiemiddel beschikbaar: natriumcarbonaat (soda)","Opvangvoorziening bestand tegen zwavelzuur",
              "Nooddouche + oogdoucher binnen 10 sec loopafstand","PBM's: zuurbestendige handschoenen, veiligheidsbril/face shield, beschermende kleding",
              "Condenscorrosie voorkomen bij buitenopslag"]:
        bul(doc, b)

    # NaOH
    doc.add_heading("2.2 Natriumhydroxide (NaOH 50%)", 2)
    add_tbl(doc, ["Parameter","Waarde"],[
        ["ADR-klasse","8 (Bijtend)"],["UN-nummer","UN 1824"],["Verpakkingsgroep","II"],["CAS-nummer","1310-73-2"],
        ["H-zinnen","H290: Kan corrosief zijn voor metalen; H314: Ernstige huidverbrandingen en oogletsel"],
        ["Concentratie","50% oplossing"],["Hoeveelheid","4×25L = 100L"],["Veiligheidsniveau","Basis"],
        ["Kristallisatiepunt","~12°C — temperatuurbewaking + tracing vereist"],["Min. opslagtemperatuur",">15°C aanbevolen"],
    ])
    doc.add_paragraph("")
    doc.add_heading("Opslagvereisten NaOH", 3)
    for b in ["Vorstvrij opslaan: >15°C (kristallisatierisico bij <12°C)","Temperatuurbewaking met alarm bij <12°C (PGS 15:2025 M30)",
              "Verwarmingstracing op leidingen","GESCHEIDEN van zuren (H₂SO₄) — Bijlage E",
              "GESCHEIDEN van amfotere metalen (aluminium, zink)","Neutralisatiemiddel: citroenzuur of azijnzuuroplossing",
              "PBM's: bijtwerende handschoenen (nitril/neopreen), veiligheidsbril, beschermkleding"]:
        bul(doc, b)

    # Vanadium
    doc.add_heading("2.3 Vanadiumoplossingen", 2)
    add_tbl(doc, ["Parameter","Waarde"],[
        ["ADR-klasse","9 (Milieugevaarlijk)"],["UN-nummer","UN 3082 (waarschijnlijk)"],["Verpakkingsgroep","III"],
        ["Milieugevaarlijkheid","Ja — 'Dode boom/vis' symbool verplicht"],["Veiligheidsniveau","Basis"],
        ["Bluswateropvang","100% bij veiligheidsniveau A"],
    ])
    doc.add_paragraph("")
    for b in ["SDS ontbreekt — ACTION: MSDS vanadiumconcentraat aanvragen","Milieugevaarlijk: voorkomen lozing naar riool/oppervlaktewater",
              "Absorptiemateriaal beschikbaar","PBM's: handschoenen, veiligheidsbril, evt. adembescherming"]:
        bul(doc, b)

    doc.add_page_break()
    doc.add_heading("3. SDS-Vereisten", 1)
    doc.add_heading("3.1 Wettelijk kader", 2)
    doc.add_paragraph("SDS zijn verplicht conform REACH art. 31 en CLP EG 1272/2008. PGS 15:2025 M137 vereist SDS beschikbaar voor alle opgeslagen gevaarlijke stoffen.")
    
    doc.add_heading("3.2 SDS-overzicht Phoenix Metals", 2)
    add_tbl(doc, ["Stof","SDS Beschikbaar","Leverancier","Actie"],[
        ["H₂SO₄ 25%","Ja","RCI Labscan","Geen"],["H₂SO₄ 50%","Ja","RCI Labscan","Geen"],
        ["H₂SO₄ 75%","Ja","RCI Labscan","Geen"],["NaOH 50%","Ja","Merck/Millipore","Geen"],
        ["Vanadiumconcentraat","❌ NEE","—","⚠️ ACTIE: SDS aanvragen"],
    ])
    
    doc.add_heading("3.3 SDS-beheereisen", 2)
    for b in ["Taal: Nederlands (officiële taal lidstaat)","Actualiteit: max 5 jaar, herzien bij nieuwe info",
              "Toegankelijkheid: digitaal en fysiek","REACH 16-sectie formaat verplicht",
              "Vervallen SDS bewaren 10 jaar","SVHC-monitoring: ECHA-candidaatlijst 2x/jaar controleren"]:
        bul(doc, b)

    doc.add_page_break()
    doc.add_heading("4. Tank- en Leidingetikettering", 1)
    doc.add_heading("4.1 Tanketikettering (M135-M136)", 2)
    doc.add_paragraph("Elke tank/opspla seenheid moet etiket bevatten conform CLP en PGS 15:2025:")
    add_tbl(doc, ["Element","Vereiste","Specificatie"],[
        ["Productnaam","Verplicht","Volledige chemische naam"],["CAS-nummer","Verplicht","Uniek identificatienummer"],
        ["GHS-pictogrammen","Verplicht","Min 10×10 cm, NEN-EN-ISO 20560"],["Signaalwoord","Verplicht","GEVAAR of WAARSCHUWING"],
        ["H-zinnen","Verplicht","Alle relevante"],["P-zinnen","Verplicht","Relevante voorzorgsmaatregelen"],
        ["UN-nummer","Verplicht","ADR-classificatie"],["Tankinhoud","Verplicht","Volume in liters"],
        ["Leverancier","Verplicht","Naam + contact"],["Noodtelefoon","Verplicht","24/7 bereikbaar"],
    ])

    doc.add_heading("4.2 GHS-pictogrammen per stof", 2)
    add_tbl(doc, ["Stof","GHS-pictogram(men)","Signaalwoord"],[
        ["H₂SO₄","GHS05 (Corrosief) + GHS07","GEVAAR"],["NaOH 50%","GHS05 (Corrosief)","GEVAAR"],
        ["Vanadiumoplossing","GHS07 + GHS09 (Milieu)","WAARSCHUWING"],
    ])

    doc.add_heading("4.3 Leidingetikettering", 2)
    for b in ["Stofnaam duidelijk leesbaar","Stroomrichtingspijl","Gevarensymbolen NEN-EN-ISO 20560",
              "Kleurcodering Arboregeling art. 8.12-8.14","Etikettering bij elke verbinding/klep/wanddoorvoer"]:
        bul(doc, b)

    doc.add_heading("4.4 Waarschuwingsborden opslagvoorziening", 2)
    for b in ["ADR-etiket klasse 8: min 20×20 cm buitenzijde (M135)","Verbodsbord 'Vuur/roken verboden' NEN-EN-ISO 7010 (M68)",
              "Toegangsbeperking 'Bevoegd personeel' (M36)","Calamiteiteninstructie zichtbaar bij toegang (M121)"]:
        bul(doc, b)

    doc.add_page_break()
    doc.add_heading("5. Documentbeheer — 11 Verplichte Documenttypen", 1)
    add_tbl(doc, ["#","Documenttype","Maatregel","Verantwoordelijke","Update"],[
        ["1","Stoffenlijst","M116","HSE Manager","Continu"],["2","SDS/VIB's","M137/REACH","HSE Manager","Max 5 jaar"],
        ["3","Plattegrond opslag","M116","Facility Mgr","Bij wijziging"],["4","Calamiteiteninstructie","M121","HSE Manager","Jaarlijks"],
        ["5","Lekkage-instructie","M120","HSE Manager","Jaarlijks"],["6","Noodplan (intern)","M115","HSE Manager","Jaarlijks"],
        ["7","RI&E","Arbowet art. 5","HSE + Arbo","Jaarlijks"],["8","Keuringsrapporten","M36","Facility Mgr","Per keuring"],
        ["9","UPD (VBB)","M99","VBB-ontwerper","Bij wijziging"],["10","Wbdbo-rapportage","M21-M25","Bouwkundig","Bij wijziging"],
        ["11","Opleidingsrecords","§7.4.3/M85","HR/HSE","Per training"],
    ])

    doc.add_heading("5.1 Documentcontrol-procedure", 2)
    for b in ["Alle documenten: versienummer, datum, goedkeuringsstatus","Documenteigenaar verantwoordelijk voor actualiteit",
              "Verouderde versies naar archief (niet verwijderen)","Jaarlijkse review door HSE Manager",
              "Stoffenlijst + plattegrond hardcopy aan brandweer (M116-M118)"]:
        bul(doc, b)

    doc.add_page_break()
    doc.add_heading("6. PGS 15:2025 Paragraafreferenties", 1)
    add_tbl(doc, ["Onderwerp","Paragraaf","Maatregel(en)"],[
        ["Opslaginstructies","§7.3","M21, M29, M30"],["SDS-vereisten","§7.5","M137"],
        ["Etikettering","§7.5.3","M135, M136"],["Opvangcapaciteit","§7.1","M29, M30, M32"],
        ["Scheiding zuren/basen","§7.3 + Bijlage E","—"],["Brandveiligheid","§7.2","M68, M71-73, M95-99, M134"],
        ["Arbeidsveiligheid","§7.3","M85, M88, M120"],["Documenten","§7.5","M115-118, M120-121, M137"],
        ["Scenariostudie","§6","S1-S16, D1-D13"],["Maatregelen","§6-§7","M1-M167, MW1"],
    ])

    fp = f"{DOCX_DIR}/PGS15_Veiligheidsinfo_Documentatie_Phoenix_Metals_D3_v2.0.docx"
    doc.save(fp)
    print(f"✅ D3 v2.0: {fp}")

# ═══ D4 v2.0 ═══
def gen_d4():
    doc = make_doc("PGS-15 Master SOP Opslagveiligheid", "D4 v2.0 — Phoenix Metals B.V.")
    
    doc.add_heading("Inhoudsopgave", 1)
    for t in ["1. Management Summary","2. Doel en Toepassingsgebied","3. Definities","4. RASCI-Matrix","5. Procedures (P-01 t/m P-15)","6. KPI's","7. Toelichtend Stuk","8. Referenties"]:
        doc.add_paragraph(t)
    doc.add_page_break()

    doc.add_heading("1. Management Summary", 1)
    doc.add_paragraph("Deze Master SOP (D4 v2.0) definieert 15 operationele procedures voor PGS 15:2025-conforme opslag bij Phoenix Metals B.V., Plant One Rotterdam. Inclusief RASCI-matrix, KPI's en implementatieplan.")
    for b in ["Alle opslag conform PGS 15:2025 Nieuwe Stijl — basisveiligheidsniveau voor H₂SO₄, NaOH, vanadium",
              "Strikte scheiding zuren (H₂SO₄) en basen (NaOH) — Bijlage E",
              "Temperatuurbewaking NaOH: alarm bij <12°C","15 procedures met verantwoordelijkheden en stappen",
              "10 KPI's gekoppeld aan maatregelen","Implementatie in 5 fasen over 10 weken"]:
        bul(doc, b)

    doc.add_heading("2. Doel en Toepassingsgebied", 1)
    doc.add_paragraph("Doel: Veilige, conforme opslag van gevaarlijke stoffen conform PGS 15:2025, ter bescherming van medewerkers, omgeving en bedrijfscontinuïteit.")
    doc.add_paragraph("Toepassingsgebied: Alle opslag bij Phoenix Metals B.V., Plant One Rotterdam. Alle medewerkers, contractanten en bezoekers.")
    doc.add_paragraph("Stoffen: ADR-klasse 8 (H₂SO₄ 25/50/75%, NaOH 50%) en ADR-klasse 9 (vanadiumoplossingen UN 3082).")
    doc.add_paragraph("Bindendheid: BINDEND. Overtreding kan leiden tot toegangsverbod.")

    doc.add_heading("3. Definities en Afkortingen", 1)
    add_tbl(doc, ["Term","Definitie"],[
        ["PGS 15:2025","Publicatiereeks Gevaarlijke Stoffen 15 — Opslag verpakte gevaarlijke stoffen"],
        ["ADR","Accord européen transport gevaarlijke stoffen over de weg"],
        ["SDS/VIB","Safety Data Sheet / Veiligheidsinformatieblad"],
        ["CLP","Classification, Labelling and Packaging (EG 1272/2008)"],
        ["REACH","Registration, Evaluation, Authorisation, Restriction of Chemicals"],
        ["SVHC","Substance of Very High Concern (ECHA)"],["ZZS","Zeer Zorgwekkende Stoffen (RIVM)"],
        ["Wbdbo","Weerstand branddoorslag/overslag"],["VBB","Vastopgestelde brandbeheersings-/blussysteem"],
        ["PBM","Persoonlijke BeschermingsMiddelen"],["RI&E","Risico-Inventarisatie en -Evaluatie"],
        ["CAPA","Corrective and Preventive Action"],["RASCI","Responsible, Accountable, Supporting, Consulted, Informed"],
    ])

    doc.add_heading("4. RASCI-Matrix", 1)
    doc.add_paragraph("R=Responsible, A=Accountable, S=Supporting, C=Consulted, I=Informed")
    add_tbl(doc, ["Procedure","HSE Mgr","Plant Mgr","Operator","Facility","HR"],[
        ["P-01 Niveaubewaking","A","I","R","S","—"],["P-02 Temperatuur","A","I","R","S","—"],
        ["P-03 Lekdetectie","A","I","R","S","—"],["P-04 Inventarisatie","R","A","S","—","—"],
        ["P-05 Laad/Los","A","I","R","S","—"],["P-06 Inspectie verp.","C","I","R","A","—"],
        ["P-07 Onderhoud","C","I","S","R/A","—"],["P-08 Incident","R/A","I","R","S","I"],
        ["P-09 Nood lekkage","R/A","I","R","S","I"],["P-10 Nood brand","R/A","I","R","S","I"],
        ["P-11 SVHC-monitoring","R/A","I","—","—","—"],["P-12 Etikettering","A","I","R","S","—"],
        ["P-13 Documentbeheer","R/A","I","S","S","—"],["P-14 Opleiding","R","A","I","—","S"],
        ["P-15 Interne audit","R/A","I","C","C","C"],
    ])

    doc.add_page_break()
    doc.add_heading("5. Procedures", 1)
    
    procs = [
        ("5.1 P-01: Tankniveaubewaking","M30",
         ["Doel: Voorkomen overloop en onbeheerd verlies","Frequentie: Continue + dagelijkse visuele check",
          "Stappen:","1. Niveausensor uitlezen per tank (continue)","2. High-level alarm bij 90% vullingsgraad",
          "3. High-high interlock bij 95% — pomp stopt automatisch","4. Dagelijkse visuele controle operator",
          "5. Afwijkingen direct melden HSE Manager","Records: SCADA-log, wekelijkse rapportage"]),
        ("5.2 P-02: Temperatuurbewaking","M30",
         ["Doel: Kristallisatie NaOH voorkomen","Frequentie: Continue",
          "1. Temperatuursensor per tank (NaOH-prioriteit)","2. Alarm NaOH <12°C — tracing inschakelen",
          "3. Alarm H₂SO₄ >40°C — ventilatie activeren","4. Controle tracing winters (okt-mrt)",
          "Records: Temperatuurlog 24/7, maandelijkse rapportage"]),
        ("5.3 P-03: Lekdetectie","M29",
         ["Doel: Direct detecteren lekkage","Type: Dubbelwandig (interstitieel) of bekkensensor",
          "Frequentie: Continue + maandelijkse test",
          "1. Sensorstatus uitlezen","2. Bij alarm: visuele inspectie + indammen",
          "3. Classificeren: klein (<1L), middel (1-50L), groot (>50L)","4. Noodprocedure P-09 indien nodig",
          "Records: Maandelijkse test, incidentrapporten"]),
        ("5.4 P-04: Inventarisatie Stoffen","M116-117",
         ["Doel: Actueel overzicht opgeslagen stoffen","Frequentie: Continue + maandelijks volledig",
          "1. Bij ontvangst: registreren in Chemicals Master","2. SDS toevoegen aan archief",
          "3. Locatie toewijzen (zuur- vs base-vak)","4. Maandelijks: telling vs register",
          "Records: Chemicals Master Register"]),
        ("5.5 P-05: Laad- en Losoperaties","M134",
         ["Doel: Veilig laden/lossen","Per operatie:",
          "1. Pre-check: PBM's, nooddouche, lekkagemateriaal","2. Stof identificeren + verifiëren",
          "3. Verpakking inspecteren","4. Correcte locatie (zuur- vs base-vak)",
          "5. Minimaal 2 personen","6. Na afloop: lekdetectie check + administratie",
          "Records: Laad/los-formulier"]),
        ("5.6 P-06: Inspectie Verpakkingen","M45",
         ["Doel: Beschadigde verpakkingen detecteren","Frequentie: Bij ontvangst + wekelijks",
          "1. Visuele inspectie: scheuren, corrosie, lekkage, etiket","2. Bij afwijking: isoleren",
          "3. Overpompen naar veilige container","Records: Inspectielijst"]),
        ("5.7 P-07: Onderhoud Opslagvoorzieningen","M36-38",
         ["Doel: Optmale staat opslagvoorzieningen","Frequentie: Maandelijks visueel, kwartaals preventief, jaarlijks uitgebreid",
          "1. Maandelijks: constructie, opvangbakken, ventilatie","2. Kwartaals: sensoren calibreren, blussers checken",
          "3. Jaarlijks: keuring gecertificeerd bedrijf","Records: Onderhoudslog"]),
        ("5.8 P-08: Incidentmanagement","M120-121",
         ["Doel: Gestructureerd omgaan met incidenten","1. Veiligheid waarborgen — indammen/evacueren",
          "2. Melden aan HSE binnen 15 min","3. Classificeren: near-miss / incident / ernstig",
          "4. Root-cause analyse binnen 48 uur","5. CAPA-formulier: eigenaar + deadline",
          "6. Communicatie + lessen delen","Records: Incidentenregister, CAPA-formulieren"]),
        ("5.9 P-09: Noodprocedure Lekkage","M119-120",
         ["Doel: Veilig reageren bij lekkage","ALARM — stappen:","1. Waarschuw collega's, evacueer directe omgeving",
          "2. PBM's aantrekken","3. Bron indammen: lekvrije bak, absorptiemateriaal",
          "4. NOOIT zuur en base mengen — exotherme reactie!","5. H₂SO₄: neutraliseren met soda",
          "6. NaOH: neutraliseren met citroenzuur","7. Groot (>50L): 112 bellen",
          "8. Opruimen in geschikt afvalvat","Records: Noodprocedure-formulier"]),
        ("5.10 P-10: Noodprocedure Brand","M95, M115",
         ["Doel: Veilig reageren bij brand","1. Brandalarm + evacueren","2. Brandweer 112 — locatie, stoffen, hoeveelheden",
          "3. NOOIT water op zuur-lekkage","4. Poederblusser (6 kg) voor kleine branden",
          "5. Grote brand: evacueren, wachten brandweer","6. Stoffenlijst + plattegrond beschikbaar stellen"]),
        ("5.11 P-11: SVHC-Monitoring","M137",
         ["Doel: SVHC/ZZS-stoffen tijdig identificeren","Frequentie: 2x/jaar + bij nieuwe leveringen",
          "1. ECHA-kandidaatlijst raadplegen","2. RIVM ZZS-lijst raadplegen",
          "3. Opgeslagen stoffen toetsen","4. Bij match: SDS actualiseren, autorisatiedossier",
          "5. Vervanging onderzoeken","Records: SVHC-rapport 2x/jaar"]),
        ("5.12 P-12: Etikettering en Signalering","M135-136",
         ["Zie D3 v2.0 §4 voor volledige specificaties","Maandelijks controle, direct bij wijziging"]),
        ("5.13 P-13: Documentbeheer","M115-121, M137",
         ["Zie D3 v2.0 §5 voor 11 verplichte documenttypen","Jaarlijkse review, versiebeheer, archivering"]),
        ("5.14 P-14: Opleiding en Training","§7.4.3, M85",
         ["Bij indiensttreding + jaarlijkse herhaling","Inhoud: PGS-15, stofgevaren, PBM, noodprocedures",
          "Records: Trainingsmatrix, certificaten"]),
        ("5.15 P-15: Interne Audit","PGS 15:2025",
         ["Minimaal jaarlijks + bij significante wijzigingen","Zie Audit Procedure v3.0 + Checklist v3.0"]),
    ]
    
    for title, ref, steps in procs:
        doc.add_heading(title, 2)
        p = doc.add_paragraph(f"Referentie: {ref}")
        p.runs[0].italic = True
        for s in steps:
            doc.add_paragraph(s)

    doc.add_page_break()
    doc.add_heading("6. KPI's", 1)
    add_tbl(doc, ["#","KPI","Doelwaarde","Frequentie","Bron"],[
        ["1","PGS-15 conformiteit","≥95%","Kwartaals","Audit P-15"],["2","Incidenten lekkage","<3/jaar","Continu","Register P-08"],
        ["3","SDS-beschikbaarheid","100%","Maandelijks","P-04"],["4","Temperatuuralarms opgevolgd","100%","Maandelijks","SCADA P-02"],
        ["5","Niveaubewaking interlocks","100%","Maandelijks","Test P-01"],["6","Lekdetectie tests","12/jaar","Maandelijks","P-03"],
        ["7","Opleidingsdekking","100%","Jaarlijks","P-14"],["8","Documenten actueel","100%","Kwartaals","P-13"],
        ["9","CAPA binnen deadline","≥90%","Kwartaals","P-08"],["10","SVHC-monitoring","2x/jaar","Semi-jaarlijks","P-11"],
    ])

    doc.add_page_break()
    doc.add_heading("7. Toelichtend Stuk — Implementatie", 1)
    doc.add_heading("7.1 Vijf fasen", 2)
    
    phases = [
        ("Fase 1: Voorbereiding (Wk 1-2)",["Gap-analyse t.o.v. PGS 15:2025","Materialen/resources inventariseren","Scheidingsplan opstellen","Etikettering bestellen"]),
        ("Fase 2: Fysieke implementatie (Wk 3-6)",["Opvangvoorzieningen plaatsen","Scheidingsmaatregelen","Etikettering aanbrengen","Nooddouche installeren","Temperatuursensoren + tracing"]),
        ("Fase 3: Documentatie (Wk 5-7)",["SDS-complete set","Stoffenlijst actualiseren","Plattegrond updaten","Instructies opstellen","11 documenttypen compleet"]),
        ("Fase 4: Training (Wk 7-8)",["Medewerkers trainen PGS-15","Noodoefening lekkage","Trainingsmatrix invullen"]),
        ("Fase 5: Validatie + Go-Live (Wk 9-10)",["Interne audit","Bevindingen verhelpen","Go-Live","Kwartaalrapportage opzetten"]),
    ]
    for ph, items in phases:
        doc.add_heading(ph, 3)
        for i in items: bul(doc, i)

    doc.add_heading("7.2 Budgetraming", 2)
    add_tbl(doc, ["Post","Raming"],[["Opvangvoorzieningen","€ 5.000-10.000"],["Scheidingsmaatregelen","€ 2.000-5.000"],
            ["Etikettering + signalering","€ 1.000-3.000"],["Temperatuurbewaking + tracing","€ 3.000-8.000"],
            ["Nooddouche + oogdoucher","€ 2.000-5.000"],["Training materialen","€ 2.000-5.000"],
            ["Consultancy (JvG)","€ 8.000-15.000"],["TOTAAL","€ 23.000-51.000"]])

    doc.add_heading("7.3 Risicoanalyse", 2)
    add_tbl(doc, ["Risico","Kans","Impact","Mitigatie"],[
        ["SDS vanadium ontbreekt","Hoog","Medium","Direct aanvragen; tijdelijk werkverbod"],
        ["Budget overschrijding","Medium","Medium","10% buffer; fasering"],
        ["Training niet voltooid","Medium","Hoog","Reserve-data inplannen"],
        ["Lekdetectie niet conform","Laag","Hoog","Gecertificeerde installateur"],
    ])

    doc.add_heading("8. Referenties", 1)
    for r in ["PGS 15:2025 versie 1.0 (januari 2025)","REACH EG 1907/2006","CLP EG 1272/2008",
              "ADR 2025","Arbeidsomstandighedenwet / Arbobesluit","Omgevingswet / Bal / Bbl",
              "NEN 6068, NEN 6069, NEN-EN-ISO 20560","Chemicals Master Register v2.1.0"]:
        bul(doc, r)

    fp = f"{DOCX_DIR}/PGS15_Master_SOP_Opslagveiligheid_Phoenix_Metals_D4_v2.0.docx"
    doc.save(fp)
    print(f"✅ D4 v2.0: {fp}")

# ═══ Kennisdossier v1.0 ═══
def gen_kennisdossier():
    doc = make_doc("PGS-15 Kennisdossier Studiemateriaal", "v1.0 — Phoenix Metals B.V.")
    
    chapters = [
        ("1. Wat is PGS 15?", """PGS 15 staat voor Publicatiereeks Gevaarlijke Stoffen, nummer 15. Het is de Nederlandse richtlijn voor de opslag van verpakte gevaarlijke stoffen. De nieuwste versie is PGS 15:2025 (Nieuwe Stijl), gepubliceerd in januari 2025.

PGS 15 is van toepassing op bedrijven die gevaarlijke stoffen opslaan in verpakkingen zoals jerrycans, vaten, IBC's en gasflessen. De richtlijn wordt opgenomen in vergunningen via de Omgevingswet.

Belangrijk: PGS 15 gaat over OPSLAG, niet over transport (dat valt onder het ADR) of productieprocessen.

Voor Phoenix Metals is PGS 15 van toepassing op de opslag van H₂SO₄ (zwavelzuur), NaOH (natriumhydroxide) en vanadiumoplossingen."""),
        
        ("2. PGS 15:2025 Nieuwe Stijl — Wat is veranderd?", """PGS 15:2025 introduceert een geheel nieuwe structuur:

• Scenario's (S1-S16): Oorzaak- en gevolgscenario's die beschrijven WAT er mis kan gaan
• Doelen (D1-D13): Wat we willen bereiken, bijv. 'Voorkomen aanrijding' (D1) of 'Voorkomen verspreiding' (D7)  
• Maatregelen (M1-M167): Concrete acties om doelen te bereiken
• Veiligheidsniveaus: Basis, A, B, C (vervangen de oude beschermingsniveaus 1-4)

Deze methodiek maakt het mogelijk om risicogebaseerd te werken: per situatie wordt bepaald welke scenario's relevant zijn en welke maatregelen nodig zijn."""),
        
        ("3. Gevaarlijke Stoffen bij Phoenix Metals", """Phoenix Metals slaat drie soorten gevaarlijke stoffen op:

ZWAVELZUUR (H₂SO₄) — ADR-klasse 8, VG II
• Sterk bijtend: veroorzaakt ernstige brandwonden
• UN-nummer: 1830 (>51%) of 2796 (≤51%)
• H-zinnen: H290 (corrosief voor metalen), H314 (ernstige huid/oogletsel)
• Concentraties: 25%, 50%, 75%
• Onbrandbaar maar reactief met water (exotherm!), basen en metalen

NATRIUMHYDROXIDE (NaOH) 50% — ADR-klasse 8, VG II  
• Sterk bijtend: veroorzaakt ernstige brandwonden
• UN-nummer: 1824
• Kristalliseert bij <12°C → temperatuurbewaking vereist!
• H-zinnen: H290, H314
• Reactief met zuren (exotherm!), aluminium, zink

VANADIUMOPLOSSINGEN — ADR-klasse 9 (waarschijnlijk)
• Milieugevaarlijk (UN 3082)
• Toxiciteit afhankelijk van vanadiumverbinding
• 'Dode boom/vis' symbool verplicht op verpakking

⚠️ KRITIEK: H₂SO₄ en NaOH MOETEN GESCHEIDEN worden opgeslagen! Bij menging ontstaat een heftige exotherme reactie met spatten en hitteontwikkeling."""),
        
        ("4. Opslageisen — Basisveiligheidsniveau", """Voor Phoenix Metals geldt BASISVEILIGHEIDSNIVEAU omdat:
• H₂SO₄ en NaOH onbrandbaar zijn (ADR-8 VG II)
• Vanadiumoplossingen onbrandbaar/niet brandonderhoudend zijn (ADR-9)
• Dedicated opslag (geen menging met brandbare stoffen)

Dit betekent:
• Geen Wbdbo-eis (brandwerendheid)
• Geen branddetectiesysteem verplicht
• Geen VBB-installatie (blussysteem) verplicht
• Wel: opvangcapaciteit, scheiding, etikettering, PBM's, documenten

Opvangcapaciteit: 110% van grootste verpakking of 10% van totale inhoud (wat meer is).

Scheiding: Zuren en basen in APARTE vakken. Minimaal een fysieke scheiding (muurtje, lekbak, afstand)."""),
        
        ("5. Etikettering en Signalering", """Alle tanks en opslaglocaties moeten voorzien zijn van:

TANKETIKET (10 elementen verplicht):
1. Productnaam
2. CAS-nummer
3. GHS-pictogrammen (min 10×10 cm)
4. Signaalwoord (GEVAAR of WAARSCHUWING)
5. H-zinnen
6. P-zinnen
7. UN-nummer
8. Tankinhoud (liters)
9. Leverancier + contact
10. Noodtelefoon (24/7)

GHS-PICTOGRAMMEN:
• H₂SO₄: GHS05 (corrosief) + GHS07 (exclamatie) → GEVAAR
• NaOH: GHS05 (corrosief) → GEVAAR
• Vanadium: GHS07 + GHS09 (milieu) → WAARSCHUWING

BORDEN BIJ OPSLAGVOORZIENING:
• ADR-etiket klasse 8 (min 20×20 cm)
• 'Vuur/roken verboden' bord
• 'Bevoegd personeel' bord
• Calamiteiteninstructie"""),
        
        ("6. Veilig Werken — PBM's", """Bij werken met gevaarlijke stoffen zijn PBM's VERPLICHT:

Voor H₂SO₄:
• Zuurbestendige handschoenen (nitril)
• Veiligheidsbril OF face shield
• Beschermende kleding (zuurbestendig)
• Bij spatten: direct oogdouche + nooddouche

Voor NaOH:
• Bijtwerende handschoenen (nitril/neopreen)
• Veiligheidsbril OF face shield
• Beschermende kleding

ALGEMEEN:
• Nooddouche + oogdoucher binnen 10 seconden loopafstand
• NOOIT zonder PBM's in de opslag
• PBM's vooraf controleren op beschadigingen"""),
        
        ("7. Noodprocedures", """BIJ LEKKAGE:
1. ALARM — collega's waarschuwen
2. PBM's aantrekken
3. Bron indammen (absorptiemateriaal)
4. NOOIT zuur en base mengen!
5. H₂SO₄: neutraliseren met SODA
6. NaOH: neutraliseren met CITROENZUUR
7. Grote lekkage (>50L): brandweer 112
8. Opruimen in afvalvat
9. Ventileren

BIJ BRAND:
1. Brandalarm + evacueren
2. Brandweer 112
3. NOOIT water op zuur-lekkage
4. Poederblusser voor kleine branden
5. Grote brand: niet zelf blussen

BIJ PERSONEEL INCIDENT (blootstelling):
1. Direct nooddouche/ogen doucheren (15 min)
2. Kleding verwijderen (indien besmet)
3. Medische hulp inschakelen
4. Melden aan HSE Manager"""),
        
        ("8. Documenten en Administratie", """PGS 15 vereist 11 verplichte documenttypen:
1. Stoffenlijst (actueel register)
2. SDS/VIB's (voor alle stoffen)
3. Plattegrond opslaglocatie
4. Calamiteiteninstructie
5. Lekkage-instructie
6. Noodplan (intern)
7. RI&E
8. Keuringsrapporten
9. UPD (bij VBB-installatie)
10. Wbdbo-rapportage
11. Opleidingsrecords

Documenten altijd: actueel, toegankelijk, met versienummer.
Stoffenlijst + plattegrond: hardcopy aan brandweer leveren."""),
    ]
    
    for title, content in chapters:
        doc.add_heading(title, 1)
        for para in content.split('\n\n'):
            doc.add_paragraph(para.strip())
    
    doc.add_page_break()
    doc.add_heading("9. Woordenlijst", 1)
    terms = [
        ("ADR","Accord européen — Europees verdrag voor vervoer gevaarlijke stoffen over de weg"),
        ("Basisveiligheidsniveau","Minimum set maatregelen voor alle opslagvoorzieningen"),
        ("CAPA","Corrective and Preventive Action — verbetermaatregel"),
        ("CLP","Classification, Labelling and Packaging — EU-verordening voor indeling/etikettering"),
        ("GHS","Globally Harmonised System — wereldwijd systeem gevarenclassificatie"),
        ("H-zin","Gevaarzin — beschrijft aard van het gevaar (bijv. H314: Ernstige huidverbrandingen)"),
        ("P-zin","Voorzorgsmaatregelzin — beschrijft veiligheidsmaatregelen"),
        ("PGS","Publicatiereeks Gevaarlijke Stoffen — Nederlandse richtlijnen"),
        ("PBM","Persoonlijke BeschermingsMiddelen"),
        ("RASCI","Verantwoordelijkhedenmatrix: Responsible, Accountable, Supporting, Consulted, Informed"),
        ("REACH","EU-verordening voor registratie/evaluatie/beperking chemische stoffen"),
        ("SDS/VIB","Safety Data Sheet / Veiligheidsinformatieblad"),
        ("SVHC","Substance of Very High Concern — zeer zorgwekkende stof (ECHA-lijst)"),
        ("UN-nummer","United Nations nummer — unieke identificatie gevaarlijke stof voor transport"),
        ("VBB","Vastopgestelde Brandbeheersings- en Brandblussysteem"),
        ("Wbdbo","Weerstand tegen Branddoorslag en Brandoverslag (in minuten)"),
        ("ZZS","Zeer Zorgwekkende Stoffen (RIVM-lijst)"),
    ]
    add_tbl(doc, ["Term","Betekenis"], terms)
    
    doc.add_page_break()
    doc.add_heading("10. Zelftest Checklist", 1)
    doc.add_paragraph("Gebruik deze checklist om je kennis te toetsen:")
    checks = [
        "☐ Ik kan uitleggen wat PGS 15 is en wanneer het van toepassing is",
        "☐ Ik weet welke 3 soorten gevaarlijke stoffen Phoenix Metals opslaat",
        "☐ Ik weet dat H₂SO₄ en NaOH GESCHEIDEN moeten worden opgeslagen",
        "☐ Ik kan de betekenis van H-zinnen H290 en H314 uitleggen",
        "☐ Ik weet welke GHS-pictogrammen op onze stoffen staan",
        "☐ Ik weet dat NaOH kristalliseert bij <12°C",
        "☐ Ik kan de 5 stappen bij lekkage noemen",
        "☐ Ik weet NOOIT water op zuur-lekkage te gebruiken",
        "☐ Ik weet waar de nooddouche en oogdoucher zich bevinden",
        "☐ Ik weet welke PBM's verplicht zijn bij het werken met H₂SO₄ en NaOH",
        "☐ Ik kan het neutralisatiemiddel voor H₂SO₄ (soda) en NaOH (citroenzuur) noemen",
        "☐ Ik weet dat PGS 15:2025 Nieuwe Stijl scenario's, doelen en maatregelen gebruikt",
        "☐ Ik weet dat bij Phoenix Metals basisveiligheidsniveau geldt",
        "☐ Ik weet dat de stoffenlijst en plattegrond aan de brandweer moeten worden gegeven",
        "☐ Ik weet dat ik incidenten binnen 15 minuten moet melden aan de HSE Manager",
    ]
    for c in checks:
        doc.add_paragraph(c)

    fp = f"{DOCX_DIR}/PGS15_Kennisdossier_Studiemateriaal_Phoenix_Metals_v1.0.docx"
    doc.save(fp)
    print(f"✅ Kennisdossier: {fp}")

# ═══ RUN ═══
gen_d3()
gen_d4()
gen_kennisdossier()
