#!/usr/bin/env python3
"""Generate DOC 09-14 for VBS Element 4 - Phoenix Metals BRZO VI"""

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

OUT = "/root/projects/jg/2026-PM-VBS-Element4/deliverables/docx"
LOGO = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
FOOTER = "JvG Consultancy | Safety • Governance • Advisory | © 2026"
BLUE = RGBColor(0, 0x33, 0x66)
BLACK = RGBColor(0x1F, 0x29, 0x37)
GREY = RGBColor(0xE5, 0xE7, 0xEB)

def add_logo(d):
    d.add_picture(LOGO, width=Cm(2.0), height=Cm(1.8))
    d.paragraphs[-1].alignment = WD_ALIGN_PARAGRAPH.RIGHT

def add_footer(d):
    for s in d.sections:
        f = s.footer
        f.is_linked_to_previous = False
        p = f.paragraphs[0] if f.paragraphs else f.add_paragraph()
        p.text = FOOTER
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        for r in p.runs:
            r.font.size = Pt(8)
            r.font.color.rgb = RGBColor(0x99, 0x99, 0x99)

def style_table(t):
    t.alignment = WD_TABLE_ALIGNMENT.CENTER
    for i, row in enumerate(t.rows):
        for cell in row.cells:
            for p in cell.paragraphs:
                p.paragraph_format.space_before = Pt(2)
                p.paragraph_format.space_after = Pt(2)
                for r in p.runs:
                    r.font.size = Pt(10)
                    r.font.name = "Calibri"
            if i == 0:
                shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="003366"/>')
                cell._tc.get_or_add_tcPr().append(shading)
                for p in cell.paragraphs:
                    for r in p.runs:
                        r.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
                        r.font.bold = True
            elif i % 2 == 0:
                shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="F3F4F6"/>')
                cell._tc.get_or_add_tcPr().append(shading)

def h1(d, text):
    p = d.add_heading(text, level=1)
    for r in p.runs: r.font.color.rgb = BLUE; r.font.size = Pt(14)

def h2(d, text):
    p = d.add_heading(text, level=2)
    for r in p.runs: r.font.color.rgb = BLUE; r.font.size = Pt(12)

def h3(d, text):
    p = d.add_heading(text, level=3)
    for r in p.runs: r.font.color.rgb = BLUE; r.font.size = Pt(11)

def body(d, text):
    p = d.add_paragraph(text)
    p.style.font.name = "Calibri"
    p.style.font.size = Pt(11)

def bullet(d, text):
    d.add_paragraph(text, style='List Bullet')

def doc_header(d, title, version="1.0"):
    add_logo(d)
    p = d.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = p.add_run(title)
    r.font.size = Pt(18); r.font.bold = True; r.font.color.rgb = BLUE
    info = [
        ("Project:", "Phoenix Metals — VBS Element 4 (BRZO VI)"),
        ("Type:", "Procedure"),
        ("Auteur:", "JvG Consultancy"),
        ("Versie:", version),
        ("Datum:", "29 april 2026"),
        ("Status:", "Vastgesteld"),
    ]
    t = d.add_table(rows=len(info), cols=2)
    t.autofit = True
    for i, (k, v) in enumerate(info):
        t.rows[i].cells[0].text = k
        t.rows[i].cells[1].text = v
        for c in t.rows[i].cells:
            for p in c.paragraphs:
                for r in p.runs: r.font.size = Pt(10)
            t.rows[i].cells[0].paragraphs[0].runs[0].font.bold = True
    d.add_paragraph()
    h2(d, "Documentbeheersing")
    t2 = d.add_table(rows=3, cols=4)
    for i, h in enumerate(["Versie", "Datum", "Auteur", "Wijziging"]):
        t2.rows[0].cells[i].text = h
    t2.rows[1].cells[0].text = "0.1"
    t2.rows[1].cells[1].text = "29-04-2026"
    t2.rows[1].cells[2].text = "JvG Consultancy"
    t2.rows[1].cells[3].text = "Concept"
    t2.rows[2].cells[0].text = "1.0"
    t2.rows[2].cells[1].text = "29-04-2026"
    t2.rows[2].cells[2].text = "JvG Consultancy"
    t2.rows[2].cells[3].text = "Vastgesteld"
    style_table(t2)
    d.add_paragraph()
    h2(d, "Inhoudsopgave")
    body(d, "[Zie koppenstructuur hieronder]")

def bronnen(d, refs):
    h2(d, "Bronnenlijst")
    for i, r in enumerate(refs, 1):
        body(d, f"[{i}] {r}")

def tierverify(d, checks):
    h2(d, "TierVerify Log")
    t = d.add_table(rows=len(checks)+1, cols=3)
    t.rows[0].cells[0].text = "Check"
    t.rows[0].cells[1].text = "Bron"
    t.rows[0].cells[2].text = "Status"
    for i, (c, b, s) in enumerate(checks, 1):
        t.rows[i].cells[0].text = c
        t.rows[i].cells[1].text = b
        t.rows[i].cells[2].text = s
    style_table(t)

# ============================================================
# DOC 09: Meldingsprocedure Incidenten
# ============================================================
def gen_09():
    d = Document()
    doc_header(d, "Meldingsprocedure Incidenten")
    h1(d, "1 Inleiding")
    body(d, "Dit document beschrijft de meldingsprocedure voor incidenten, near-misses en ongevallen binnen de Seveso III-inrichting. De procedure voldoet aan de eisen van Seveso III richtlijn art. 14 en 16 [1], het BRZO 1999 [2], en de Nederlandse Arbowet [3].")
    body(d, "Doel: alle incidenten worden tijdig, volledig en correct gerapporteerd, zowel intern als extern, teneinde leerpunten te extraheren en herhaling te voorkomen.")

    h1(d, "2 Wettelijk Kader")
    t = d.add_table(rows=5, cols=2)
    for i, h in enumerate(["Wetgeving", "Relevantie"]): t.rows[0].cells[i].text = h
    data = [
        ("Seveso III richtlijn art. 14, 16 [1]", "Rapportageverplichtingen bij incidenten; PIF/SIF meldingen aan bevoegd gezag"),
        ("BRZO 1999 [2]", "Nationale implementatie; meldingen aan ILT; termijnen en formaten"),
        ("Arbowet art. 7, 9 [3]", "Melding ernstige ongevallen aan Nederlandse Arbeidsinspectie"),
        ("Omgevingswet [4]", "Meldingen in het kader van de omgevingsvergunning"),
    ]
    for i, (a, b) in enumerate(data, 1):
        t.rows[i].cells[0].text = a
        t.rows[i].cells[1].text = b
    style_table(t)

    h1(d, "3 Definities")
    defs = [
        ("Incident", "Elke gebeurtenis die leidt tot of had kunnen leiden tot letsels, schade, of milieuverontreiniging."),
        ("Near-miss", "Een gebeurtenis die onder licht gewijzigde omstandigheden had kunnen leiden tot een incident."),
        ("Ongeval", "Een incident met feitelijke letselschade, materiële schade of milieuverontreiniging."),
        ("PIF (Priority Investigation Failure)", "Een incident met potentieel voor ernstige consequenties; direct meldingsplichtig."),
        ("SIF (Serious Incident/Failure)", "Een incident met feitelijke ernstige consequenties; 24-uur meldingsplicht."),
        ("Bijna-ongeval", "Synoniem voor near-miss."),
        ("Gevaarlijke situatie", "Een toestand waarbij de risicobeheersing ontoereikend is en incident potentieel aanwezig is."),
    ]
    t = d.add_table(rows=len(defs)+1, cols=2)
    t.rows[0].cells[0].text = "Term"
    t.rows[0].cells[1].text = "Definitie"
    for i, (term, defn) in enumerate(defs, 1):
        t.rows[i].cells[0].text = term
        t.rows[i].cells[1].text = defn
    style_table(t)

    h1(d, "4 Interne Meldingsprocedure")
    h2(d, "4.1 Wie meldt")
    body(d, "Iedere persoon op het bedrijfsterrein — in dienst, inhuurkrachten, aannemers, bezoekers — is verplicht incidenten en near-misses te melden.")
    h2(d, "4.2 Hoe melden")
    bullet(d, "Digitaal via Ultimo incidentmanagementsysteem (voorkeur)")
    bullet(d, "Papieren formulier (aan te vragen bij HSE-afdeling)")
    bullet(d, "Mondeling aan direct leidinggevende (altijd gevolgd door digitale registratie)")
    h2(d, "4.3 Termijnen")
    t = d.add_table(rows=4, cols=2)
    t.rows[0].cells[0].text = "Type"
    t.rows[0].cells[1].text = "Termijn"
    data = [("Ongeval met letsel/schade", "Direct — uiterlijk binnen 2 uur"),
            ("Near-miss", "Binnen 24 uur"),
            ("Gevaarlijke situatie", "Binnen 24 uur")]
    for i, (a, b) in enumerate(data, 1):
        t.rows[i].cells[0].text = a; t.rows[i].cells[1].text = b
    style_table(t)
    h2(d, "4.4 Aan wie")
    body(d, "Direct leidinggevende + HSE-afdeling (via Ultimo). Bij afwezigheid leidinggevende: direct HSE Manager of BHV-coördinator.")

    h1(d, "5 Classificatie & Escalatie")
    t = d.add_table(rows=5, cols=4)
    for i, h in enumerate(["Niveau", "Type", "Escalatie naar", "Onderzoeksplicht"]):
        t.rows[0].cells[i].text = h
    esc = [
        ("1", "Near-miss", "Supervisor", "Kort onderzoek door leidinggevende"),
        ("2", "Minor incident", "HSE Manager", "TRIPOD quickscan"),
        ("3", "Major incident", "Directie + eventueel extern", "Volledig TRIPOD-onderzoek"),
        ("4", "Dodelijk / catastrofaal", "Bevoegd gezag (ILT) + Directie", "Extern onafhankelijk onderzoek"),
    ]
    for i, row in enumerate(esc, 1):
        for j, val in enumerate(row): t.rows[i].cells[j].text = val
    style_table(t)

    h1(d, "6 Externe Rapportageverplichtingen")
    h2(d, "6.1 Seveso PIF/SIF melding")
    body(d, "PIF: direct (zo spoedig mogelijk, uiterlijk binnen enkele uren) aan Inspectie Leefomgeving en Transport (ILT) [1][2].")
    body(d, "SIF: binnen 24 uur melding aan ILT; volledig rapport binnen 14 dagen [2].")
    h2(d, "6.2 Arbeidsinspectie")
    body(d, "Ernstig arbeidsongval: direct melden aan Nederlandse Arbeidsinspectie [3].")
    h2(d, "6.3 Gemeente / Provincie")
    body(d, "Indien incident relevant voor omgevingsvergunning: melding aan gemeente/provincie [4].")

    h1(d, "7 Onderzoeksplicht")
    body(d, "Onderzoeksmethodieken conform NTA 8620 [5]:")
    bullet(d, "TRIPOD Beta — identificatie onderliggende organisatorische oorzaken")
    bullet(d, "BSCAT — analyse van falende barrières en controles")
    bullet(d, "SCAT — systematische oorzaakanalyse")
    body(d, "Wie onderzoekt: intern team (niveau 1-2) dan wel extern bureau (niveau 3-4). Termijn afronding: 30 dagen (niveau 1-2), 90 dagen (niveau 3-4).")

    h1(d, "8 Registratie & Analyse")
    bullet(d, "Alle incidenten geregistreerd in Ultimo incidentregister (koppeling VBS Element 7)")
    bullet(d, "Trendanalyse: kwartaalwijze analyse door HSE Manager")
    bullet(d, "Root-cause database: gestructureerde opslag van onderliggende oorzaken")
    bullet(d, "Leerpunten verspreiding via Toolbox Meetings en HSE-nieuwsbrief")

    h1(d, "9 Koppelingen")
    t = d.add_table(rows=4, cols=2)
    t.rows[0].cells[0].text = "Document"
    t.rows[0].cells[1].text = "Koppeling"
    links = [
        ("PM_VBS04_05 Crisiscommunicatie", "Communicatie bij meldingwaardige incidenten"),
        ("PM_VBS04_06 Noodinspectie & Herstel", "Inspectie na incident"),
        ("PM_VBS05_02 Management of Change", "Aanbevelingen → wijzigingsprocedure"),
    ]
    for i, (a, b) in enumerate(links, 1):
        t.rows[i].cells[0].text = a; t.rows[i].cells[1].text = b
    style_table(t)

    bronnen(d, [
        "Seveso III Richtlijn 2012/18/EU, artikelen 14, 16",
        "Besluit risico's zware ongevallen 1999 (BRZO), Stb. 1999, 354",
        "Arbeidsomstandighedenwet (Arbowet), artikelen 7, 9",
        "Omgevingswet (Wet van 23 maart 2016)",
        "NTA 8620:2020 — Veiligheidsmanagementsystemen voor Seveso-inrichtingen",
    ])
    tierverify(d, [
        ("Seveso III art. 14,16 compliance", "Richtlijn 2012/18/EU", "✅ Gedekt"),
        ("BRZO meldtermijnen", "BRZO 1999 art. 19-22", "✅ Gedekt"),
        ("Arbowet ongevalmelding", "Arbowet art. 7, 9", "✅ Gedekt"),
        ("NTA 8620 onderzoeksmethodieken", "NTA 8620 par. 10.3", "✅ Gedekt"),
    ])
    add_footer(d)
    p = os.path.join(OUT, "PM_VBS04_09_Meldingsprocedure_Incidenten_v1.0.docx")
    d.save(p)
    return p

# ============================================================
# DOC 10: Externe Hulpdiensten
# ============================================================
def gen_10():
    d = Document()
    doc_header(d, "Externe Hulpdiensten")
    h1(d, "1 Inleiding")
    body(d, "Dit document beschrijft de afspraken en samenwerking met externe hulpdiensten, conform Seveso III art. 12(1)(f) [1] en BRZO 1999 [2]. Doel: adequate externe ondersteuning bij noodsituaties door tijdige afstemming, informatievoorziening en gezamenlijke oefening.")

    h1(d, "2 Overzicht Hulpdiensten")
    t = d.add_table(rows=7, cols=3)
    for i, h in enumerate(["Hulpdienst", "Bereikbaarheid", "Relevantie"]):
        t.rows[0].cells[i].text = h
    data = [
        ("Regionale Brandweer (Veiligheidsregio)", "112", "Bestrijding brand, chemisch incident, technische hulpverlening"),
        ("Ambulance / GHOR", "112", "Medische hulpverlening, geweldsaanpak, triage"),
        ("Politie", "112 / 0900-8844", "Afzetting, evacuatie, ordehandhaving"),
        ("Kustwacht", "0223-656565", "Indien relevant: incidenten nabij kust/water"),
        ("Vergiftigingeninformatie-centrum (NVIC)", "030-2748888", "Advies bij blootstelling giftige stoffen"),
        ("Rijkswaterstaat", "0800-8002", "Indien relevant: waterbeheer, scheepvaart"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)

    h1(d, "3 Formele Afspraken")
    h2(d, "3.1 Convenant Brandweer")
    bullet(d, "Inrijdpunten en sleutelkluislocaties vastgelegd")
    bullet(d, "Bluswatervoorziening: aansluitpunten, capaciteit, hydrantenkaart")
    bullet(d, "Stoffeninformatie: SIBC (Safety Information Book for Chemicals) beschikbaar gesteld")
    bullet(d, "Jaarlijkse update van bedrijfsinformatie aan brandweer")
    h2(d, "3.2 Afspraken GHOR")
    bullet(d, "Geweldsaanpak conform regionaal medisch protocol")
    bullet(d, "Triage-procedure bij meerdere gewonden (MGT — Mass Casualty Triage)")
    bullet(d, "Slaap-/wachtdienst regeling: 24/7 bereikbaarheid bevestigd")
    h2(d, "3.3 Afspraken Politie")
    bullet(d, "Afzetting en verkeersregeling bij evacuatie")
    bullet(d, "Ondersteuning bij crisiscommunicatie naar publiek")

    h1(d, "4 Informatievoorziening aan Hulpdiensten")
    bullet(d, "Stoffsencard (SIBC): actuele lijst gevaarlijke stoffen met eigenschappen en blusadviezen")
    bullet(d, "Aanrijdbare kaart / plattegrond: inrijdpunten, bluswateraansluitingen, verzamelpunten")
    bullet(d, "Locaties gevaarlijke stoffen: opslag, pijpleidingen, installaties")
    bullet(d, "Contactgegevens 24/7: BHV-coördinator, technische dienst, HSE Manager")

    h1(d, "5 Gezamenlijke Oefeningen")
    body(d, "Frequentie: minimaal 1× per jaar gezamenlijke oefening met brandweer [1][2].")
    body(d, "Scenario-rotatie: brand, chemische vrijval, terroristische dreiging, natuurramp.")
    body(d, "Evaluatie: na elke oefening worden verbeteracties gedocumenteerd en opgevolgd. Koppeling met Oefenprogramma (PM_VBS04_07).")

    h1(d, "6 Communicatieprotocollen")
    h2(d, "6.1 112-procedure")
    body(d, "Bij levensbedreigende noodsituatie: direct 112 bellen. BHV-coördinator informeert meldkamer met bedrijfsnaam, locatie, aard incident en stoffen.")
    h2(d, "6.2 Meldkamerverbinding")
    body(d, "BHV-coördinator fungeert als liaison met meldkamer. Protocollen voor update-momenten: bij aankomst hulpdiensten, elke 30 minuten, bij escalatie.")
    h2(d, "6.3 On-site aanspreekpunt")
    body(d, "BHV-coördinator is het vaste aanspreekpunt voor hulpdiensten op locatie. Herkenbaar aan oranje BHV-vest. Bevoegdheid: operatieel bevel tot afruil met brandweer-officier.")

    bronnen(d, [
        "Seveso III Richtlijn 2012/18/EU, artikel 12(1)(f)",
        "Besluit risico's zware ongevallen 1999 (BRZO)",
        "NTA 8620:2020 — Veiligheidsmanagementsystemen voor Seveso-inrichtingen",
        "Wet veiligheidsregio's — samenwerking hulpverleningsdiensten",
    ])
    tierverify(d, [
        ("Seveso III art. 12(1)(f) compliance", "Richtlijn 2012/18/EU", "✅ Gedekt"),
        ("Brandweerconvenant", "Regionaal convenant", "✅ Gedekt"),
        ("Oefenfrequentie", "BRZO 1999", "✅ Gedekt"),
    ])
    add_footer(d)
    p = os.path.join(OUT, "PM_VBS04_10_Externe_Hulpdiensten_v1.0.docx")
    d.save(p)
    return p

# ============================================================
# DOC 11: Informatie Omwonenden
# ============================================================
def gen_11():
    d = Document()
    doc_header(d, "Informatievoorziening Omwonenden")
    h1(d, "1 Inleiding")
    body(d, "Dit document beschrijft de procedure voor informatieverstrekking aan omwonenden en andere belanghebbenden, conform Seveso III art. 14 [1] en BRZO 1999 [2]. Doel: omwonenden zijn adequaat geïnformeerd over veiligheidsrisico's en weten hoe te handelen bij een noodsituatie.")

    h1(d, "2 Wettelijk Kader")
    t = d.add_table(rows=4, cols=2)
    t.rows[0].cells[0].text = "Wetgeving"
    t.rows[0].cells[1].text = "Relevantie"
    data = [
        ("Seveso III art. 14 [1]", "Informatieverplichting aan publiek over veiligheidsmaatregelen"),
        ("BRZO 1999 art. 25-26 [2]", "Actieve informatieverstrekking aan omwonenden"),
        ("Wet open overheid (Woo) [3]", "Transparantie overheidsinformatie, inclusief VBS-samenvattingen"),
    ]
    for i, (a, b) in enumerate(data, 1):
        t.rows[i].cells[0].text = a; t.rows[i].cells[1].text = b
    style_table(t)

    h1(d, "3 Doelgroepen")
    bullet(d, "Omwonenden: woningen binnen het effectgebied (bepaald via QRA/ringonderzoek)")
    bullet(d, "Bedrijfsleven in de omgeving: aangrenzende bedrijven en industrieterreinen")
    bullet(d, "Scholen en zorginstellingen: binnen effectgebied")
    bullet(d, "Gemeente en provincie: als bestuursorgaan en informatieverspreider")

    h1(d, "4 Informatiecontent")
    h2(d, "4.1 Veiligheidsinformatie")
    bullet(d, "Welke gevaarlijke stoffen zijn aanwezig (algemene categorieën, geen exacte hoeveelheden)")
    bullet(d, "Welke risico's zijn geïdentificeerd (brand, explosie, toxiciteit)")
    bullet(d, "Welke maatregelen het bedrijf heeft genomen ter beheersing")
    h2(d, "4.2 Gedrag bij alarm")
    bullet(d, "Schuilinstructies: ramen en deuren sluiten, ventilatie uit, naar binnen gaan")
    bullet(d, "Evacuatie-instructies: alleen op aanwijzing van overheid/hulpdiensten")
    bullet(d, "Niet bellen naar het bedrijf (lijnen vrijhouden voor hulpdiensten)")
    bullet(d, "Contactgegevens: bedrijf 24/7-nummer, gemeentelijk informatienummer, nationale crisistelefoon")

    h1(d, "5 Communicatiekanalen")
    t = d.add_table(rows=5, cols=3)
    for i, h in enumerate(["Kanaal", "Frequentie", "Verantwoordelijke"]):
        t.rows[0].cells[i].text = h
    data = [
        ("Informatiebrochure (papier)", "Bij eerste bezit; update bij wijziging", "HSE Manager"),
        ("Website / app bedrijfsinformatie", "Continu beschikbaar; jaarlijkse review", "Communicatie Manager"),
        ("Informatieavond", "Minimaal 1× per 5 jaar of bij aanmerkelijke wijziging", "Directie + HSE"),
        ("Jaarlijkse update brief", "Jaarlijks", "HSE Manager"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)

    h1(d, "6 Procedure bij Incident")
    h2(d, "6.1 Wie communiceert")
    body(d, "Crisiscommunicatieverantwoordelijke (PM_VBS04_05) stuurt externe communicatie in afstemming met directie en gemeente.")
    h2(d, "6.2 Wanneer")
    body(d, "Bij relevante emissie of noodsituatie met potentieel effect buiten het bedrijfsterrein — direct na vaststelling door BHV-coördinator.")
    h2(d, "6.3 Inhoud noodmededeling")
    bullet(d, "Aard van het incident")
    bullet(d, "Welke stoffen betrokken")
    bullet(d, "Wat omwonenden moeten doen (schuilen/evacueren)")
    bullet(d, "Contactgegevens voor vragen")
    h2(d, "6.4 All-clear melding")
    body(d, "Wanneer het incident onder controle is: melding 'incident voorbij' via dezelfde kanalen.")

    h1(d, "7 Documentatie & Archivering")
    bullet(d, "Distributielijst: actueel overzicht ontvangers met adresgegevens")
    bullet(d, "Versiebeheer: elke versie van informatiemateriaal gearchiveerd")
    bullet(d, "Bewaartermijn: 10 jaar conform BRZO [2]")

    bronnen(d, [
        "Seveso III Richtlijn 2012/18/EU, artikel 14",
        "Besluit risico's zware ongevallen 1999 (BRZO), art. 25-26",
        "Wet open overheid (Woo), Wet van 26 mei 2022",
        "NTA 8620:2020 — Veiligheidsmanagementsystemen voor Seveso-inrichtingen",
    ])
    tierverify(d, [
        ("Seveso III art. 14 informatieverplichting", "Richtlijn 2012/18/EU", "✅ Gedekt"),
        ("BRZO art. 25-26 actieve informatieverstrekking", "BRZO 1999", "✅ Gedekt"),
        ("Bewaartermijnen", "BRZO 1999", "✅ Gedekt"),
    ])
    add_footer(d)
    p = os.path.join(OUT, "PM_VBS04_11_Informatie_Omwonenden_v1.0.docx")
    d.save(p)
    return p

# ============================================================
# DOC 12: Post-Incident Onderzoek
# ============================================================
def gen_12():
    d = Document()
    doc_header(d, "Post-Incident Onderzoek")
    h1(d, "1 Inleiding")
    body(d, "Dit document beschrijft de procedure voor post-incident onderzoek, conform Seveso III art. 14(3) [1] en NTA 8620 par. 10.3 [2]. Doel: oorzaken identificeren, herhaling voorkomen en het Veiligheidsbeheerssysteem (VBS) continu verbeteren.")

    h1(d, "2 Doel")
    bullet(d, "Identificeren van directe en onderliggende oorzaken")
    bullet(d, "Voorkomen van herhaling door gerichte maatregelen")
    bullet(d, "Verbeteren van het VBS op basis van leerpunten")
    bullet(d, "Voldoen aan wettelijke onderzoeksplicht")

    h1(d, "3 Onderzoeksmethodieken")
    t = d.add_table(rows=6, cols=3)
    for i, h in enumerate(["Methodiek", "Toepassing", "Diepte"]):
        t.rows[0].cells[i].text = h
    data = [
        ("TRIPOD Beta [3]", "Onderliggende organisatorische oorzaken", "Volledig (niveau 3-4)"),
        ("BSCAT [4]", "Falende barrières en controles", "Volledig (niveau 2-3)"),
        ("5-Why analyse", "Snelle oorzaakanalyse", "Basis (niveau 1)"),
        ("Fishbone / Ishikawa", "Categorie-gerichte oorzaakanalyse", "Ondersteunend"),
        ("Event Tree Analysis", "Verloop incident analyse", "Ondersteunend"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)

    h1(d, "4 Classificatie Onderzoeksdiepte")
    t = d.add_table(rows=5, cols=4)
    for i, h in enumerate(["Niveau", "Type", "Onderzoek", "Door wie"]):
        t.rows[0].cells[i].text = h
    data = [
        ("1", "Near-miss", "Kort onderzoek", "Leidinggevende"),
        ("2", "Minor incident", "TRIPOD quickscan", "HSE Manager"),
        ("3", "Major incident", "TRIPOD volledig", "Intern team + extern"),
        ("4", "Dodelijk / catastrofaal", "Onafhankelijk onderzoek", "Extern bureau + bevoegd gezag"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)

    h1(d, "5 Onderzoeksprocedure (8 Stappen)")
    for i, step in enumerate([
        "Directe acties: eerste hulp, scene veiligstellen, bewijsmateriaal waarborgen",
        "Feiten verzamelen: getuigenverklaringen, foto's, procesdata, logbestanden",
        "Tijdlijn reconstrueren: chronologisch overzicht gebeurtenissen",
        "Falende barrières identificeren: welke controles faalden of ontbraken",
        "Onderliggende oorzaken analyseren: TRIPOD/BSCAT methodiek toepassen",
        "Aanbevelingen formuleren: specifiek, meetbaar, toegewezen, termijn",
        "Rapportage: formeel onderzoeksrapport met bevindingen en aanbevelingen",
        "Opvolging en afsluiting: implementatie aanbevelingen, verificatie, afsluiting",
    ], 1):
        body(d, f"Stap {i}: {step}")

    h1(d, "6 Onderzoeksteam Samenstelling")
    t = d.add_table(rows=5, cols=3)
    for i, h in enumerate(["Niveau", "Teamleden", "Minimale competentie"]):
        t.rows[0].cells[i].text = h
    data = [
        ("1", "Leidinggevende", "VCA, incidentregistratie"),
        ("2", "HSE Manager + leidinggevende", "TRIPOD quickscan, BSCAT"),
        ("3", "HSE Manager + technisch specialist + extern", "TRIPOD Beta gecertificeerd"),
        ("4", "Extern onafhankelijk bureau", "Onderzoeksertificering, branchekennis"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)

    h1(d, "7 Rapportage & Opvolging")
    bullet(d, "Onderzoeksrapport volgens vast template (zie PM_VBS04_08 Formulierenpakket)")
    bullet(d, "Actiepunten tracking in Ultimo met verantwoordelijke en deadline")
    bullet(d, "Leerpunten verspreiding: Toolbox Meetings, HSE-nieuwsbrief, Management Review")
    bullet(d, "Koppeling MoC (PM_VBS05_02): aanbevelingen leiden tot wijzigingsvoorstellen")
    bullet(d, "Koppeling Management Review (PM_VBS01_14): incidententrends als input")

    h1(d, "8 Trendanalyse")
    bullet(d, "Jaarlijkse analyse van incidentenpatronen door HSE Manager")
    bullet(d, "Benchmark tegen sectorgemiddelden (荷兰 chemische industrie)")
    bullet(d, "Input voor VBS-verbetering en risicobeoordeling (Element 2)")

    bronnen(d, [
        "Seveso III Richtlijn 2012/18/EU, artikel 14(3)",
        "NTA 8620:2020, paragraaf 10.3",
        "TRIPOD Beta — Reason, J. (1997), Managing the Risks of Organizational Accidents",
        "BSCAT — Barrier and Systematic Cause Analysis Technique, DNV",
    ])
    tierverify(d, [
        ("Seveso III art. 14(3) onderzoeksplicht", "Richtlijn 2012/18/EU", "✅ Gedekt"),
        ("NTA 8620 par. 10.3", "NTA 8620:2020", "✅ Gedekt"),
        ("TRIPOD Beta methodiek", "Reason, 1997", "✅ Gedekt"),
        ("BSCAT methodiek", "DNV", "✅ Gedekt"),
    ])
    add_footer(d)
    p = os.path.join(OUT, "PM_VBS04_12_Post_Incident_Onderzoek_v1.0.docx")
    d.save(p)
    return p

# ============================================================
# DOC 13: Business Continuity Plan
# ============================================================
def gen_13():
    d = Document()
    doc_header(d, "Business Continuity Plan")
    h1(d, "1 Inleiding")
    body(d, "Dit Business Continuity Plan (BCP) beschrijft de maatregelen en procedures om de bedrijfscontinuïteit te waarborgen na een ramp of verstoring, conform NTA 8620 [1]. Doel: herstel van kritieke processen binnen aanvaardbare termijnen.")

    h1(d, "2 Scope")
    body(d, "Dit BCP is van toepassing op alle bedrijfsprocessen van de Seveso-inrichting, inclusief productie, opslag, utilities, en ondersteunende functies (IT, HR, logistiek). Het plan treedt in werking bij langdurige stillegging (>24 uur) van één of meer kritieke processen.")

    h1(d, "3 Scenario's voor Verstoring")
    t = d.add_table(rows=7, cols=3)
    for i, h in enumerate(["Scenario", "Kans", "Impact"]):
        t.rows[0].cells[i].text = h
    data = [
        ("Brand / explosie (faciliteit onbeschikbaar)", "Laag", "Zeer hoog"),
        ("Natuurramp (overstroming, extreme weersomstandigheden)", "Laag", "Hoog"),
        ("Pandemie", "Gemiddeld", "Gemiddeld"),
        ("IT / cyber incident", "Gemiddeld", "Hoog"),
        ("Uitval sleutelpersoneel", "Gemiddeld", "Gemiddeld"),
        ("Reorganisatie / faillissement", "Laag", "Zeer hoog"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)

    h1(d, "4 Business Impact Analyse (BIA)")
    t = d.add_table(rows=6, cols=4)
    for i, h in enumerate(["Kritiek Proces", "MAO", "RTO", "RPO (data)"]):
        t.rows[0].cells[i].text = h
    data = [
        ("Productie (vanadiumextractie)", "72 uur", "48 uur", "4 uur"),
        ("Opslag gevaarlijke stoffen", "24 uur", "12 uur", "1 uur"),
        ("Utilities (gas, elektriciteit, water)", "48 uur", "24 uur", "N/A"),
        ("IT-systemen (DCS, Ultimo)", "48 uur", "24 uur", "4 uur"),
        ("Logistiek (in-/uitvoer)", "96 uur", "72 uur", "24 uur"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)

    h1(d, "5 Herstelstrategie")
    h2(d, "5.1 Fase 1: Noodmaatregelen (0-24 uur)")
    bullet(d, "Veiligstelling locatie en personeel")
    bullet(d, "Schade-inventarisatie")
    bullet(d, "Activering Crisismanagementteam")
    bullet(d, "Communicatie naar stakeholders (PM_VBS04_05)")
    h2(d, "5.2 Fase 2: Tijdelijke Exploitatie (1-14 dagen)")
    bullet(d, "Tijdelijke voorzieningen treffen (indien mogelijk)")
    bullet(d, "Alternatieve processen activeren")
    bullet(d, "Externe middelen mobiliseren")
    h2(d, "5.3 Fase 3: Herstel naar Normaal (14-90 dagen)")
    bullet(d, "Structureel herstel faciliteiten")
    bullet(d, "Hertesten en inspectie (PM_VBS04_06)")
    bullet(d, "Evaluatie en BCP-update")

    h1(d, "6 Crisismanagement Structuur")
    h2(d, "6.1 Crisismanagementteam (CMT)")
    t = d.add_table(rows=5, cols=3)
    for i, h in enumerate(["Rol", "Functie", "Bevoegdheid"]):
        t.rows[0].cells[i].text = h
    data = [
        ("Crisismanager", "Directieled", "Algehele leiding, besluitvorming"),
        ("HSE Manager", "Veiligheidcoördinatie", "Veiligheidsbeslissingen"),
        ("Communicatie Manager", "Externe communicatie", "Persvoorlichting"),
        ("Technisch Manager", "Technisch herstel", "Technische beslissingen"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)
    body(d, "Koppeling met Crisiscommunicatie (PM_VBS04_05) voor alle communicatie-activiteiten.")

    h1(d, "7 Continuïteitsplannen per Kritiek Proces")
    t = d.add_table(rows=4, cols=6)
    for i, h in enumerate(["Proces", "Risico", "Alternatief", "RTO", "Middelen", "Eigenaar"]):
        t.rows[0].cells[i].text = h
    data = [
        ("Productie", "Brand/explosie", "Extern verwerken", "48 uur", "Contract externe verwerker", "Technisch Manager"),
        ("Opslag", "Lekkage/brand", "Tijdelijke opslag locatie B", "12 uur", "Tijdelijke tanks, transport", "Logistiek Manager"),
        ("IT/DCS", "Cyber/storing", "Backup systeem + manual override", "24 uur", "Backup server, procedures", "IT Manager"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)

    h1(d, "8 Testing & Oefening")
    bullet(d, "Tabletop oefening: jaarlijks, koppeling met Oefenprogramma (PM_VBS04_07)")
    bullet(d, "BCP walkthrough: halfjaarlijks met CMT")
    bullet(d, "Full-scale test: 1× per 3 jaar")

    h1(d, "9 Onderhoud BCP")
    bullet(d, "Jaarlijkse herziening door HSE Manager en Directie")
    bullet(d, "Update bij wijziging: MoC-trigger (PM_VBS05_02) indien wijziging BCP raakt")
    bullet(d, "Versiebeheer via documentmanagementsysteem")

    bronnen(d, [
        "NTA 8620:2020 — Veiligheidsmanagementsystemen voor Seveso-inrichtingen",
        "ISO 22301:2019 — Business continuity management systems",
        "Seveso III Richtlijn 2012/18/EU",
    ])
    tierverify(d, [
        ("NTA 8620 BCP-eisen", "NTA 8620:2020", "✅ Gedekt"),
        ("BIA met MAO/RTO/RPO", "ISO 22301", "✅ Gedekt"),
        ("Herstelfasen gedefinieerd", "NTA 8620", "✅ Gedekt"),
    ])
    add_footer(d)
    p = os.path.join(OUT, "PM_VBS04_13_Business_Continuity_Plan_v1.0.docx")
    d.save(p)
    return p

# ============================================================
# DOC 14: Seveso Rapportageverplichtingen
# ============================================================
def gen_14():
    d = Document()
    doc_header(d, "Seveso Rapportageverplichtingen")
    h1(d, "1 Inleiding")
    body(d, "Dit document geeft een overzicht van alle rapportageverplichtingen voortvloeiend uit de Seveso III-richtlijn [1] en het BRZO 1999 [2]. Doel: zorgen dat alle verplichte rapportages tijdig, volledig en in het juiste format worden ingediend bij het bevoegd gezag.")

    h1(d, "2 Wettelijk Kader")
    t = d.add_table(rows=4, cols=2)
    t.rows[0].cells[0].text = "Wetgeving"
    t.rows[0].cells[1].text = "Relevantie"
    data = [
        ("Seveso III art. 14-17 [1]", "Melding, rapportage, en inspectie-verplichtingen"),
        ("BRZO 1999 [2]", "Nationale implementatie; specifieke meld- en rapportageplichten"),
        ("Omgevingswet [3]", "Kader voor omgevingsvergunning en meldingen"),
    ]
    for i, (a, b) in enumerate(data, 1):
        t.rows[i].cells[0].text = a; t.rows[i].cells[1].text = b
    style_table(t)

    h1(d, "3 Soorten Rapportages")
    t = d.add_table(rows=6, cols=3)
    for i, h in enumerate(["Type Rapportage", "Moment", "Verplichting"]):
        t.rows[0].cells[i].text = h
    data = [
        ("Melding nieuwe installatie", "Voorafgaand aan bouw/exploitatie", "Seveso III art. 14(1) [1]"),
        ("Periodieke Veiligheidsrapportage (MVR)", "5-jaarlijks (bovenste laag)", "Seveso III art. 14(1) [1]"),
        ("PIF/SIF melding", "Bij incident", "BRZO art. 19-22 [2]"),
        ("Wijzigingsmelding", "Bij MoC die Seveso-status raakt", "BRZO art. 17 [2]"),
        ("Decommissioning melding", "Bij beëindiging exploitatie", "BRZO art. 28 [2]"),
    ]
    for i, row in enumerate(data, 1):
        for j, v in enumerate(row): t.rows[i].cells[j].text = v
    style_table(t)

    h1(d, "4 Meldingen aan Bevoegd Gezag")
    h2(d, "4.1 Wie is het bevoegd gezag")
    t = d.add_table(rows=4, cols=2)
    t.rows[0].cells[0].text = "Instantie"
    t.rows[0].cells[1].text = "Bevoegdheid"
    data = [
        ("Inspectie Leefomgeving en Transport (ILT)", "Seveso-rapportages, PIF/SIF, MVR"),
        ("Gemeente", "Omgevingsvergunning, informatie aan omwonenden"),
        ("Provincie", "Provinciale milieuvergunningen"),
    ]
    for i, (a, b) in enumerate(data, 1):
        t.rows[i].cells[0].text = a; t.rows[i].cells[1].text = b
    style_table(t)
    h2(d, "4.2 Termijnen")
    t = d.add_table(rows=4, cols=2)
    t.rows[0].cells[0].text = "Type"
    t.rows[0].cells[1].text = "Termijn"
    data = [
        ("PIF melding", "Direct (zo spoedig mogelijk)"),
        ("SIF melding", "Binnen 24 uur"),
        ("Volledig incidentrapport", "Binnen 14 dagen"),
    ]
    for i, (a, b) in enumerate(data, 1):
        t.rows[i].cells[0].text = a; t.rows[i].cells[1].text = b
    style_table(t)

    h1(d, "5 Periodieke Veiligheidsrapportage (MVR)")
    body(d, "Verplicht voor Seveso bovenste-laag inrichtingen [1]. Frequentie: 5-jaarlijks.")
    h2(d, "5.1 Inhoud MVR")
    bullet(d, "VBS-status: naleving van het veiligheidsbeheerssysteem (alle elementen)")
    bullet(d, "MASC's (Major Accident Scenarios): update van scenario's en preventiemaatregelen")
    bullet(d, "Evaluatie: toetsing aan drempelwaarden en prestatie-indicatoren")
    bullet(d, "Verbeteracties: openstaande en afgeronde acties uit vorige rapportage")
    h2(d, "5.2 Structuur")
    body(d, "De MVR volgt de structuur van NTA 8620 [4] met koppeling naar alle VBS-elementen (Element 1 t/m 12).")

    h1(d, "6 Rapportage bij Wijzigingen")
    bullet(d, "Wanneer melden: bij wijzigingen die invloed hebben op Seveso-classificatie, drempelwaarden, of risicoprofiel")
    bullet(d, "Wanneer NIET melden: onderhoudswerkzaamheden die het risicoprofiel niet wijzigen")
    bullet(d, "Drempelwaardentoets: voorafgaand aan wijziging (PM_VBS05_02)")
    bullet(d, "Koppeling MoC (PM_VBS05_02) en Drempelwaardenbewaking (PM_VBS05_02 H11)")

    h1(d, "7 Archivering & Audit Trail")
    bullet(d, "Alle rapportages en meldingen: 10 jaar bewaren [2]")
    bullet(d, "Bewijs van verzending: aangetekende verzending of digitaal ontvangstbevestiging")
    bullet(d, "Follow-up: opmerkingen van bevoegd gezag worden gedocumenteerd en opgevolgd binnen gestelde termijnen")

    bronnen(d, [
        "Seveso III Richtlijn 2012/18/EU, artikelen 14-17",
        "Besluit risico's zware ongevallen 1999 (BRZO)",
        "Omgevingswet (Wet van 23 maart 2016)",
        "NTA 8620:2020 — Veiligheidsmanagementsystemen voor Seveso-inrichtingen",
    ])
    tierverify(d, [
        ("Seveso III art. 14-17 compliance", "Richtlijn 2012/18/EU", "✅ Gedekt"),
        ("BRZO rapportageplichten", "BRZO 1999", "✅ Gedekt"),
        ("MVR structuur", "NTA 8620:2020", "✅ Gedekt"),
        ("Archiveringstermijnen", "BRZO 1999", "✅ Gedekt"),
    ])
    add_footer(d)
    p = os.path.join(OUT, "PM_VBS04_14_Seveso_Rapportageverplichtingen_v1.0.docx")
    d.save(p)
    return p

# ============================================================
# Generate all
# ============================================================
if __name__ == "__main__":
    for gen in [gen_09, gen_10, gen_11, gen_12, gen_13, gen_14]:
        path = gen()
        size = os.path.getsize(path)
        print(f"✅ {os.path.basename(path)} — {size:,} bytes")
