#!/usr/bin/env python3
"""
PGS 15:2025 Compliance Toetsing — Phoenix Metals B.V. — v5.1
Heranalyse met 150 kg per product (18 stoffen)
"""

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, shutil, datetime

# ── Paths ──
BASE = "/root/projects/jg/2026-pgs15-phoenix-metals"
DELIV = f"{BASE}/deliverables/docx"
ARCHIVE = f"{BASE}/archive"
LOGO = "/root/projects/jg/assets/branding/jvg-logo-medium.png"
LOGO_WHITE = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
OUT = f"{DELIV}/PGS15_Compliance_Toetsing_Phoenix_Metals_v5.1.docx"

# Archive v5.0
v5_old = f"{DELIV}/PGS15_Compliance_Toetsing_Phoenix_Metals_v5.0.docx"
if os.path.exists(v5_old) and not os.path.exists(f"{ARCHIVE}/PGS15_Compliance_Toetsing_Phoenix_Metals_v5.0.docx"):
    shutil.copy2(v5_old, f"{ARCHIVE}/PGS15_Compliance_Toetsing_Phoenix_Metals_v5.0.docx")

# ── Colors ──
PRIMARY = RGBColor(0x00, 0x33, 0x66)
DARK_TEXT = RGBColor(0x1F, 0x29, 0x37)
RED = RGBColor(0xCC, 0x00, 0x00)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)

doc = Document()

# ── Styles ──
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
style.font.color.rgb = DARK_TEXT
style.paragraph_format.space_after = Pt(4)

for level in [1,2,3]:
    hs = doc.styles[f'Heading {level}']
    hs.font.name = 'Calibri'
    hs.font.bold = True
    hs.font.color.rgb = PRIMARY
    hs.font.size = Pt(16 - level*2)

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

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

def add_row(table, texts):
    row = table.add_row()
    for i, t in enumerate(texts):
        cell = row.cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(str(t))
        run.font.size = Pt(9)
        run.font.name = 'Calibri'
        run.font.color.rgb = DARK_TEXT

def add_para(text, bold=False, style_name=None):
    if style_name:
        p = doc.add_paragraph(style=style_name)
    else:
        p = doc.add_paragraph()
    run = p.add_run(text)
    run.bold = bold
    run.font.name = 'Calibri'
    run.font.size = Pt(11)
    run.font.color.rgb = DARK_TEXT
    return p

def add_bullet(text, level=0):
    p = doc.add_paragraph(text, style='List Bullet')
    p.paragraph_format.left_indent = Cm(1.27 + level*0.63)
    for run in p.runs:
        run.font.size = Pt(10)
        run.font.name = 'Calibri'
    return p

# ── FOOTER ──
for section in doc.sections:
    footer = section.footer
    footer.is_linked_to_previous = False
    fp = footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = fp.add_run("JvG Consultancy | Safety • Governance • Advisory | © 2026")
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x99, 0x99, 0x99)
    run.font.name = 'Calibri'

# ════════════════════════════════════════
# TITLE PAGE
# ════════════════════════════════════════
doc.add_paragraph()
if os.path.exists(LOGO):
    doc.add_picture(LOGO, width=Cm(4.5))
    doc.paragraphs[-1].alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph()

for txt, sz, clr in [
    ("PGS 15:2025", 26, PRIMARY),
    ("Compliance Toetsing", 22, PRIMARY),
    ("Phoenix Metals B.V. — Pilot Plant Slag Chemicals", 16, DARK_TEXT),
]:
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(txt)
    run.font.size = Pt(sz)
    run.font.color.rgb = clr
    run.bold = True
    run.font.name = 'Calibri'

doc.add_paragraph()
header_info = [
    ("Document", "9 van 13"),
    ("Project", "Phoenix Metals B.V. — Pilot Plant"),
    ("Type", "Compliance Toetsing PGS 15:2025"),
    ("Auteur", "JvG Consultancy"),
    ("Versie", "5.1"),
    ("Datum", "7 mei 2026"),
    ("Status", "Definitief"),
]
t = doc.add_table(rows=len(header_info), cols=2)
t.alignment = WD_TABLE_ALIGNMENT.CENTER
for i, (k, v) in enumerate(header_info):
    t.rows[i].cells[0].text = ''
    t.rows[i].cells[1].text = ''
    p0 = t.rows[i].cells[0].paragraphs[0]
    r0 = p0.add_run(k)
    r0.bold = True; r0.font.size = Pt(10); r0.font.name = 'Calibri'
    p1 = t.rows[i].cells[1].paragraphs[0]
    r1 = p1.add_run(v)
    r1.font.size = Pt(10); r1.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Vertrouwelijk — Alleen voor intern gebruik")
run.font.color.rgb = RED
run.font.size = Pt(11)
run.bold = True

doc.add_page_break()

# ════════════════════════════════════════
# VERSIEHISTORIE
# ════════════════════════════════════════
doc.add_heading('Versiehistorie', level=1)
t = doc.add_table(rows=1, cols=4)
add_header_row(t, ["Versie", "Datum", "Wijziging", "Auteur"])
for v, d, w, a in [
    ("4.0", "2026-04-15", "Eerste correcte toetsing (8 stoffen)", "JvG"),
    ("4.1", "2026-04-18", "Correcties klasse-indelingen", "JvG"),
    ("5.0", "2026-05-01", "Volledige herziening: 20 stoffen, CMR-toetsing, 3 vakken", "JvG"),
    ("5.1", "2026-05-07", "Heranalyse met uniform 150 kg per product (18 stoffen)", "JvG"),
]:
    add_row(t, [v, d, w, a])

doc.add_paragraph()

# ════════════════════════════════════════
# 1. INLEIDING & SCOPE
# ════════════════════════════════════════
doc.add_heading('1. Inleiding & Scope', level=1)
add_para(
    "Dit rapport presenteert de resultaten van de PGS 15:2025 compliance toetsing voor de Pilot Plant "
    "Slag Chemicals van Phoenix Metals B.V. Versie 5.1 is een heranalyse van v5.0 met een uniforme "
    "hoeveelheid van 150 kg per product (totaal 18 stoffen). De toetsing is gebaseerd op het Meta-Dossier "
    "Pilot Plant v5.0, waarin alle stoffen SDS-geverifieerd zijn."
)

doc.add_heading('1.1 Doel', level=2)
add_para(
    "Bepalen van het vereiste veiligheidsniveau en de verplichte opslagmaatregelen conform PGS 15:2025 "
    "(Publicatie 565, maart 2025) voor alle 18 stoffen in de Pilot Plant, elk met een maximale opslag van "
    "150 kg. Daarnaast: CMR-compliance toetsing (V₂O₅, NaVO₃, elektrolyt), milieu-compliance (H411-stoffen), "
    "en scheiding in 3 opslagvakken op basis van ADR-klassen."
)

doc.add_heading('1.2 Referentiekader', level=2)
add_bullet("PGS 15:2025 — Publicatie 565 (maart 2025)")
add_bullet("ADR 2025")
add_bullet("CLP-verordening (EG) Nr. 1272/2008")

doc.add_heading('1.3 Belangrijke opmerkingen', level=2)
add_bullet("Versie 5.0 was de eerste complete toetsing met 20 stoffen.")
add_bullet("Versie 5.1 heranalyseert met uniform 150 kg per product (18 stoffen).")
add_bullet("Drie bekende correcties op de \"List of chemicals used\": NaVO₃ (H341), NaAlO₂ (H290 + PG III), elektrolyt (H411).")

doc.add_page_break()

# ════════════════════════════════════════
# 2. STOFFENOVERZICHT
# ════════════════════════════════════════
doc.add_heading('2. Stoffenoverzicht', level=1)
add_para("Overzicht van alle 18 stoffen bij de Pilot Plant Slag Chemicals, conform Meta-Dossier v5.0 (SDS-geverifieerd). Elke stof wordt opgeslagen in een hoeveelheid van 150 kg.")

# 2.1 Input Chemicals
doc.add_heading('2.1 Input Chemicals (5 stoffen)', level=2)
t = doc.add_table(rows=1, cols=6)
add_header_row(t, ["ID", "Stof", "CAS", "H-codes", "ADR", "150 kg"])
input_chems = [
    ("IC-01", "Steelmaking Slag (poeder)", "65996-71-6", "H315/H318/H335/H372", "Geen", "150 kg vast"),
    ("IC-02", "Sulfuric acid 25%", "7664-93-9", "H290/H314/H318", "8 PG II", "150 kg vloeistof"),
    ("IC-03", "Hydrogen peroxide 30%", "7722-84-1", "H302/H332/H318", "5.1(8) PG II", "150 kg vloeistof"),
    ("IC-04", "Sodium persulfate", "7775-27-1", "H272/H302/H315/H317/H319/H334/H335", "5.1 PG III", "150 kg vast"),
    ("IC-05", "Hydrochloric acid 20%", "7647-01-0", "H290/H315/H319/H335", "8 PG II", "150 kg vloeistof"),
]
for row_data in input_chems:
    add_row(t, list(row_data))

# 2.2 Intermediates
doc.add_heading('2.2 Intermediates (4 stoffen)', level=2)
t = doc.add_table(rows=1, cols=6)
add_header_row(t, ["ID", "Stof", "CAS", "H-codes", "ADR", "150 kg"])
intermediates = [
    ("IM-01", "Calcium sulfate/silica", "10101-41-4 / 112945-52-5", "Geen", "Geen", "150 kg vast"),
    ("IM-02", "Sodium sulfate decahydrate", "7727-73-3", "Geen", "Geen", "150 kg vast"),
    ("IM-03", "Trisodium orthovanadate", "13721-39-6", "H302/H312/H332/H315/H319", "Geen", "150 kg vast"),
    ("IM-04", "Sodium metavanadate", "13718-26-8", "H301/H332/H319/H341/H361fd/H372/H411", "6.1 PG III", "150 kg vast"),
]
for row_data in intermediates:
    add_row(t, list(row_data))
add_para("Opmerking: IM-04 Sodium metavanadate bevat H341 (Muta. 2) en H361fd (Repr. 2) — CMR-classificatie.", bold=False)

# 2.3 Eindproducten
doc.add_heading('2.3 Eindproducten (9 stoffen)', level=2)
t = doc.add_table(rows=1, cols=6)
add_header_row(t, ["ID", "Stof", "CAS", "H-codes", "ADR", "150 kg"])
endproducts = [
    ("EP-01", "Calcium hydroxide", "1305-62-0", "H315/H318/H335", "Geen", "150 kg vast"),
    ("EP-02", "Silica, precipitated", "112945-52-5", "Geen", "Geen", "150 kg vast"),
    ("EP-03", "Iron oxide", "1309-37-1", "Geen", "Geen", "150 kg vast"),
    ("EP-04", "Manganese(IV)oxide", "1313-13-9", "H302/H332/H373", "Geen", "150 kg vast"),
    ("EP-05", "Magnesium hydroxide", "1309-42-8", "Geen", "Geen", "150 kg vast"),
    ("EP-06", "Sodium aluminate solution", "1302-42-7", "H314/H318", "8 PG III", "150 kg vloeistof"),
    ("EP-07", "Sodium phosphate", "7601-54-9", "H315/H319/H335", "Geen", "150 kg vast"),
    ("EP-08", "Vanadium pentoxide", "1314-62-1", "H301/H318/H330/H335/H341/H350/H361fd/H362/H372/H411", "6.1 PG III", "150 kg vast"),
    ("EP-09", "Vanadium electrolyte", "H₂SO₄/VOSO₄/V₂(SO₄)₃", "H290/H302/H314/H318/H361/H401/H370/H335/H372", "8 PG II", "150 kg vloeistof"),
]
for row_data in endproducts:
    add_row(t, list(row_data))
add_para("Opmerking: EP-08 V₂O₅ bevat Carc. 1B (H350) — zwaarste CMR-categorie. EP-09 bevat Repr. 2 (H361) — CMR.", bold=False)

doc.add_page_break()

# ════════════════════════════════════════
# 3. NIVEAUBEPALING PER STOF
# ════════════════════════════════════════
doc.add_heading('3. Niveaubepaling per Stof', level=1)
add_para(
    "Per ADR-geclassificeerde stof wordt het veiligheidsniveau bepaald op basis van PGS 15:2025 Tabel 6. "
    "Niet-ADR stoffen worden vermeld voor de volledigheid maar ontvangen geen individueel PGS 15 niveau."
)

doc.add_heading('3.1 ADR-geclassificeerde stoffen (8 stuks)', level=2)

# Tabel niveaubepaling
t = doc.add_table(rows=1, cols=5)
add_header_row(t, ["Stof", "ADR Klasse", "Hoeveelheid", "Niveau (Tabel 6)", "Definitief Niveau"])
adr_stoffen = [
    ("IC-02 Sulfuric acid 25%", "8 PG II", "150 kg vloeistof", "B (< 250 kg)", "B"),
    ("IC-03 Hydrogen peroxide 30%", "5.1(8) PG II", "150 kg vloeistof", "B (< 250 kg)", "B"),
    ("IC-04 Sodium persulfate", "5.1 PG III", "150 kg vast", "B (< 1.000 kg)", "B"),
    ("IC-05 Hydrochloric acid 20%", "8 PG II", "150 kg vloeistof", "B (< 250 kg)", "B"),
    ("IM-04 Sodium metavanadate", "6.1 PG III", "150 kg vast", "B (< 5.000 kg)", "C (CMR: Muta.2+Repr.2)"),
    ("EP-06 Sodium aluminate", "8 PG III", "150 kg vloeistof", "B (< 2.500 kg)", "B"),
    ("EP-08 Vanadium pentoxide", "6.1 PG III", "150 kg vast", "B (< 5.000 kg)", "C (CMR: Carc.1B)"),
    ("EP-09 Vanadium electrolyte", "8 PG II", "150 kg vloeistof", "B (< 250 kg)", "C (CMR: Repr.2)"),
]
for row_data in adr_stoffen:
    add_row(t, list(row_data))

# Rationale per stof
doc.add_heading('3.1.1 Rationale per ADR-stof', level=3)

rationales = [
    ("Sulfuric acid 25% (IC-02)", 
     "Corrosieve vloeistof, ADR klasse 8 PG II. Bij 150 kg: ondergrens 250 kg voor Tabel 6 → Niveau B. "
     "Geen CMR-classificatie → Niveau B (Basis + B-maatregelen)."),
    ("Hydrogen peroxide 30% (IC-03)", 
     "Oxiderende vloeistof, ADR klasse 5.1(8) PG II. Bij 150 kg: ondergrens 250 kg → Niveau B. "
     "Geen CMR. Let op: ook klasse 8 subrisico, maar primair 5.1. Scheiding van brandbare stoffen verplicht."),
    ("Sodium persulfate (IC-04)", 
     "Oxiderende vaste stof, ADR klasse 5.1 PG III. Bij 150 kg: ondergrens 1.000 kg → Niveau B. "
     "H334 (sensibiliserend): geen impact op niveau, maar aandachtspunt voor luchtkwaliteit."),
    ("Hydrochloric acid 20% (IC-05)", 
     "Corrosieve vloeistof, ADR klasse 8 PG II. Bij 150 kg: ondergrens 250 kg → Niveau B. "
     "H335 (irriterend): ventilatie vereist. Geen CMR → Niveau B."),
    ("Sodium metavanadate (IM-04)", 
     "Giftige vaste stof, ADR klasse 6.1 PG III. Bij 150 kg: Tabel 6 < 5.000 kg → Niveau B. "
     "MAAR: CMR-route: Muta. 2 (H341) + Repr. 2 (H361fd). Ondergrens CMR: 25 kg vast → 150 kg > 25 kg → Niveau C. "
     "H411: milieugevaarlijk — milieucompliance verplicht."),
    ("Sodium aluminate solution (EP-06)", 
     "Corrosieve vloeistof, ADR klasse 8 PG III. Bij 150 kg: ondergrens 2.500 kg → Niveau B. "
     "Geen CMR → Niveau B."),
    ("Vanadium pentoxide (EP-08)", 
     "Giftige vaste stof, ADR klasse 6.1 PG III. Bij 150 kg: Tabel 6 < 5.000 kg → Niveau B. "
     "MAAR: CMR-route: Carc. 1B (H350). Ondergrens CMR: 25 kg vast → 150 kg > 25 kg → Niveau C. "
     "Carc. 1B is de zwaarste CMR-categorie in deze installatie. H330 (dodelijk bij inademing), H411 (milieugevaarlijk)."),
    ("Vanadium electrolyte (EP-09)", 
     "Corrosieve vloeistof (mengsel H₂SO₄/VOSO₄/V₂(SO₄)₃), ADR klasse 8 PG II. Bij 150 kg: ondergrens 250 kg → Niveau B. "
     "MAAR: CMR-route: Repr. 2 (H361). Ondergrens CMR: 1 kg vloeistof → 150 kg > 1 kg → Niveau C. "
     "H370 (STOT SE 1), H411 (milieugevaarlijk)."),
]

for title, text in rationales:
    add_para(title, bold=True)
    add_para(text)

doc.add_heading('3.2 Niet-ADR stoffen (10 stuken)', level=2)
add_para(
    "De volgende 10 stoffen zijn niet ADR-geclassificeerd en vallen buiten de directe PGS 15 niveaubepaling. "
    "Ze requiren algemene opslagmaatregelen (Basisniveau):"
)
non_adr = [
    "IC-01: Steelmaking Slag (poeder) — H315/H318/H335/H372",
    "IM-01: Calcium sulfate/silica — geen gevaren",
    "IM-02: Sodium sulfate decahydrate — geen gevaren",
    "IM-03: Trisodium orthovanadate — H302/H312/H332/H315/H319",
    "EP-01: Calcium hydroxide — H315/H318/H335",
    "EP-02: Silica, precipitated — geen gevaren",
    "EP-03: Iron oxide — geen gevaren",
    "EP-04: Manganese(IV) oxide — H302/H332/H373",
    "EP-05: Magnesium hydroxide — geen gevaren",
    "EP-07: Sodium phosphate — H315/H319/H335",
]
for s in non_adr:
    add_bullet(s)

doc.add_heading('3.3 Samenvatting niveaubepaling', level=2)
add_para("Geaggregeerd niveau: C (bepaald door CMR-stoffen).", bold=True)
add_para(
    "Bij 150 kg per product bereiken drie stoffen Niveau C via de CMR-route: V₂O₅ (Carc. 1B), "
    "NaVO₃ (Muta. 2 + Repr. 2) en V-electrolyte (Repr. 2). De overige 5 ADR-stoffen zijn Niveau B. "
    "Het hoogste niveau (C) domineert de gehele opslagvoorziening."
)

doc.add_page_break()

# ════════════════════════════════════════
# 4. AGGREGATIEANALYSE
# ════════════════════════════════════════
doc.add_heading('4. Aggregatieanalyse', level=1)
t = doc.add_table(rows=1, cols=4)
add_header_row(t, ["ADR Klasse", "Stoffen", "Totaal (kg)", "Individueel Niveau"])
agg_data = [
    ("8 PG II", "IC-02, IC-05, EP-09", "450", "B, B, C"),
    ("8 PG III", "EP-06", "150", "B"),
    ("5.1 PG II", "IC-03", "150", "B"),
    ("5.1 PG III", "IC-04", "150", "B"),
    ("6.1 PG III", "IM-04, EP-08", "300", "C, C"),
    ("Niet-ADR", "10 stoffen", "1.500", "Basis"),
    ("TOTAAL", "18 stoffen", "2.700", "—"),
]
for row_data in agg_data:
    add_row(t, list(row_data))

add_para("")
add_para("Aggregatie-effecten bij 150 kg per product:", bold=True)
add_bullet("ADR 8 PG II totaal: 450 kg. Individueel alle < 250 kg (Niveau B), maar V-electrolyte is CMR → C.")
add_bullet("ADR 5.1 totaal: 300 kg. Beide < 250 resp. 1.000 kg → Niveau B.")
add_bullet("ADR 6.1 PG III totaal: 300 kg. Beide < 5.000 kg, maar beide CMR → Niveau C.")
add_bullet("Brandlading: 0 kg — geen brandbare stoffen aanwezig.")
add_bullet("CMR-route domineert: 3 stoffen trekken het gehele niveau naar C.")

doc.add_page_break()

# ════════════════════════════════════════
# 5. CMR-TOETSING
# ════════════════════════════════════════
doc.add_heading('5. CMR-Toetsing', level=1)
add_para(
    "Drie stoffen in de Pilot Plant hebben een CMR-classificatie (Carcinogeen, Mutageen, Reproductietoxisch). "
    "De CMR-route overschrijft de hoeveelheidsroute uit PGS 15 Tabel 6."
)

doc.add_heading('5.1 Vanadium pentoxide (EP-08) — Carc. 1B', level=2)
add_para("CAS: 1314-62-1 | ADR: 6.1 PG III | Hoeveelheid: 150 kg vast")
add_para("CMR-classificatie: Carc. 1B (H350), Muta. 2 (H341), Repr. 2 (H361fd), Lact. (H362)", bold=True)
add_bullet("Carc. 1B (H350): \"Kan kanker veroorzaken\" — zwaarste CMR-categorie in deze installatie")
add_bullet("Ondergrens CMR: 25 kg vast → 150 kg overschrijdt ruimschoots")
add_bullet("H330: Dodelijk bij inademing — extra urgency voor ademhalingsbescherming")
add_bullet("H411: Giftig voor waterorganismen, langdurig — milieucompliance verplicht")
add_bullet("Definitief niveau: C")

doc.add_heading('5.2 Sodium metavanadate (IM-04) — Muta. 2 + Repr. 2', level=2)
add_para("CAS: 13718-26-8 | ADR: 6.1 PG III | Hoeveelheid: 150 kg vast")
add_para("CMR-classificatie: Muta. 2 (H341), Repr. 2 (H361fd)", bold=True)
add_bullet("Muta. 2 (H341): \"Vermoed wordt dat genetische defecten veroorzaakt\"")
add_bullet("Repr. 2 (H361fd): \"Kan schade aan het ongeboren kind veroorzaken\"")
add_bullet("Ondergrens CMR: 25 kg vast → 150 kg overschrijdt")
add_bullet("H411: Milieugevaarlijk — opvangvoorziening verplicht")
add_bullet("Definitief niveau: C")

doc.add_heading('5.3 Vanadium electrolyte (EP-09) — Repr. 2', level=2)
add_para("CAS: Mengsel (H₂SO₄/VOSO₄/V₂(SO₄)₃) | ADR: 8 PG II | Hoeveelheid: 150 kg vloeistof")
add_para("CMR-classificatie: Repr. 2 (H361)", bold=True)
add_bullet("Repr. 2 (H361): \"Kan schade aan het ongeboren kind veroorzaken\"")
add_bullet("Ondergrens CMR vloeistof: 1 kg → 150 kg overschrijdt ruimschoots")
add_bullet("H370 (STOT SE 1): Specifieke orgaantoxiciteit bij eenmalige blootstelling")
add_bullet("H411: Milieugevaarlijk — bluswateropvang verplicht")
add_bullet("Definitief niveau: C")

doc.add_page_break()

# ════════════════════════════════════════
# 6. SEVESO/BVR-BEPALING
# ════════════════════════════════════════
doc.add_heading('6. Seveso/BVR-Bepaling', level=1)
add_para(
    "Totaal opgeslagen hoeveelheid: 2.700 kg (18 × 150 kg). Dit is ver onder alle Seveso III/BVR-drempels. "
    "Geen enkele stof benadert individueel of in aggregatie een Seveso-drempel."
)
add_bullet("Seveso III (Risicobesluit): Niet van toepassing — geen drempelwaarde overschreden")
add_bullet("BVR (Besluit risico's zware ongevallen): Niet van toepassing")
add_bullet("Vergunningsplicht opslag: Lokaal toetsen — hoeveelheden likely onder drempels")

doc.add_page_break()

# ════════════════════════════════════════
# 7. VEREIST VEILIGHEIDSNIVEAU
# ════════════════════════════════════════
doc.add_heading('7. Vereist Veiligheidsniveau', level=1)

t = doc.add_table(rows=1, cols=3)
add_header_row(t, ["Niveau", "Bron", "Toegepast op"])
level_data = [
    ("Basis", "PGS 15 §4.1", "Alle 18 stoffen"),
    ("B", "PGS 15 Tabel 6", "5 ADR-stoffen zonder CMR (IC-02, IC-03, IC-04, IC-05, EP-06)"),
    ("C", "CMR-route", "3 CMR-stoffen (EP-08, IM-04, EP-09)"),
]
for row_data in level_data:
    add_row(t, list(row_data))

add_para("")
p = add_para("CONCLUSIE: Vereist veiligheidsniveau = C", bold=True)
for run in p.runs:
    run.font.color.rgb = RED

add_para(
    "Het vereiste niveau C wordt bepaald door drie CMR-stoffen: V₂O₅ (Carc. 1B), Na-metavanadate "
    "(Muta. 2 + Repr. 2) en V-electrolyte (Repr. 2). Bij 150 kg per product overschrijden alle drie de "
    "CMR-ondergrens. Niveau C omvat alle Basis + B + C maatregelen conform PGS 15:2025."
)

doc.add_page_break()

# ════════════════════════════════════════
# 8. VAKVERDELING & OPSLAGINDELING
# ════════════════════════════════════════
doc.add_heading('8. Vakverdeling & Opslagindeling', level=1)
add_para(
    "De opslag wordt verdeeld in 3 vakken op basis van ADR-klassen en scheidingseisen. "
    "Alle stoffen 150 kg per product."
)

t = doc.add_table(rows=1, cols=4)
add_header_row(t, ["Vak", "ADR Klasse", "Stoffen", "Totaal"])
vak_data = [
    ("Vak 1: CMR-stoffen", "6.1 PG III", "IM-04 Na-metavanadate, EP-08 V₂O₅", "300 kg"),
    ("Vak 2: Corrosieve vloeistoffen", "8 PG II / PG III", "IC-02 H₂SO₄ 25%, IC-05 HCl 20%, EP-06 NaAlO₂, EP-09 V-electrolyte", "600 kg"),
    ("Vak 3: Oxiderend + overig", "5.1 + Niet-ADR", "IC-03 H₂O₂ 30%, IC-04 Na-persulfate, + 10 niet-ADR stoffen", "1.800 kg"),
]
for row_data in vak_data:
    add_row(t, list(row_data))

add_para("")
add_para("Scheidingseisen:", bold=True)
add_bullet("Vak 1 (CMR): Volledig gescheiden, gesloten systeem, negatieve druk [1]")
add_bullet("Vak 2 (Corrosief): Scheiding zuren vs basen binnen het vak — H₂SO₄/HCl gescheiden van NaAlO₂")
add_bullet("Vak 3 (Oxiderend): H₂O₂ en Na-persulfate gescheiden van brandbare stoffen (geen aanwezig)")
add_bullet("Alle vakken: Opvangvoorziening 110% grootste eenheid of 10% totaal volume [4]")

doc.add_page_break()

# ════════════════════════════════════════
# 9. MAATREGELENOVERZICHT (D1-D9)
# ════════════════════════════════════════
doc.add_heading('9. Maatregelenoverzicht (Basis + B + C)', level=1)
add_para(
    "Onderstaand overzicht toont de PGS 15:2025 maatregelen per doelstelling (D1-D9) voor Niveau C. "
    "Niveau C omvat alle Basis-, B- en C-maatregelen."
)

doelstellingen = [
    ("D1 — Aanrijding voorkomen", "S1", "M88, M130, M131, M132, M133, M76, M77, M78"),
    ("D2 — Fysieke bescherming", "S2, S3, S7", "M48, M89, M68, M21, M70"),
    ("D3 — Juiste opslag", "S4, S5, S11", "MW1, M2, M3, M14, M30, M35, M48, M20, M68, M86, M87, M136, M137, M76"),
    ("D4 — Lekkage beheersen", "S4, S5, S6, S11", "M29, M115, M111, M119, M120"),
    ("D5 — Noodreactie", "S4, S6, S11-S15", "M95, M109, M119, M120, M121, M134, M135, M103, M113-M118"),
    ("D6 — Hulpdiensten", "S11-S16", "M109, M116, M117, M118"),
    ("D7 — Verspreiding voorkomen", "S11, S12", "M29, M111"),
    ("D8 — Ontsteking voorkomen", "S7, S13", "M134, M135, M136"),
    ("D9 — Brand in opslag voorkomen", "S13, S14", "M95, M103, M21, M23"),
]

t = doc.add_table(rows=1, cols=3)
add_header_row(t, ["Doelstelling", "Scenario's", "Maatregelen (Basis + B + C)"])
for d, s, m in doelstellingen:
    add_row(t, [d, s, m])

add_para("")
add_para("Aanvullende CMR-maatregelen:", bold=True)
cmr_measures = [
    "Volledig gescheiden opslag V₂O₅ van alle andere stoffen (Carc. 1B verplichting) [1]",
    "Gesloten systeem of afgesloten opslagvoorziening met negatieve druk [1]",
    "Ademhalingsbescherming (P3-filter of luchttoevoer) verplicht bij hantering [2]",
    "Contaminatiecontrole: oppervlakte-waarden monitoren op vanadium [2]",
    "Medisch surveillanceregister voor werknemers met blootstelling Carc. 1B [3]",
    "RI&E specifiek voor V₂O₅ [3]",
    "Voorlichting aan vrouwen in vruchtbare levensfase (Repr. 2 stoffen) [3]",
]
for m in cmr_measures:
    add_bullet(m)

doc.add_page_break()

# ════════════════════════════════════════
# 10. WBDBO EISEN
# ════════════════════════════════════════
doc.add_heading('10. WBDBO Eisen', level=1)
add_para(
    "Wet Basisregistratie Kadaster en Topografie / Wet Beheer Rijksoverheidsgebouwen — relevantie voor "
    "opslagvoorzieningen op bedrijventerrein."
)
add_bullet("Bouwvergunning: Vereist indien opslag in nieuwe constructie — toetsen bij gemeente")
add_bullet("Bodembeveiliging: Opvangvoorziening waterproof — 110% grootste eenheid of 10% totaal [4]")
add_bullet("Bluswateropvang: Voorkomen dat verontreinigd bluswater milieu bereikt [4]")
add_bullet("Geen lozing op riool, bodem of oppervlaktewater [4]")
add_bullet("Milieuvergunning: Toetsen of hoeveelheden onder drempels vallen — 2.700 kg totaal likely OK")

doc.add_page_break()

# ════════════════════════════════════════
# 11. AFWIJKINGEN & AANBEVELINGEN
# ════════════════════════════════════════
doc.add_heading('11. Afwijkingen & Aanbevelingen', level=1)

doc.add_heading('11.1 Afwijkingen', level=2)
add_bullet("Geen structurele afwijkingen geconstateerd bij 150 kg per product.")
add_bullet("Alle ADR-stoffen voldoen aan Tabel 6grenzen bij 150 kg, met uitzondering van de CMR-route.")
add_bullet("De CMR-route is geen afwijking maar een normatieve verzwaring.")

doc.add_heading('11.2 Aanbevelingen', level=2)
recs = [
    "V₂O₅ (Carc. 1B): Overweeg substitutie — indien technisch haalbaar, vervang door minder gevaarlijk alternatief [1]",
    "Alle CMR-stoffen: Stel blootstellingslimieten vast en implementeer periodieke monitoring [2]",
    "H334-stoffen (Na-persulfate): Sensibiliserend — adequaat ventilatiesysteem met filtratie [2]",
    "H411-stoffen (V₂O₅, NaVO₃, V-electrolyte): Milieuzorgplicht — bluswateropvang, geen lozing [4]",
    "Noodplan: Jaarlijkse oefening met specifiek scenario voor CMR-stoffen en zuurlekkage",
    "PBM-beleid: P3-ademhalingsbescherming standaard voor Vak 1 (CMR-vak)",
]
for r in recs:
    add_bullet(r)

doc.add_page_break()

# ════════════════════════════════════════
# 12. BRONVERWIJZINGEN
# ════════════════════════════════════════
doc.add_heading('12. Bronverwijzingen', level=1)
bronnen = [
    "[1] PGS 15:2025 — Publicatie 565 (maart 2025). Publicatiereeks Gevaarlijke Stoffen, Ministerie van I&W.",
    "[2] ADR 2025 — Accord européen relatif au transport international des marchandises Dangereuses par Route.",
    "[3] CLP-verordening (EG) Nr. 1272/2008 — Classification, Labelling and Packaging of substances and mixtures.",
    "[4] Wet milieubeheer — Lozingenbesluit, Bodembescherming, Bluswateropvang richtlijnen.",
    "[5] Arbowet / Arbobesluit — Titel 3 (Gevaarlijke stoffen), Artikel 4.1c (CMR-stoffen).",
]
for b in bronnen:
    add_para(b)

doc.add_page_break()

# ════════════════════════════════════════
# 13. TIERVERIFY LOG
# ════════════════════════════════════════
doc.add_heading('TierVerify Log', level=1)
add_para("Documentverificatie en kwaliteitscontrole — v5.1", bold=True)

t = doc.add_table(rows=1, cols=4)
add_header_row(t, ["Check", "Bron", "Status", "Datum"])
verify_data = [
    ("Stoffenidentificatie (18 stuks)", "Meta-Dossier v5.0 / SDS", "✅ Geverifieerd", "2026-05-07"),
    ("ADR-classificatie (8 ADR-stoffen)", "ADR 2025 / SDS", "✅ Geverifieerd", "2026-05-07"),
    ("H-codes per stof", "CLP / SDS", "✅ Geverifieerd", "2026-05-07"),
    ("CMR-classificatie (3 stoffen)", "CLP Annex VI / SDS", "✅ Geverifieerd", "2026-05-07"),
    ("Hoeveelheden (150 kg/uniform)", "Opdracht JvG", "✅ Toegepast", "2026-05-07"),
    ("Niveaubepaling Tabel 6", "PGS 15:2025 Tabel 6", "✅ Bepaald", "2026-05-07"),
    ("CMR-route toetsing", "PGS 15:2025 §4.3", "✅ Toegepast", "2026-05-07"),
    ("Seveso/BVR-drempels", "Brzo 2015 / Risicobesluit", "✅ Niet van toepassing", "2026-05-07"),
    ("Aggregatieanalyse", "PGS 15:2025 §4.2", "✅ Berekend", "2026-05-07"),
    ("Maatregelen D1-D9", "PGS 15:2025 Bijlage A", "✅ Toegekend", "2026-05-07"),
    ("Bronverwijzingen [1]-[5]", "PGS 15, ADR, CLP, Wet milieubeheer, Arbowet", "✅ Opgenomen", "2026-05-07"),
]
for row_data in verify_data:
    add_row(t, list(row_data))

add_para("")
add_para("Versie: 5.1 | Auteur: JvG Consultancy | Status: Definitief | Datum: 7 mei 2026")

# ── SAVE ──
os.makedirs(DELIV, exist_ok=True)
doc.save(OUT)
print(f"✅ DOCX opgeslagen: {OUT}")
