#!/usr/bin/env python3
"""Generate doc03_partA.docx — Beleidsdocument Part A (Voorblad + H1-H6)"""

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

OUTPUT = "/root/projects/jg/2026-pgs15-phoenix-metals/working/map/doc03_partA.docx"
LOGO = "/root/projects/jg/2026-pgs15-phoenix-metals/assets/branding/jvg-consultancy-logo.jpg"

PRIMARY = RGBColor(0x00, 0x33, 0x66)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
BODY_TEXT = RGBColor(0x1F, 0x29, 0x37)

doc = Document()

# --- Styles ---
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
style.font.color.rgb = BODY_TEXT
style.paragraph_format.space_after = Pt(6)

for level in range(1, 7):
    hs = doc.styles[f'Heading {level}']
    hs.font.name = 'Calibri'
    hs.font.color.rgb = PRIMARY
    hs.font.bold = True
    if level == 1:
        hs.font.size = Pt(20)
    elif level == 2:
        hs.font.size = Pt(16)
    elif level == 3:
        hs.font.size = Pt(14)
    else:
        hs.font.size = Pt(12)

def set_cell_shading(cell, color_hex):
    """Set cell background color."""
    shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color_hex}"/>')
    cell._tc.get_or_add_tcPr().append(shading)

def add_table(doc, headers, rows, col_widths=None):
    """Add a styled table with #003366 header row."""
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header row
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(h)
        run.font.name = 'Calibri'
        run.font.size = Pt(10)
        run.font.bold = True
        run.font.color.rgb = WHITE
        set_cell_shading(cell, '003366')
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    # Data rows
    for r_idx, row in enumerate(rows):
        for c_idx, val in enumerate(row):
            cell = table.rows[1 + r_idx].cells[c_idx]
            cell.text = ''
            p = cell.paragraphs[0]
            run = p.add_run(str(val))
            run.font.name = 'Calibri'
            run.font.size = Pt(10)
            run.font.color.rgb = BODY_TEXT
            if r_idx % 2 == 1:
                set_cell_shading(cell, 'F8F9FA')
    if col_widths:
        for i, w in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Cm(w)
    return table

def add_para(text, bold=False, italic=False, size=11, alignment=None, space_after=6):
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.font.name = 'Calibri'
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.italic = italic
    run.font.color.rgb = BODY_TEXT
    if alignment:
        p.alignment = alignment
    p.paragraph_format.space_after = Pt(space_after)
    return p

# ============================================================
# VOORBLAD
# ============================================================
# Logo
if os.path.exists(LOGO):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run()
    run.add_picture(LOGO, width=Cm(4.0), height=Cm(3.6))

doc.add_paragraph()  # spacer

# Title
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("BELEIDSDOCUMENT OPSLAG GEVAARLIJKE STOFFEN")
run.font.name = 'Calibri'
run.font.size = Pt(24)
run.font.bold = True
run.font.color.rgb = PRIMARY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("PGS 15:2025 Compliance — Phoenix Metals IJmuiden")
run.font.name = 'Calibri'
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(0x37, 0x41, 0x51)

doc.add_paragraph()

# Meta-data tabel
add_table(doc,
    ["Parameter", "Waarde"],
    [
        ["Project", "2026-pgs15-phoenix-metals"],
        ["Documentcode", "PM-BEL-001"],
        ["Versie", "1.0"],
        ["Datum", "26 april 2026"],
        ["Status", "Concept — Ter goedkeuring"],
        ["Classificatie", "Vertrouwelijk"],
        ["Eigenaar", "Directie Phoenix Metals"],
        ["Opsteller", "JvG Consultancy"],
    ],
    col_widths=[5, 10]
)

doc.add_paragraph()

# Goedkeuringstabel
add_table(doc,
    ["Rol", "Naam", "Handtekening", "Datum"],
    [
        ["Directeur", "TBD", "", ""],
        ["HSEQ Manager", "TBD", "", ""],
        ["Lab Manager", "TBD", "", ""],
    ],
    col_widths=[3.5, 4, 4, 3.5]
)

doc.add_paragraph()

# Vertrouwelijkheidsclausule
add_para(
    "Dit document is eigendom van Phoenix Metals IJmuiden en bevat vertrouwelijke bedrijfsinformatie. "
    "Vermenigvuldiging, distributie of openbaarmaking zonder schriftelijke toestemming van de directie is verboden. "
    "Dit beleid geldt voor alle medewerkers, aannemers en bezoekers die betrokken zijn bij de opslag van gevaarlijke stoffen "
    "op de Phoenix Metals faciliteit te IJmuiden. Overtreding van de in dit document beschreven regels kan leiden tot "
    "disciplinaire maatregelen, contractbeëindiging of juridische vervolging conform de geldende wet- en regelgeving. "
    "Ontvangers zijn persoonlijk aansprakelijk voor veilige behandeling van dit document.",
    italic=True, size=9
)

# PAGE BREAK
doc.add_page_break()

# ============================================================
# TOC placeholder
# ============================================================
doc.add_heading("Inhoudsopgave", level=1)
add_para(
    "[Automatisch gegenereerde inhoudsopgave — bijwerken in Word via Referenties → Inhoudsopgave bijwerken]",
    italic=True, size=10
)
doc.add_page_break()

# ============================================================
# H1 — DOEL EN REIKWIJDTE (~350w)
# ============================================================
doc.add_heading("1. Doel en Reikwijdte", level=1)

add_para(
    "Dit beleidsdocument definieert de kaders, verantwoordelijkheden en operationele richtlijnen voor de opslag van "
    "verpakte gevaarlijke stoffen bij Phoenix Metals IJmuiden. Het document is opgesteld conform de Publicatiereeks "
    "Gevaarlijke Stoffen 15:2025 (PGS 15:2025), de nationale richtlijn voor veilige opslag van verpakte gevaarlijke "
    "stoffen in Nederland. PGS 15:2025 vormt de primaire norm waaraan alle opslagactiviteiten op de Phoenix Metals "
    "faciliteit moeten voldoen."
)

add_para(
    "Phoenix Metals IJmuiden is een metaalverwerkende onderneming met chemische procesvoering. De huidige opslag "
    "bedraagt circa 315 kg/l verdeeld over zes stoffen, waarvan vier ADR-klasse 8 (bijtende stoffen) met een totaal "
    "volume van 300 liter en twee niet-ADR-geregistreerde stoffen van 15 kg. De opslag is geconcentreerd in één "
    "brandcompartiment: een storage rack voor het laboratorium."
)

add_para(
    "Het geldigheidsgebied van dit beleid omvat alle opslaglocaties voor gevaarlijke stoffen op de Phoenix Metals "
    "faciliteit, ongeacht het type verpakking, het volume of de ADR-classificatie. Dit omvat permanente opslag, "
    "tijdelijke opslag en werkvoorraad. Het beleid is van toepassing op alle personen die zich op het faciliteitsterrein "
    "bevinden en betrokken zijn bij of invloed hebben op de opslag van gevaarlijke stoffen."
)

add_para(
    "De doelgroep van dit beleid omvat: (a) medewerkers van Phoenix Metals in vaste en tijdelijke dienst, "
    "(b) aannemers en onderaannemers die werkzaamheden uitvoeren op de faciliteit, en (c) bezoekers die toegang "
    "hebben tot opslaglocaties. Alle genoemde groepen dienen op de hoogte te zijn van de in dit beleid vervatte regels "
    "en zich daarnaar te gedragen."
)

add_para(
    "Dit beleidsdocument maakt deel uit van een bredere documentenset voor PGS 15-compliance bij Phoenix Metals. "
    "Het relateert aan de Risico-Inventarisatie en -Evaluatie (RI&E), het calamiteitenplan, de veiligheidsinformatiebladen "
    "(VIB/SDS) per stof en het chemisch register. Waar dit beleid Strategische richting geeft, bieden de genoemde "
    "documenten operationele detailuitwerking. Bij tegenstrijdigheid prevaleert dit beleidsdocument, tenzij wettelijke "
    "voorschriften anders bepalen."
)

# ============================================================
# H2 — BELEIDSVERKLARING (~250w)
# ============================================================
doc.add_heading("2. Beleidsverklaring", level=1)

add_para(
    "Phoenix Metals streeft naar 100% naleving van de PGS 15:2025-richtlijn voor alle opslag van gevaarlijke stoffen "
    "op de IJmuiden-faciliteit. Dit commitment is geworteld in de overtuiging dat veilige opslag van gevaarlijke stoffen "
    "een niet-onderhandelbare voorwaarde is voor het beschermen van medewerkers, de omgeving en bedrijfscontinuïteit."
)

add_para(
    "De directie van Phoenix Metals.committeert zich tot het voorzien van voldoende middelen — financieel, materieel "
    "en humaan — om volledige PGS 15-compliance te realiseren en te behouden. Management op alle niveaus is "
    "verantwoordelijk voor het afdanken van een veiligheidscultuur waarin compliance de norm is, niet de uitzondering."
)

add_para(
    "Phoenix Metals hanteert een zero-tolerancebeleid ten aanzien van het niet-naleven van opslagvoorschriften. "
    "Elke afwijking van de in dit beleid beschreven regels wordt gerapporteerd, geanalyseerd en gecorrigeerd. "
    "Herhaalde niet-naleving door medewerkers of aannemers leidt tot escalatie conform het disciplinaire protocol."
)

add_para(
    "Continue verbetering is een kernprincipe. Phoenix Metals evalueert de naleving van dit beleid periodiek — "
    "minimaal jaarlijks en bij elke wijziging in het stoffenassortiment, de opslagcapaciteit of de geldende "
    "regelgeving. Bevindingen uit inspecties, audits en incidentanalyses worden gebruikt om dit beleid en de "
    "onderliggende procedures te verbeteren. De managementverantwoordelijkheid omvat het jaarlijks herbevestigen "
    "van dit beleid door middel van formele goedkeuring door de directie."
)

# ============================================================
# H3 — WETTELIJK KADER (~450w)
# ============================================================
doc.add_heading("3. Wettelijk Kader", level=1)

add_para(
    "De opslag van gevaarlijke stoffen bij Phoenix Metals is onderworpen aan een complex regelgevingskader "
    "dat bestaat uit nationale en Europese wet- en regelgeving. Onderstaande tabel geeft een overzicht van de "
    "zes belangrijkste kaderstellende documenten met hun relevantie voor Phoenix Metals."
)

add_table(doc,
    ["Wetgeving", "Toelichting", "PM-Relevantie"],
    [
        [
            "PGS 15:2025",
            "Nationale richtlijn voor veilige opslag van verpakte gevaarlijke stoffen. Bevat "
            "maatregelen voor stoffenscheiding (Tabel 9), veiligheidsniveaus (Tabel 6), "
            "vloeistofopvang (M30) en maximale hoeveelheden (M15).",
            "Primaire compliance-norm. PM valt onder basisveiligheidsniveau "
            "met 390 kg ADR 8 stoffen (ver onder 10.000 kg drempel). Stoffenscheidingseis "
            "geldig onafhankelijk van veiligheidsniveau."
        ],
        [
            "Omgevingswet\n(Bbl/Bkl/Bal)",
            "Bouwwerken die gevaarlijke stoffen bevatten moeten voldoen aan Bouwbesluit (Bbl), "
            "Bouwbesluit kwaliteit (Bkl) en Bouwbesluit activiteit (Bal). Brandcompartimentering "
            "en externe veiligheidsafstanden worden hierin geregeld.",
            "Opslaglocatie moet voldoen aan brandwerendheidseisen. "
            "Bbl-artikelen over brandcompartimentgrootte en Wbdbo gelden voor de opslagruimte."
        ],
        [
            "Arbowet\n(Arbobesluit art. 4.1c)",
            "Werkgevers zijn verplicht een RI&E uit te voeren waarin risico's verbonden aan "
            "werking met en opslag van gevaarlijke stoffen systematisch worden geïdentificeerd "
            "en geëvalueerd. Voorzorgsmaatregelen moeten worden gedocumenteerd.",
            "PM moet een actuele RI&E hebben die de opslag van NaOH, "
            "H₂SO₄ en andere stoffen dekt. Periodieke herbeoordeling vereist."
        ],
        [
            "ADR\n(Accord européen)",
            "Europees verdrag voor het internationaal vervoer van gevaarlijke stoffen over de weg. "
            "Classificeert stoffen in 9 gevarenklassen. ADR-classificatie is leidend voor PGS 15 "
            "opslagcategorieën.",
            "Alle vier de vloeibare stoffen zijn ADR-klasse 8, "
            "verpakkingsgroep II. Deze classificatie bepaalt de scheidingseisen uit PGS 15 Bijlage E."
        ],
        [
            "CLP-Verordening\n(EG 1272/2008)",
            "EU-verordening voor uniforme classificatie, etikettering en verpakking van stoffen en "
            "mengsels. Gebruikt GHS-pictogrammen en H/P-zinnen. Vervangt nationale "
            "classificatiesystemen.",
            "Bepaalt de etikettering van alle PM-stoffen. "
            "NaOH 50% en H₂SO₆ dragen het bijtende-pictogram. Geen CMR- of "
            "SVHC-stoffen aanwezig."
        ],
        [
            "REACH\n(EG 1907/2006)",
            "EU-verordening voor registratie, evaluatie, autorisatie en beperking van chemische "
            "stoffen. Vereist SDS beschikbaarheid, risicobeheer en communicatie in de "
            "toeleveringsketen.",
            "PM moet SDS'en beschikbaar hebben voor alle stoffen. "
            "Geen SVHC's in het assortiment. REACH-artikel 31 "
            "vereist leveranciers SDS te verstrekken."
        ],
    ],
    col_widths=[3.5, 5.5, 5.5]
)

add_para("")

add_para(
    "Naast bovengenoemde kaderstellende wetgeving kunnen aanvullende voorschriften van toepassing zijn, waaronder "
    "de NTA 8620 (veiligheidsbeheerssysteem, indien Seveso-status van toepassing is), lokale verordeningen van de "
    "gemeente Velsen en specifieke eisen van de brandweer. Phoenix Metals monitort actief wijzigingen in de "
    "regelgeving en past dit beleid aan indien vereist."
)

# ============================================================
# H4 — DEFINITIES EN AFKORTINGEN (~250w)
# ============================================================
doc.add_heading("4. Definities en Afkortingen", level=1)

add_para(
    "Onderstaande tabel definieert de in dit document gebruikte termen en afkortingen. Definities zijn conform "
    "PGS 15:2025, tenzij anders vermeld."
)

add_table(doc,
    ["Term / Afkorting", "Definitie"],
    [
        ["PGS 15", "Publicatiereeks Gevaarlijke Stoffen 15 — Richtlijn voor opslag van verpakte gevaarlijke stoffen"],
        ["ADR", "Accord européen relatif au transport international des marchandises Dangereuses par Route"],
        ["SDS / VIB", "Safety Data Sheet / Veiligheidsinformatieblad — gestandaardiseerde stofinformatie conform REACH Bijlage II"],
        ["PBM", "Persoonlijke Beschermingsmiddelen — uitrusting ter bescherming van de werknemer tegen chemische risico's"],
        ["VBB", "Vaste Blusmiddelen Berichting — automatisch blussysteem voor opslagruimten"],
        ["UPD", "Uitbreidingsplan Document — plan voor uitbreiding van opslagcapaciteit"],
        ["Wbdbo", "Weerstand tegen Branddoordringing van bouwconstructies — brandwerendheid in minuten"],
        ["RI&E", "Risico-Inventarisatie en -Evaluatie — systematische identificatie en beoordeling van arbeidsrisico's"],
        ["CMR", "Carcinogeen, Mutageen, Reprotoxisch — categorie speciaal gevaarlijke stoffen"],
        ["SVHC", "Substance of Very High Concern — bijzonder zorgwekkende stof conform REACH artikel 57"],
        ["CLP", "Classification, Labelling and Packaging — EU-verordening 1272/2008 voor stofclassificatie"],
        ["REACH", "Registration, Evaluation, Authorisation and Restriction of Chemicals — EU-verordening 1907/2006"],
        ["TRA", "Technical Rules for hazardous substances — technische regelgeving (Duits: TRGS)"],
        ["BNP", "Brandcompartiment NoodPlan — noodplan specifiek voor brand in opslagruimten"],
        ["NEN", "Nederlandse Norm — gestandaardiseerde technische specificaties"],
        ["CAS", "Chemical Abstracts Service — uniek identificatienummer voor chemische stoffen"],
        ["VG", "Verpakkingsgroep — indeling (I/II/III) op basis van gevaarsgraad binnen ADR-klasse"],
        ["VIB", "Veiligheidsinformatieblad — Nederlandse term voor SDS"],
        ["MW1", "Maatregel Welzijn 1 — algemene zorgplicht uit PGS 15"],
        ["M-nummer", "Maatregelnummer uit PGS 15:2025 — specifieke beheersmaatregel met unieke code"],
    ],
    col_widths=[3.5, 11]
)

# ============================================================
# H5 — VERANTWOORDELIJKHEDEN (~550w)
# ============================================================
doc.add_heading("5. Verantwoordelijkheden", level=1)

add_para(
    "De verantwoordelijkheden voor het beheer van gevaarlijke stoffen zijn verdeeld over vijf rollen volgens het "
    "RACI-model (Responsible, Accountable, Consulted, Informed). Onderstaande matrix definieert de toewijzing "
    "per taakgebied."
)

add_table(doc,
    ["Taakgebied", "Directie", "HSEQ Manager", "Lab Manager", "Medewerkers", "Aannemers"],
    [
        ["Beleid goedkeuren", "A", "R", "C", "I", "I"],
        ["RI&E onderhouden", "A", "R", "C", "I", "I"],
        ["Chemisch register bijwerken", "I", "C", "R", "I", "I"],
        ["Stoffenscheiding controleren", "I", "R", "A", "R", "I"],
        ["Lekbak inspectie uitvoeren", "I", "C", "A", "R", "I"],
        ["SDS beschikbaarheid waarborgen", "I", "R", "A", "I", "I"],
        ["Personeel instrueren", "A", "R", "C", "I", "I"],
        ["Inspecties uitvoeren", "I", "R", "C", "C", "I"],
        ["Calamiteitenplan onderhouden", "A", "R", "C", "I", "I"],
        ["Incidenten rapporteren", "I", "C", "A", "R", "R"],
        ["Aannemers instrueren", "A", "R", "C", "I", "I"],
    ],
    col_widths=[3.5, 2, 2.2, 2.2, 2, 2]
)

doc.add_paragraph()

add_para(
    "Directie. De directie is eindverantwoordelijk (Accountable) voor de vaststelling, uitvoering en handhaving van "
    "dit beleid. De directie stelt de middelen beschikbaar die nodig zijn voor compliance, keurt het beleid formeel "
    "goed en draagt zorg voor een organisatiecultuur waarin veiligheid prioriteit heeft. De directie ontvangt "
    "periodieke rapportages over de compliance-status en interveneert bij structurele afwijkingen.",
    size=11
)

add_para(
    "HSEQ Manager. De HSEQ Manager is verantwoordelijk (Responsible) voor de operationele uitvoering van het "
    "beleid. Dit omvat het onderhouden van de RI&E, het uitvoeren van inspecties, het instrueren van personeel en "
    "het onderhouden van het calamiteitenplan. De HSEQ Manager fungeert als primair aanspreekpunt voor "
    "regelgevingsvraagstukken en toetst wijzigingen in stofassortiment of opslagconfiguratie aan PGS 15-eisen.",
    size=11
)

add_para(
    "Lab Manager. De Lab Manager is verantwoordelijk voor het actueel houden van het chemisch register en de "
    "beschikbaarheid van veiligheidsinformatiebladen. De Lab Manager is Accountable voor de dagelijkse "
    "controle van de stoffenscheiding, lekbakinspecties en incidentrapportage vanuit het laboratorium. "
    "Wijzigingen in stoffen of volumes worden gemeld aan de HSEQ Manager.",
    size=11
)

add_para(
    "Medewerkers. Medewerkers zijn verantwoordelijk voor het volgen van de instructies in dit beleid en het "
    "rapporteren van incidenten, near-misses en onveilige situaties. Medewerkers voeren dagelijkse controles uit "
    "op lekbakken en stoffenscheiding conform de werkinstructies en dragen de voorgeschreven PBM's bij "
    "het hanteren van gevaarlijke stoffen.",
    size=11
)

add_para(
    "Aannemers. Aannemers die werkzaamheden uitvoeren op de faciliteit volgen de veiligheidsinstructies van "
    "Phoenix Metals. Aannemers zijn verantwoordelijk voor het rapporteren van incidenten en het naleven van de "
    "opslagregels gedurende hun aanwezigheid. Aannemers ontvangen voorafgaand aan de werkzaamheden een "
    "instructie over de locatie-specifieke risico's en opslagvoorschriften.",
    size=11
)

# ============================================================
# H6 — OPSLAGPRINCIPES (~650w)
# ============================================================
doc.add_heading("6. Opslagprincipes", level=1)

add_para(
    "Dit hoofdstuk beschrijft de fundamentele opslagprincipes die gelden voor alle gevaarlijke stoffen op de "
    "Phoenix Metals faciliteit, gebaseerd op PGS 15:2025."
)

# 6.1
doc.add_heading("6.1 Algemene Beginselen", level=2)

add_para(
    "Maatregel Welzijn 1 (MW1) uit PGS 15:2025 stelt dat de houder van een opslagvoorziening een algemene "
    "zorgplicht heeft om ervoor te zorgen dat de opslag van gevaarlijke stoffen geen onaanvaardbare risico's "
    "oplevert voor mens en milieu. Deze zorgplicht geldt onverkort voor Phoenix Metals en omvat de gehele "
    "levenscyclus van opslag: van ontvangst via opslag tot afvoer. De zorgplicht vereist een proactieve houding "
    "waarbij risico's worden geïdentificeerd voordat zich incidenten voordoen."
)

add_para(
    "Maatregel 2 (M2) schrijft voor dat gevaarlijke stoffen uitsluitend worden opgeslagen in daarvoor bestemde "
    "voorzieningen. Dit betekent dat opslag alleen mag plaatsvinden in ruimtes die conform de PGS 15-eisen zijn "
    "ingericht: met adequate vloeistofopvang, voldoende ventilatie, correcte stoffenscheiding en fysieke "
    "bescherming. Ad-hoc opslag op locaties die niet hiervoor zijn ingericht is verboden. Phoenix Metals "
    "borgt dit door het aanwijzen van specifieke opslaglocaties in het chemisch register."
)

# 6.2
doc.add_heading("6.2 Veiligheidsniveaus", level=2)

add_para(
    "PGS 15:2025 kent een gelaagd systeem van veiligheidsniveaus (Tabel 6) dat wordt bepaald door het type en "
    "de hoeveelheid opgeslagen gevaarlijke stoffen. De niveaus lopen van basisniveau tot VN-A (hoogste niveau "
    "met semi-automatische blussystemen). De vereisten worden strenger naarmate de opgeslagen hoeveelheden "
    "toenemen en de gevaren van de stoffen groter zijn."
)

add_para(
    "Phoenix Metals valt onder het basisveiligheidsniveau. Met een totaal van circa 390 kg ADR-klasse 8 "
    "verpakkingsgroep II stoffen (onbrandbaar/niet brandonderhoudend) zit de faciliteit ver onder de ondergrens "
    "van 2.500 kg uit Tabel 7 en ver onder de VN-drempel van 10.000 kg. Dit betekent dat geen aanvullend "
    "veiligheidsniveau (A, B of C) vereist is. Echter, de stoffenscheidingseis uit Tabel 9 (maatregel M35) geldt "
    "onafhankelijk van het veiligheidsniveau en is altijd van toepassing."
)

# 6.3
doc.add_heading("6.3 Stoffenscheiding", level=2)

add_para(
    "Tabel 9 uit PGS 15 Bijlage E definieert de scheidingseisen tussen stoffen van verschillende ADR-klassen. "
    "De scheidingniveaus zijn: A (apart brandcompartiment of 5 m vrije zone), B (beoordelen: gescheiden opslag "
    "tenzij VIB anders aantoont), V (aparte vakken) en geen scheiding vereist. Voor Phoenix Metals is de "
    "kritieke combinatie NaOH 50% (base) versus H₂SO₄ in alle concentraties (zuur). Tabel 9 geeft A-scheiding "
    "voor ADR 8 ↔ ADR 8, wat inhoudt dat deze stoffen niet in hetzelfde vak mogen worden opgeslagen."
)

add_para(
    "De E.3-uitzondering biedt een oplossing voor opslag onder 10.000 kg: scheiding binnen één vak is toegestaan "
    "mits een minimale vrije afstand van 2 meter wordt aangehouden, of een buffer met goedgekeurde "
    "combinatiestof, of aparte lekbakken. Phoenix Metals past deze uitzondering toe door NaOH 50% en H₂SO₄ "
    "elk in een eigen lekbak te plaatsen met gemarkeerde vakken en minimaal 2 m afstand. Calciumoxide wordt "
    "apart opgeslagen van H₂SO₄ gezien de A-scheidingseis (zuur-base combinatie)."
)

# 6.4
doc.add_heading("6.4 Vloeistofopvang", level=2)

add_para(
    "Maatregel 30 (M30) vereist dat alle vloeibare gevaarlijke stoffen worden opgeslagen met adequate "
    "vloeistofopvang ter voorkoming van lekkagespreiding. De opvangcapaciteit moet minimaal 110% bedragen "
    "van het volume van de grootste afzonderlijke verpakking in het vak. Dit principe geldt voor alle vloeibare "
    "ADR-klasse 8 stoffen in de Phoenix Metals opslag."
)

add_para(
    "Voor de 25-liter jerrycans (NaOH 50% en H₂SO₄ 25%) betekent dit een vereiste lekbakcapaciteit van "
    "minimaal 27,5 liter per bak. De 10-liter jerrycans vereisen een minimale opvang van 11 liter. "
    "Lekbakken moeten bestand zijn tegen de chemische eigenschappen van de opgeslagen stoffen — bijtende "
    "stoffen vereisen bakken van polyethyleen (PE) of met een chemisch bestendige coating. Phoenix Metals "
    "zorgt voor aparte lekbakken per stofcategorie conform de stoffenscheidingseisen uit paragraaf 6.3."
)

# 6.5
doc.add_heading("6.5 Maximale Hoeveelheden", level=2)

add_para(
    "Maatregel 15 (M15) definieert de maximale hoeveelheden gevaarlijke stoffen per brandcompartiment. Voor "
    "het basisveiligheidsniveau geldt een maximale oppervlakte van 1.000 m² bij opslag onder 20.000 kg en "
    "2.500 m² boven 20.000 kg. Phoenix Metals bevindt zich met circa 390 kg en één storage rack ver onder "
    "deze limieten. Desalniettemin is het essentieel dat bij uitbreiding van het stoffenassortiment of de "
    "opslagcapaciteit de drempelwaarden uit Tabel 6 en Tabel 7 opnieuw worden geëvalueerd."
)

add_para(
    "Bij overschrijding van de 10.000 kg-drempel voor ADR-klasse 8 verpakkingsgroep I schuift het vereiste "
    "veiligheidsniveau op naar VN-B (60 min Wbdbo, aanvullende blus- en detectie-eisen). Bij 20.000 kg geldt "
    "VN-A met VBB-installatie en automatische branddetectie. Phoenix Metals documenteert actuele volumes "
    "in het chemisch register en toetst elke wijziging aan de PGS 15-drempelwaarden om tijdig te anticiperen "
    "op escalerende veiligheidseisen."
)

# --- Save ---
doc.save(OUTPUT)

# Count words
import re
full_text = []
for p in doc.paragraphs:
    full_text.append(p.text)
for t in doc.tables:
    for row in t.rows:
        for cell in row.cells:
            full_text.append(cell.text)
all_text = ' '.join(full_text)
word_count = len(re.findall(r'\b\w+\b', all_text))
file_size = os.path.getsize(OUTPUT)
print(f"✅ Generated: {OUTPUT}")
print(f"📊 File size: {file_size:,} bytes ({file_size/1024:.1f} KB)")
print(f"📝 Word count: {word_count}")
