#!/usr/bin/env python3
"""Generate REACH Veilig Werken HSEQ Framework — Phoenix Metals D2 v4.0"""

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

doc = Document()

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

for level in range(1, 4):
    hs = doc.styles[f'Heading {level}']
    hs.font.color.rgb = RGBColor(0, 51, 102)
    hs.font.name = 'Calibri'

# ── Helper functions ────────────────────────────────────────────────
def add_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Light Grid Accent 1'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = h
        for p in cell.paragraphs:
            for r in p.runs:
                r.bold = True
                r.font.size = Pt(9)
    # Rows
    for ri, row in enumerate(rows):
        for ci, val in enumerate(row):
            cell = table.rows[ri + 1].cells[ci]
            cell.text = str(val)
            for p in cell.paragraphs:
                for r in p.runs:
                    r.font.size = Pt(9)
    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_bullet(doc, text, level=0, bold_prefix=None):
    p = doc.add_paragraph(style='List Bullet')
    p.paragraph_format.left_indent = Cm(1.27 + level * 0.63)
    if bold_prefix:
        run = p.add_run(bold_prefix)
        run.bold = True
        p.add_run(text)
    else:
        p.add_run(text)
    return p

def add_warning_box(doc, text):
    p = doc.add_paragraph()
    run = p.add_run(f'⚠️ {text}')
    run.bold = True
    run.font.color.rgb = RGBColor(192, 0, 0)
    run.font.size = Pt(11)

# ════════════════════════════════════════════════════════════════════
# TITELPAGINA
# ════════════════════════════════════════════════════════════════════
for _ in range(6):
    doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('REACH Veilig Werken\nHSEQ Framework')
run.bold = True
run.font.size = Pt(28)
run.font.color.rgb = RGBColor(0, 51, 102)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Phoenix Metals — Demonstrator Installatie\nPlant One Rotterdam')
run.font.size = Pt(16)
run.font.color.rgb = RGBColor(0, 51, 102)

doc.add_paragraph()

meta_info = [
    ('Documentcode', 'PM-HSEQ-D2'),
    ('Versie', '4.0'),
    ('Datum', datetime.date.today().strftime('%d %B %Y')),
    ('Status', 'Definitief'),
    ('Auteur', 'Jorick van Gemert — HSEQ Consultant'),
    ('Goedkeuring', 'Stijn van Zelst — Managing Director Phoenix Metals'),
    ('Vertrouwelijkheid', 'Intern — Niet openbaar'),
]
t = doc.add_table(rows=len(meta_info), cols=2)
t.style = 'Light Grid Accent 1'
for i, (k, v) in enumerate(meta_info):
    t.rows[i].cells[0].text = k
    t.rows[i].cells[1].text = v
    for p in t.rows[i].cells[0].paragraphs:
        for r in p.runs:
            r.bold = True

doc.add_page_break()

# ════════════════════════════════════════════════════════════════════
# MANAGEMENTSAMENVATTING
# ════════════════════════════════════════════════════════════════════
doc.add_heading('Managementsamenvatting', level=1)

doc.add_paragraph(
    'Dit document vormt het operationele HSEQ Framework voor veilig werken met REACH-gerelateerde '
    'gevaarlijke stoffen bij de demonstratorinstallatie van Phoenix Metals te Plant One Rotterdam. '
    'Het framework integreert risico-inventarisatie, blootstellingsbeheersing, CMR-protocol, '
    'stralingsveiligheid, taakrisicoanalyse en calamiteitenprocedures in één samenhangend geheel.'
)

doc.add_paragraph(
    'Phoenix Metals verwerkt SARU-ash (catalytisch residu uit olieraffinage) via een hydrometallurgisch '
    'proces om vanadium en nikkel terug te winnen. De demonstrator verwerkt maximaal 60 kg ash in batches '
    'van 3,5 kg, gedurende een campagne van ≤3 maanden. De ash bevat:'
)
add_bullet(doc, 'Natriummetavanaadaat, trinatriumorthowanaadaat en nikkeloxide (CMR-stoffen)')
add_bullet(doc, 'Natuurlijk voorkomende radionucliden uit de U-238 vervalreeks (Pb-210, Ra-228)')
add_bullet(doc, 'Chemische reagentia: zwavelzuur (25–75%), natriumhydroxide (50%), aluminiumsulfaat')

doc.add_paragraph(
    'Kernrisico\'s zijn blootstelling aan CMR-stoffen (nikkeloxide Carc. 1A, vanadiumpentoxide Carc. 2) '
    'met zeer lage MAC-waarden (0,05 mg/m³), radiologische blootstelling via natuurlijk voorkomende '
    'radionucliden, en chemische risico\'s door corrosieve reagentia. Het framework waarborgt naleving '
    'van het Arbobesluit (art. 4.15–4.19), het Besluit basisveiligheidsnormen stralingsbescherming, '
    'REACH-verordening (EG) 1907/2006 en de CLP-verordening (EG) 1272/2008.'
)

doc.add_paragraph(
    'De beheersmaatregelen zijn gebaseerd op de arbeidshygienische strategie: eliminatie, substitutie, '
    'technische maatregelen (flow cabinet, gesloten systeem, LEV), organisatorische maatregelen '
    '(werkprotocollen, blootstellingsregistratie) en persoonlijke beschermingsmiddelen (PBM-matrix). '
    'Alle werkzaamheden vereisen een goedgekeurde TRA en LMRA voorafgaand aan uitvoering.'
)

doc.add_page_break()

# ════════════════════════════════════════════════════════════════════
# H1: RISICO-INVENTARISATIE
# ════════════════════════════════════════════════════════════════════
doc.add_heading('1. Risico-inventarisatie', level=1)

# 1.1
doc.add_heading('1.1 Overzicht gevaarlijke stoffen', level=2)
doc.add_paragraph(
    'Onderstaande tabel geeft een compleet overzicht van alle gevaarlijke stoffen die bij de '
    'demonstrator aanwezig zijn of tijdens het proces vrijkomen, inclusief CAS-nummer, gevarenclassificatie '
    'en SER MAC-waarden.'
)

substances = [
    ['Nikkeloxide (NiO)', '1313-99-1', 'Carc. 1A,\nRepr. 1B,\nSTOT RE 1', 'H350i, H361f,\nH372', '0,05 mg/m³\n(inhal. fractie)', 'Ash (intrinsiek)'],
    ['Vanadiumpentoxide (V₂O₅)', '1314-62-1', 'Carc. 2,\nRepr. 2,\nSTOT RE 1', 'H351, H361d,\nH372', '0,05 mg/m³\n(inhal. fractie)', 'Ash (intrinsiek)'],
    ['Natriummetavanaadaat', '13718-26-8', 'Acute Tox. 3,\nSTOT RE 2', 'H301, H319,\nH373', '0,05 mg/m³\n(als V₂O₅)', 'Ash (intrinsiek)'],
    ['Zwavelzuur (25–75%)', '7664-93-9', 'Skin Corr. 1A', 'H290, H314', '0,1 mg/m³\n(nevel)', 'Reagens'],
    ['Natriumhydroxide (50%)', '1310-73-2', 'Skin Corr. 1A', 'H290, H314', '2 mg/m³', 'Reagens'],
    ['Aluminiumsulfaat', '7784-31-8', 'Eye Irrit. 2,\nSTOT SE 3', 'H319, H335', 'Niet vastgesteld', 'Reagens'],
    ['Calciumoxide', '1305-78-8', 'Skin Irrit. 2,\nEye Dam. 1,\nSTOT SE 3', 'H315, H318,\nH335', '1 mg/m³', 'Reagens'],
]

add_table(doc,
    ['Stof', 'CAS-nr.', 'CLP-classificatie', 'H-zinnen', 'MAC-waarde\n(SER)', 'Bron'],
    substances,
    col_widths=[4, 2.2, 2.5, 2.5, 2.5, 2.5]
)

doc.add_paragraph()

# 1.2
doc.add_heading('1.2 Blootstellingsscenario\'s per werkzaamheid', level=2)
doc.add_paragraph(
    'Het demonstratorproces omvat de volgende werkzaamheden met potentieel blootstelling aan '
    'gevaarlijke stoffen:'
)

scenarios = [
    ['Ash handling\n(afweging, transfer)', 'Ash (CMR-stoffen,\nradionucliden)', 'Stof (inhalatie,\ndermaal)', 'Flow cabinet,\nPBM', 'Hoog — CMR +\nstralingsrisico'],
    ['Extractie\n(NaOH + ash, 80°C)', 'NaOH 50%, ash,\nvanadaat-oplossing', 'Nevel/spatten\n(dermaal, ogen)', 'Gesloten reactor,\nPBM', 'Midden — corrosief'],
    ['Filtratie\n(meerdere stappen)', 'Ash-residu, filtraten\nmet zware metalen', 'Stof, vloeistof\n(dermaal)', 'Filterunit, PBM', 'Midden'],
    ['Ion exchange', 'Zwavelzuur-oplossingen,\nnikkel-rijke fracties', 'Zuur (dermaal,\ninhalatie nevel)', 'Kolom in systeem,\nPBM', 'Midden — zuur'],
    ['Elektroreductie', 'V(IV) sulfaat,\nzwavelzuur', 'Zure damp,\nelektrochemisch', 'Afgesloten cel,\nPBM', 'Laag-midden'],
    ['Reiniging\n& onderhoud', 'Alle bovengenoemde\nstoffen', 'Resten stof/vloeistof\n(alle routes)', 'Protocollen,\nPBM', 'Midden'],
]

add_table(doc,
    ['Werkzaamheid', 'Stoffen', 'Blootstellingsroute', 'Beheersing', 'Risiconiveau'],
    scenarios,
    col_widths=[3.2, 3, 2.8, 3, 2.5]
)

# 1.3
doc.add_heading('1.3 CMR-risico\'s', level=2)
doc.add_paragraph(
    'De SARU-ash bevat twee stoffen met een CMR-classificatie die specifieke wettelijke verplichtingen '
    'veroorzaken (Arbobesluit hoofdstuk 4, afdeling 2):'
)

doc.add_heading('1.3.1 Nikkeloxide (NiO) — Carc. 1A', level=3)
add_bullet(doc, 'Classificatie: Carcinogeen categorie 1A (bewezen carcinogeen voor de mens), Reproductietoxisch categorie 1B')
add_bullet(doc, 'MAC-waarde: 0,05 mg/m³ (inhalatieerbare fractie) — SER')
add_bullet(doc, 'H-zinnen: H350i (Kan kanker veroorzaken bij inademing), H361f (Verdenking van schadelijkheid voor vruchtbaarheid), H372 (Veroorzaakt schade aan organen bij langdurige blootstelling)')
add_bullet(doc, 'Blootstellingsroute: Primair via inademing van stofdeeltjes; dermaal en oraal mogelijk bij onvoldoende PBM')
add_bullet(doc, 'Gezondheidseffecten: Longkanker, neusbijholtekanker, allergisch contacteczeem, nier- en longschade bij chronische blootstelling')

doc.add_heading('1.3.2 Vanadiumpentoxide (V₂O₅) — Carc. 2', level=3)
add_bullet(doc, 'Classificatie: Carcinogeen categorie 2 (verdenking van carcinogeniciteit), Reproductietoxisch categorie 2')
add_bullet(doc, 'MAC-waarde: 0,05 mg/m³ (inhalatieerbare fractie) — SER')
add_bullet(doc, 'H-zinnen: H351 (Verdenking van kankerverwekkendheid), H361d (Verdenking schadelijk voor nageslacht), H372 (Orgaanschade bij herhaalde blootstelling)')
add_bullet(doc, 'Blootstellingsroute: Inademing van stof of nevel; irriterend voor luchtwegen, ogen en huid')
add_bullet(doc, 'Gezondheidseffecten: Longirritatie, bronchitis, mogelijk carcinogeen, reprotoxisch')

add_warning_box(doc, 'CRITIEK: Beide CMR-stoffen hebben een MAC-waarde van 0,05 mg/m³. Blootstelling moet worden geminimaliseerd door een combinatie van technische, organisatorische en persoonlijke beschermingsmaatregelen. HetArbobesluit art. 4.15–4.19 is van toepassing.')

# 1.4
doc.add_heading('1.4 Radiologische risico\'s', level=2)
doc.add_paragraph(
    'De SARU-ash bevat van nature voorkomende radionucliden (NORM) afkomstig uit aardolie. '
    'De relevante radionucliden behoren tot de U-238 vervalreeks.'
)

radionuclides = [
    ['U-238 serie', 'α-, β-, γ-straling', 'Ingesloten in asch-matrix', 'Longduur'],
    ['Pb-210', 'β-straler', 'Bio-accumulatierisico', 'Middellang'],
    ['Ra-228', 'β-, γ-straling', 'Mobiel in waterige fasen', 'Lang'],
    ['Th-228', 'α-straler', 'Vast in residu', 'Lang'],
]

add_table(doc,
    ['Radionuclide', 'Stralingstype', 'Gedrag in proces', 'Halfwaardetijd'],
    radionuclides,
    col_widths=[3.5, 3.5, 4, 3]
)

doc.add_paragraph(
    'Conform het Besluit basisveiligheidsnormen stralingsbescherming geldt voor de verwerking '
    'van ≤60 kg ash een vrijstellingsregime (art. 3.17, Annex 3, Section B, Table B, column 2). '
    'De vrijstellingswaarde wordt beperkt door Pb-210 en Ra-228 tot circa 3,5 kg ash per batch '
    '(kolom 3 waarden). Zie hoofdstuk 4 voor het volledige stralingsveiligheidsprotocol.'
)

doc.add_page_break()

# ════════════════════════════════════════════════════════════════════
# H2: BLOOTSTELLINGSBEHEERSING
# ════════════════════════════════════════════════════════════════════
doc.add_heading('2. Blootstellingsbeheersing', level=1)

doc.add_heading('2.1 Hiërarchie van maatregelen', level=2)
doc.add_paragraph(
    'De beheersmaatregelen volgen de wettelijk voorgeschreven arbeidshygienische strategie '
    '(Arbowet art. 5, Arbobesluit art. 4.1). De hiërarchie wordt van boven naar beneden toegepast:'
)

measures_hierarchy = [
    ['1. Eliminatie', 'Stof geheel vermijden', 'Niet mogelijk — ash is het hoofdgrondstof', 'N.v.t.'],
    ['2. Substitutie', 'Minder gevaarlijk alternatief', 'Onderzocht — geen alternatief voor SARU-ash in dit proces', 'Zie §2.2'],
    ['3. Technische maatregelen', 'Bron- en collectieve bescherming', 'Flow cabinet, gesloten systeem, LEV', 'Zie §2.3'],
    ['4. Organisatorische maatregelen', 'Procedures en regimes', 'Werkprotocollen, blootstellingstijd, rotatie', 'Zie §2.4'],
    ['5. Persoonlijke bescherming', 'Individuele bescherming', 'Volledige PBM-matrix per werkzaamheid', 'Zie §2.5'],
]

add_table(doc,
    ['Niveau', 'Principe', 'Toepassing Phoenix Metals', 'Referentie'],
    measures_hierarchy,
    col_widths=[3, 3.5, 5.5, 2]
)

doc.add_heading('2.2 Substitutieanalyse', level=2)
doc.add_paragraph(
    'Nikkeloxide (Carc. 1A) en vanadiumpentoxide (Carc. 2) zijn intrinsieke bestanddelen van de SARU-ash '
    'en kunnen niet worden gesubstitueerd — zij vormen de waardevolle grondstof die Phoenix Metals '
    'terugwint. Substitutie van de ash zelf is niet mogelijk aangezien het proces specifiek is ontworpen '
    'voor valorisatie van dit raffinageresidu. De vervangingsplicht (Arbobesluit art. 4.15 lid 1) is '
    'hierom niet toepasbaar; de nadruk ligt op minimalisatie van blootstelling via de overige '
    'hiërarchieniveaus.'
)

doc.add_heading('2.3 Technische maatregelen', level=2)

tech_measures = [
    ['Flow cabinet (trekkap)', 'Ash handling (afwegen,\ntransfer, monsternames)', 'Volledige insluiting van\nstofbron; afzuiging met\nHEPA-filtratie', 'Prioriteit 1'],
    ['Gesloten reactorsysteem', 'Alle chemische reacties\n(extractie, kristallisatie,\npH-aanpassing)', 'Geen open stof- of\nvloeistofcontact;\nperistaltische pompen', 'Prioriteit 1'],
    ['Gesloten filterunits (20 L)', 'Alle filtratiestappen', 'Geen open blootstelling\naan filterkoek of\nfiltraat', 'Prioriteit 1'],
    ['Vloeistofpompoverdracht\n(peristaltisch)', 'Alle vloeistoftransfers', 'Geen manueel gieten;\nminimaal lekriscio', 'Prioriteit 1'],
    ['Algemene ruimteventilatie', 'Laboratoriumruimte', 'Achtergrondverluchting;\nminimaal 6 luchtwisselingen/uur', 'Ondersteunend'],
]

add_table(doc,
    ['Maatregel', 'Toepassing', 'Werkingsmechanisme', 'Prioriteit'],
    tech_measures,
    col_widths=[3.5, 3.5, 4.5, 2]
)

doc.add_heading('2.4 Organisatorische maatregelen', level=2)

add_bullet(doc, 'Werkprotocollen: Alle werkzaamheden volgens schriftelijk goedgekeurde procedures')
add_bullet(doc, 'Blootstellingstijd: Minimaliseren van de tijd in de directe nabijheid van geopende ash')
add_bullet(doc, 'Werknemersrotatie: Bij herhaalde blootstelling wordt rotatie toegepast om individuele cumulatieve blootstelling te beperken')
add_bullet(doc, 'Toegangsbeperking: Alleen geautoriseerd en getraind personeel in het laboratorium')
add_bullet(doc, 'Chemisch register: Actueel register van alle gevaarlijke stoffen (PE-240-01, Registration Chemicals v2.1.0)')
add_bullet(doc, 'SDS-beschikbaarheid: Safety Data Sheets fysiek aanwezig bij opslaglocatie en digitaal beschikbaar')
add_bullet(doc, 'Blootstellingsregistratie: Conform Arbobesluit art. 4.15–4.19: namenlijst, registratie en sluitingsplicht voor werknemers blootgesteld aan CMR-stoffen')
add_bullet(doc, 'Training: Alle medewerkers volgen training "Chemical management" en "Exposure to hazardous chemicals"')

doc.add_heading('2.5 Persoonlijke beschermingsmiddelen (PBM-matrix)', level=2)
doc.add_paragraph(
    'Onderstaande PBM-matrix specificeert de vereiste bescherming per werkzaamheid, gebaseerd op de '
    'PBM-matrix van Phoenix Metals (PBM matrix Phoenix metals draft 1.xlsm) en de risicobeoordeling.'
)

pbm_matrix = [
    ['Ash handling\n(afweging, transfer)', 'Nitril handschoenen\n(Ansell Touch n Tuff\n92-500)', 'Veiligheidsbril\n(MSA breedbeeld)', 'FFP3 masker\n(Kelfort 1835C)', 'Labcoat\n(chemisch\nresistent)', 'Nitril + FFP3\n+ bril + coat'],
    ['Extractie\n(NaOH + ash, 80°C)', 'Chemisch resistente\nhandschoenen\n(Ansell Alphatec\n58-535B)', 'Gelaatsbescherming\n(Perforama vizier)', 'Niet vereist\n(gesloten systeem)', 'Chemisch resistent\nschort + mouwen', 'Alphatec +\nvizier + schort'],
    ['Filtratie', 'Nitril handschoenen\n(Ansell 92-500)', 'Veiligheidsbril', 'FFP3 bij open\nfilterkoek', 'Labcoat', 'Afhankelijk\nvan stap'],
    ['Ion exchange\n(zwavelzuur)', 'Chemisch resistente\nhandschoenen\n(Ansell Alphatec)', 'Gelaatsbescherming', 'Niet vereist', 'Chemisch resistent\nschort', 'Alphatec +\nvizier + schort'],
    ['Elektroreductie', 'Isolerende hand-\nschoenen\n(Electrovolt\nGLE 36)', 'Veiligheidsbril', 'Niet vereist', 'Labcoat', 'Isolerend +\nbril + coat'],
    ['Reiniging &\nonderhoud', 'Chemisch resistente\nhandschoenen', 'Gelaatsbescherming', 'FFP3 bij stof-\nresten', 'Chemisch resistent\nschort', 'Volledige set'],
]

add_table(doc,
    ['Werkzaamheid', 'Handen', 'Ogen/Gelaat', 'Ademhaling', 'Lichaam', 'Standaard PBM\nset'],
    pbm_matrix,
    col_widths=[2.8, 2.8, 2.5, 2.5, 2.5, 2.5]
)

doc.add_paragraph()
add_warning_box(doc, 'MINIMALE NORM: Bij alle werkzaamheden met ash of ash-houdende materialen zijn FFP3-adembescherming, veiligheidsbril, nitril handschoenen en labcoat VERPLICHT. Bij werk met zuren/basen: gelaatsbescherming + chemisch resistente handschoenen + schort.')

doc.add_page_break()

# ════════════════════════════════════════════════════════════════════
# H3: CMR-PROTOCOL
# ════════════════════════════════════════════════════════════════════
doc.add_heading('3. CMR-Protocol', level=1)

doc.add_heading('3.1 Wettelijk kader', level=2)
doc.add_paragraph(
    'De verwerking van CMR-stoffen (nikkeloxide Carc. 1A, vanadiumpentoxide Carc. 2) valt onder '
    'de wettelijke verplichtingen van het Arbobesluit, hoofdstuk 4, afdeling 2 (artikelen 4.15 tot en met 4.19). '
    'Deze artikelen verplichten de werkgever tot:'
)

add_bullet(doc, 'Art. 4.15: ', bold_prefix='')
p = doc.paragraphs[-1]
p.clear()
run = p.add_run('Art. 4.15 — Vervangingsplicht: ')
run.bold = True
p.add_run('De werkgever vervangt gevaarlijke stoffen door stoffen die niet of minder gevaarlijk zijn, indien dit redelijkerwijs mogelijk is. Zie §3.2 voor de substitutieanalyse.')

add_bullet(doc, '')
p = doc.paragraphs[-1]
p.clear()
run = p.add_run('Art. 4.16 — Namenlijst: ')
run.bold = True
p.add_run('De werkgever houdt een bijgewerkte namenlijst bij van werknemers die beroepsmatig zijn blootgesteld aan CMR-stoffen.')

add_bullet(doc, '')
p = doc.paragraphs[-1]
p.clear()
run = p.add_run('Art. 4.17 — Registratie: ')
run.bold = True
p.add_run('Per blootgestelde werknemer wordt een individueel blootstellingsdossier aangelegd met gegevens over de aard, duur en intensiteit van de blootstelling.')

add_bullet(doc, '')
p = doc.paragraphs[-1]
p.clear()
run = p.add_run('Art. 4.18 — Sluitingsplicht: ')
run.bold = True
p.add_run('Het blootstellingsdossier wordt bewaard gedurende 40 jaar na beëindiging van de blootstelling.')

add_bullet(doc, '')
p = doc.paragraphs[-1]
p.clear()
run = p.add_run('Art. 4.19 — Inzage: ')
run.bold = True
p.add_run('De werknemer heeft recht op inzage in zijn eigen blootstellingsdossier.')

doc.add_heading('3.2 Vervangingsplicht — Beoordeling', level=2)
doc.add_paragraph(
    'De vervangingsplicht (art. 4.15) vereist dat de werkgever onderzoekt of CMR-stoffen kunnen worden '
    'vermeden of vervangen. Voor Phoenix Metals geldt:'
)

add_bullet(doc, 'Nikkeloxide is een intrinsiek bestanddeel van de SARU-ash en kan niet worden gesubstitueerd — het is het doelproduct van de valorisatie')
add_bullet(doc, 'Vanadiumpentoxide (als natriummetavanaadaat) is eveneens een intrinsiek bestanddeel en het primaire extractieproduct')
add_bullet(doc, 'De stoffen worden niet als reagens toegevoegd maar zijn inherent aan de grondstof')
add_bullet(doc, 'Conclusie: Substitutie is technisch en economisch niet uitvoerbaar. De nadruk ligt op blootstellingsminimalisatie via technische en organisatorische maatregelen en PBM')

doc.add_heading('3.3 Werkinstructies voor omgang met CMR-houdende ash', level=2)

doc.add_heading('3.3.1 Algemene regels', level=3)
add_bullet(doc, 'Ash wordt uitsluitend verwerkt in de flow cabinet — geen open afweging of transfer buiten de trekkap')
add_bullet(doc, 'Maximale batchgrootte: 3,5 kg ash per bewerking')
add_bullet(doc, 'Alle medewerkers dragen de voorgeschreven PBM (zie §2.5) — geen uitzonderingen')
add_bullet(doc, 'Na afloop van ash-handelingen: handen wassen, PBM afdoen in afgesloten container')
add_bullet(doc, 'Afval met ash-resten wordt verzameld in afgesloten containers met CMR-etiket')

doc.add_heading('3.3.2 Specifieke werkplekinstructies', level=3)
add_bullet(doc, 'Voor aanvang: flow cabinet controleren (afzuiging actief, HEPA-filterstatus groen)')
add_bullet(doc, 'Ash-container uitsluitend openen binnen flow cabinet')
add_bullet(doc, 'Voorzichtige doseertechniek: geen stofwolk creëren, gebruik spatel/lepel')
add_bullet(doc, 'Bij overgieten naar reactor: via trechter, geen vrij vallende stroom')
add_bullet(doc, 'Na transfer: container direct sluiten, flow cabinet minimaal 10 minuten laten doorzuigen')
add_bullet(doc, 'Bij morsen: direct opruimen met vochtige doek (droog afvegen VERBODEN — stofverspreiding)')

doc.add_heading('3.4 Gezondheidssurveillance', level=2)
doc.add_paragraph(
    'Gezien de CMR-classificatie van de ash-bestanddelen is gezondheidssurveillance verplicht:'
)
add_bullet(doc, 'Pre-employmedisch onderzoek met longfunctietest en nikkel-sensibilisatietest')
add_bullet(doc, 'Periodiek gezondheidsonderzoek (PGO): jaarlijks, met aandacht voor longfunctie en huidafwijkingen')
add_bullet(doc, 'Biologische monitoring: optioneel nikkel-in-urine bepaling bij verhoogde blootstelling')
add_bullet(doc, 'Registratie van alle gezondheidsgegevens in het blootstellingsdossier (art. 4.17)')
add_bullet(doc, 'Bij gezondheidsklachten (luchtwegirritatie, huiduitslag): direct stopzetten werkzaamheden en medische evaluatie')

doc.add_page_break()

# ════════════════════════════════════════════════════════════════════
# H4: STRALINGSVEILIGHEID
# ════════════════════════════════════════════════════════════════════
doc.add_heading('4. Stralingsveiligheid', level=1)

doc.add_heading('4.1 Wettelijk kader', level=2)
doc.add_paragraph(
    'De aanwezigheid van van nature voorkomende radionucliden (NORM) in de SARU-ash valt onder het '
    'Besluit basisveiligheidsnormen stralingsbescherming (Bbs — BWBR0040179). De relevante artikelen zijn:'
)

add_bullet(doc, '')
p = doc.paragraphs[-1]
p.clear()
run = p.add_run('Art. 2.2 — Rechtvaardiging: ')
run.bold = True
p.add_run('Elke handeling met stralingsbronnen moet worden gerechtvaardigd. De verwerking van SARU-ash is gerechtvaardigd omdat: (a) het plaatsvindt onder gecontroleerde procesomstandigheden, (b) de radionucliden in de vaste fractie blijven na extractie, (c) het waardevolle kennis oplevert voor valorisatie van een reststroom.')

add_bullet(doc, '')
p = doc.paragraphs[-1]
p.clear()
run = p.add_run('Art. 3.17 — Vrijstelling: ')
run.bold = True
p.add_run('Voor operaties met tot 1.000 kg materiaal waarbij de activiteitsconcentratie de vrijstellingswaarden (Annex 3, Section B, Table B, column 2) niet overschrijdt, is afdeling 3.2 niet van toepassing. De verwerking van ≤60 kg ash valt hieronder.')

doc.add_heading('4.2 Vrijstellingswaarden en limieten', level=2)

exemption_data = [
    ['Pb-210', '10 Bq/g (kolom 2)', '1.000 Bq (kolom 3)', 'Beperkend: ≈3,5 kg ash'],
    ['Ra-228', '10 Bq/g (kolom 2)', '1.000 Bq (kolom 3)', 'Beperkend: ≈3,5 kg ash'],
    ['U-238 serie (totaal)', '1 Bq/g (kolom 2)', '1.000 Bq (kolom 3)', 'Vrijstellingswaarde gehaald'],
    ['Th-228', '1 Bq/g (kolom 2)', '1.000 Bq (kolom 3)', 'Vrijstellingswaarde gehaald'],
]

add_table(doc,
    ['Radionuclide', 'Vrijstellingswaarde\nconcentratie', 'Vrijstellingswaarde\ntotale activiteit', 'Toepassing op ash'],
    exemption_data,
    col_widths=[3, 3.5, 3.5, 3.5]
)

doc.add_paragraph()
add_warning_box(doc, 'De maximale batchgrootte is beperkt tot 3,5 kg ash, bepaald door de kolom 3 vrijstellingswaarden voor Pb-210 en Ra-228. Bij grotere batches is een vergunning of melding bij de ANVS vereist.')

doc.add_heading('4.3 RI&E stralingsverantwoording', level=2)
doc.add_paragraph(
    'De stralingsrisico\'s zijn opgenomen in de RI&E (Instrumenten RI&E, Phoenix Metals MKB). '
    'De rechtvaardiging wordt als volgt gemotiveerd:'
)
add_bullet(doc, 'De verwerking vindt plaats onder gecontroleerde omstandigheden (flow cabinet, gesloten systeem)')
add_bullet(doc, 'De radionucliden blijven predominant in de vaste fractie (filterkoek) na extractie')
add_bullet(doc, 'De operationele schaal is beperkt (≤60 kg totaal, 3,5 kg per batch)')
add_bullet(doc, 'De verwerking levert waardevolle kennis voor de valorisatie van een maatschappelijk relevante reststroom')
add_bullet(doc, 'Persoonlijke dosimetrie is niet vereist gezien de beperkte schaal en lage blootstellingsniveaus')

doc.add_heading('4.4 Afvoer van radioactief afval', level=2)
doc.add_paragraph(
    'De activiteitsconcentratie van de U-238 serie in de ash overschrijdt 1 kBq/kg, wat betekent dat '
    'de reguliere chemische afvalstroom niet zonder meer kan worden afgevoerd als normaal afval.'
)

add_bullet(doc, 'Vast afval (filterkoek, tissues met ash-resten): verzamelen in afgesloten gelabelde containers')
add_bullet(doc, 'Vloeibaar afval (ash-suspensies): verzamelen in jerrycans, gescheiden van regulier chemisch afval')
add_bullet(doc, 'ANVS-melding: Voor afvoer als radioactief afval is melding vereist bij de Autoriteit Nucleaire Veiligheid en Stralingsbescherming (ANVS)')
add_bullet(doc, 'Vrijgave: Artikel 3.20 (release) — de vrijgavewaarden uit Annex 3, Section B, Table A, Part 2 (voor van nature voorkomende radionucliden) zijn bepalend')
add_bullet(doc, 'Documentatie: Art. 4.2 — administratie van alle bronnen inclusief type, aard, locatie, wijze van toepassing en wijze van afvoer na beëindiging')

doc.add_heading('4.5 Administratieve verplichtingen', level=2)
add_bullet(doc, 'Bronregistratie: Alle batches ash worden geregistreerd met batchnummer, massa, datum van ontvangst en verwerking')
add_bullet(doc, 'Gammaspectrometrie: Testrapporten van de ash-analyse worden bewaard in het managementsysteem')
add_bullet(doc, 'Transactieregistratie: Alle mutaties (ontvangst, verwerking, afvoer) worden gedocumenteerd')
add_bullet(doc, 'Bewaartermijn: Conform Bbs — minimaal de duur van de vergunning/melding plus 10 jaar')

doc.add_page_break()

# ════════════════════════════════════════════════════════════════════
# H5: TAAK RISICO ANALYSE (TRA)
# ════════════════════════════════════════════════════════════════════
doc.add_heading('5. Taak Risico Analyse (TRA)', level=1)

doc.add_heading('5.1 TRA-procedure', level=2)
doc.add_paragraph(
    'Alle werkzaamheden aan de demonstrator vereisen een goedgekeurde TRA, conform procedure '
    'HS-P-0008 (Taak Risico Analyse). De TRA wordt opgesteld conform het volgende proces:'
)
add_bullet(doc, 'Bepalen behoefte aan TRA: minimaal 1 week voorafgaand aan de werkzaamheden (HS-F-0004 risicohulplijst)')
add_bullet(doc, 'TRA-bijeenkomst: met aanvrager werkvergunning, vergunninghouder, verstrekker en veiligheidskundige')
add_bullet(doc, 'Stap-voor-stap analyse: per taakstap worden risico\'s geïdentificeerd en beheersmaatregelen voorgesteld')
add_bullet(doc, 'Goedkeuring: door verstrekker werkvergunning en veiligheidskundige')
add_bullet(doc, 'Startwerkbespreking: voorafgaand aan uitvoering wordt de TRA doorgesproken met alle uitvoerders')
add_bullet(doc, 'Evaluatie: na afloop wordt de TRA geëvalueerd en zo nodig bijgewerkt')

doc.add_heading('5.2 TRA per werkzaamheid', level=2)

doc.add_heading('5.2.1 Ash handling (afweging, transfer, monsternames)', level=3)
tra_ash = [
    ['Ash container openen', 'Stofwolk — inademing\nCMR-stoffen, radionucliden', 'Flow cabinet,\nFFP3 masker', '2', '1', 'Laag'],
    ['Ash afwegen (3,5 kg)', 'Stof, morsen,\nCMR-blootstelling', 'Flow cabinet,\nvochtige techniek,\nPBM', '2', '1', 'Laag'],
    ['Transfer naar reactor', 'Stofverspreiding,\nmorsen', 'Trechter, flow cabinet,\ngesloten transfer', '2', '1', 'Laag'],
    ['Monstername', 'Contact met ash,\nCMR-blootstelling', 'Spatel, afgesloten\nmonsterfles, PBM', '2', '1', 'Laag'],
]
add_table(doc,
    ['Taakstap', 'Risico', 'Beheersmaatregel', 'Ernst\n(1-5)', 'Kans\n(1-5)', 'Restrisico'],
    tra_ash,
    col_widths=[3, 3.2, 3.2, 1.5, 1.5, 2]
)

doc.add_paragraph()

doc.add_heading('5.2.2 Chemische extractie (NaOH + ash, verhitting)', level=3)
tra_extraction = [
    ['NaOH-dosering', 'Corrosie (huid, ogen),\nspatten', 'Peristaltische pomp,\nPBM (Alphatec,\nvizier)', '4', '1', 'Laag'],
    ['Verhitting tot 80°C', 'Brandwonden,\ndampvorming', 'Gesloten reactor,\ntemperatuurbewaking', '3', '1', 'Laag'],
    ['Reactormenging', 'Drukopbouw,\nlekkage', 'Drukventilatie,\nregelmatige inspectie', '3', '1', 'Laag'],
]
add_table(doc,
    ['Taakstap', 'Risico', 'Beheersmaatregel', 'Ernst\n(1-5)', 'Kans\n(1-5)', 'Restrisico'],
    tra_extraction,
    col_widths=[3, 3.2, 3.2, 1.5, 1.5, 2]
)

doc.add_paragraph()

doc.add_heading('5.2.3 Filtratie', level=3)
tra_filtration = [
    ['Filterunit vullen', 'Contact met residu\n(CMR, zware metalen)', 'Gesloten systeem,\nPBM', '3', '1', 'Laag'],
    ['Filterkoek verwijderen', 'Stof (CMR),\ndermaal contact', 'Bevochtigen koek,\nFFP3, handschoenen', '3', '1', 'Laag'],
    ['Filtraat opvangen', 'Chemisch contact,\nmorsen', 'Gesloten jerrycans,\nPBM', '2', '1', 'Laag'],
]
add_table(doc,
    ['Taakstap', 'Risico', 'Beheersmaatregel', 'Ernst\n(1-5)', 'Kans\n(1-5)', 'Restrisico'],
    tra_filtration,
    col_widths=[3, 3.2, 3.2, 1.5, 1.5, 2]
)

doc.add_paragraph()

doc.add_heading('5.2.4 Ion exchange en elektroreductie', level=3)
tra_ionex = [
    ['Zwavelzuur dosering', 'Corrosie (ernstig),\nzuurdamp', 'Peristaltische pomp,\nPBM, ventilatie', '4', '1', 'Laag'],
    ['Kolom regeneratie', 'Zuurcontact,\ndrukopbouw', 'Gesloten kolom,\nPBM', '3', '1', 'Laag'],
    ['Elektroreductie', 'Elektrisch risico,\nzure oplossing', 'Isolatie, aarding,\nPBM', '3', '1', 'Laag'],
]
add_table(doc,
    ['Taakstap', 'Risico', 'Beheersmaatregel', 'Ernst\n(1-5)', 'Kans\n(1-5)', 'Restrisico'],
    tra_ionex,
    col_widths=[3, 3.2, 3.2, 1.5, 1.5, 2]
)

doc.add_heading('5.3 LMRA — Laatste Minuut Risico Analyse', level=2)
doc.add_paragraph(
    'Voorafgaand aan elke werksessie voert de uitvoerder een LMRA uit (conform HS-P-0009). '
    'De LMRA omvat de volgende checklist:'
)

lmra_items = [
    'Zijn de werkplek en gereedschappen schoon en in goede staat?',
    'Is de flow cabinet operationeel (afzuiging actief, filterstatus OK)?',
    'Zijn de juiste PBM\'s beschikbaar en gedragen?',
    'Is de TRA voor deze werkzaamheden goedgekeurd en doorgesproken?',
    'Zijn alle reagentia correct gelabeld en SDS beschikbaar?',
    'Zijn afvalcontainers beschikbaar en correct gelabeld?',
    'Is de BHV-post bereikbaar en is een BHV\'er aanwezig?',
    'Zijn er afwijkingen ten opzichte van de normale situatie (weersomstandigheden, lekkages, defecten)?',
    'Zijn alle medewerkers op de hoogte van de noodprocedure?',
    'Is er voldoende verlichting en ventilatie?',
]

for item in lmra_items:
    add_bullet(doc, item)

add_warning_box(doc, 'Bij één of meer "nee" op bovenstaande vragen: werkzaamheden NIET starten. Neem contact op met de werkplekbeheerder of veiligheidskundige.')

doc.add_heading('5.4 TRA-hulplijst', level=2)
doc.add_paragraph(
    'De TRA-hulplijst (HS-F-0003) wordt gebruikt bij het opstellen van elke TRA. De hulplijst bevat '
    'categorieën voor:'
)
add_bullet(doc, 'Mechanische risico\'s (snijden, beknelling, vallende objecten)')
add_bullet(doc, 'Chemische risico\'s (blootstelling, reacties, brandbaarheid)')
add_bullet(doc, 'Fysieke risico\'s (lawaai, trillingen, straling, hitte/koude)')
add_bullet(doc, 'Ergonomische risico\'s (tillen, repeterende bewegingen)')
add_bullet(doc, 'Elektrische risico\'s (spanning, kortsluiting, statische elektriciteit)')
add_bullet(doc, 'Omgevingsrisico\'s (weer, derden, verkeer)')

doc.add_page_break()

# ════════════════════════════════════════════════════════════════════
# H6: NOODPLAN & CALAMITEITEN
# ════════════════════════════════════════════════════════════════════
doc.add_heading('6. Noodplan & Calamiteiten', level=1)

doc.add_paragraph(
    'Dit hoofdstuk beschrijft de calamiteitenprocedures voor de demonstratorinstallatie, als aanvulling '
    'op het Bedrijfsnoodplan (BNP) van Phoenix Metals (PM-BNP-V1) en het BNP van Plant One Rotterdam.'
)

doc.add_heading('6.1 Eerste hulp bij blootstelling', level=2)

doc.add_heading('6.1.1 Huidcontact', level=3)
add_bullet(doc, 'Ash (CMR): besmette kleding uittrekken, huid uitgebreid wassen met water en zeep (minimaal 15 minuten)')
add_bullet(doc, 'NaOH 50%: besmette kleding direct verwijderen, huid spoelen met ruim water (minimaal 20 minuten). GEEN zuren gebruiken voor neutralisatie')
add_bullet(doc, 'H₂SO₄ (25–75%): kleding verwijderen, huid overvloedig spoelen met water (minimaal 20 minuten)')
add_warning_box(doc, 'Na huidcontact altijd medische evaluatie, zeker bij CMR-blootstelling. Blootstelling registreren in blootstellingsdossier.')

doc.add_heading('6.1.2 Oogcontact', level=3)
add_bullet(doc, 'Onmiddellijk ogen spoelen met water (minimaal 15 minuten, bij voorkeur met oogdouche)')
add_bullet(doc, 'Contactlenzen verwijderen indien aanwezig en gemakkelijk te bereiken')
add_bullet(doc, 'Niet wrijven')
add_bullet(doc, 'Direct medische hulp inschakelen — bij zuur/base-contact altijd oogarts consulteren')

doc.add_heading('6.1.3 Inademing', level=3)
add_bullet(doc, 'Slachtoffer naar frisse lucht brengen')
add_bullet(doc, 'Bewusteloos: in stabiele zijligging, ademhaling controleren')
add_bullet(doc, 'Bij ademhalingsproblemen: zuurstof toedienen, 112 bellen')
add_bullet(doc, 'Bij inademing van CMR-stoffen: altijd medische evaluatie, longfunctie controleren')

doc.add_heading('6.1.4 Inslikken', level=3)
add_bullet(doc, 'Mond spoelen met water (niet inslikken)')
add_bullet(doc, 'NIET braken opwekken — vooral niet bij corrosieve stoffen (NaOH, H₂SO₄)')
add_bullet(doc, 'Direct medische hulp inschakelen (112)')
add_bullet(doc, 'SDS van de betreffende stof meenemen naar arts')

doc.add_heading('6.2 Lekkageprocedure', level=2)

doc.add_heading('6.2.1 Ash-lekkage (droog)', level=3)
add_bullet(doc, '1. Werkzaamheden direct stoppen')
add_bullet(doc, '2. Flow cabinet actief laten (indien van toepassing)')
add_bullet(doc, '3. PBM aantrekken: FFP3, handschoenen, veiligheidsbril')
add_bullet(doc, '4. Gemorste ash voorzichtig opnemen met vochtige doek — NIET droog vegen (stofverspreiding)')
add_bullet(doc, '5. Afval in afgesloten CMR-container deponeren')
add_bullet(doc, '6. Oppervlak nat navenigen en drogen')
add_bullet(doc, '7. Incident rapporteren aan veiligheidskundige')

doc.add_heading('6.2.2 Vloeistof-lekkage (zuur/base)', level=3)
add_bullet(doc, '1. Werkzaamheden direct stoppen')
add_bullet(doc, '2. Bron identificeren — NIET direct benaderen bij onbekende stof')
add_bullet(doc, '3. PBM aantrekken: chemisch resistente handschoenen, gelaatsbescherming, schort')
add_bullet(doc, '4. Klein lekkage: absorptiemateriaal (chemisch bindmiddel) aanbrengen')
add_bullet(doc, '5. Groot lekkage: ruimte ontruimen, BHV alarmeren')
add_bullet(doc, '6. Na neutralisatie: afval in geschikte container (EURAL-code 060101/060204)')

doc.add_heading('6.3 Brandbestrijding', level=2)
doc.add_paragraph(
    'De demonstrator bevat brandbare en reactieve stoffen. De brandbestrijding is afgestemd op de '
    'aanwezige stoffen:'
)

fire_data = [
    ['Ash (droog, niet-brandbaar)', 'Niet brandbaar', 'Geen blus vereist;\nstofvrij houden', 'Geen waterstraal\n(opstuiving CMR-stof)'],
    ['NaOH 50%', 'Niet brandbaar\n(sterk corrosief)', 'CO₂, zand, droge\nchemisch schuim', '⚠️ GEEN WATER\n(exotherme reactie,\nspatten)'],
    ['H₂SO₄ 25–75%', 'Niet brandbaar\n(corrosief)', 'CO₂, zand, droge\nchemisch schuim', 'Geen waterstraal\n(reactie, spatten)'],
    ['Aluminiumsulfaat', 'Niet brandbaar', 'Conform algemeen\nbrandplan', 'Geen restricties'],
    ['Elektrische installatie', 'Kortsluiting,\noververhitting', 'CO₂, poeder', 'Spanningloos maken\nvooraf'],
]

add_table(doc,
    ['Stof/bron', 'Brandgevaar', 'Blusmiddel', 'Aandachtspunten'],
    fire_data,
    col_widths=[3.5, 3, 3.5, 3.5]
)

doc.add_paragraph()
add_warning_box(doc, 'NOOIT water gebruiken op NaOH-concentraat — exotherme reactie veroorzaakt spatten van corrosieve vloeistof. Bij brand in de buurt van ash: voorkom dat bluswater in contact komt met ash (stofverspreiding + CMR-blootstelling).')

doc.add_heading('6.4 Evacuatieprocedure', level=2)
doc.add_paragraph(
    'De evacuatieprocedure is conform het BNP van Phoenix Metals en Plant One Rotterdam:'
)

add_bullet(doc, 'Alarm: via handbrandmelder of mondeling alarm "EVACUEREN"')
add_bullet(doc, 'BHV alarmeren: via portofoon of mobiele telefoon')
add_bullet(doc, 'Werkzaamheden veilig stilleggen: reactoren sluiten, pompen stoppen, gas/spanning afsluiten indien veilig')
add_bullet(doc, 'Verzamelpunt: conform BNP — verzamelpunt bij hoofdgebouw Plant One')
add_bullet(doc, 'Ontruimingsleider controleert of alle personen zijn geëvacueerd (naamlijst)')
add_bullet(doc, 'BHV\'er verleent eerste hulp aan eventuele slachtoffers')
add_bullet(doc, 'Externe hulpdiensten: 112 bellen bij brand, letsel of milieu-incident')
add_bullet(doc, 'Herbetreding: uitsluitend na toestemming van BHV-leider of externe hulpdiensten')

doc.add_heading('6.5 Contacten bij calamiteiten', level=2)

contacts = [
    ['BHV interne dienst', 'Via portofoon / BHV-post', 'Direct'],
    ['Noodnummer Plant One', 'Conform BNP Plant One', 'Direct'],
    ['112 (brand, letsel, milieu)', '112', 'Direct bij urgent gevaar'],
    ['ANVS (straling-incident)', '070-349 2500', 'Binnen 24 uur'],
    ['Regionale vergiftigingeninfo', '030-274 8888', 'Bij blootstelling'],
    ['Milieuzorg (lekkage bodem/water)', 'Conform BNP Plant One', 'Binnen 1 uur'],
]

add_table(doc,
    ['Functie', 'Contact', 'Reactietijd'],
    contacts,
    col_widths=[5, 4, 3]
)

doc.add_page_break()

# ════════════════════════════════════════════════════════════════════
# BRONVERWIJZINGEN
# ════════════════════════════════════════════════════════════════════
doc.add_heading('7. Bronverwijzingen', level=1)

doc.add_heading('7.1 Wet- en regelgeving', level=2)
refs_law = [
    ['Arbowet', 'Wet van 9 oktober 2007, houdende regels in het belang van de veiligheid, de gezondheid en het welzijn in verband met de arbeid'],
    ['Arbobesluit art. 4.1–4.19', 'Besluit van 15 januari 1997 — Gevaarlijke stoffen'],
    ['REACH-verordening', 'Verordening (EG) nr. 1907/2006 betreffende de registratie, evaluatie, autorisatie en beperking van chemische stoffen'],
    ['CLP-verordening', 'Verordening (EG) nr. 1272/2008 betreffende de indeling, etikettering en verpakking van stoffen en mengsels'],
    ['Bbs', 'Besluit basisveiligheidsnormen stralingsbescherming — BWBR0040179'],
]
add_table(doc, ['Bron', 'Omschrijving'], refs_law, col_widths=[4, 10])

doc.add_heading('7.2 Bronnen Phoenix Metals', level=2)
refs_pm = [
    ['[1]', 'Fact sheet Ash 2025 — LM van Langen, v1.0 (nov 2024)'],
    ['[2]', 'Registration Chemicals MASTER v2.1.0 — Phoenix Metals (nov 2024)'],
    ['[3]', 'PBM matrix Phoenix metals draft 1 — Phoenix Metals'],
    ['[4]', 'SDS Sulfuric acid 75% — RCI Labscan (jul 2021)'],
    ['[5]', 'SDS Sodium hydroxide 50% — Millipore (jul 2024)'],
    ['[6]', 'Phoenix Metals HSE Policy V1 — Stijn van Zelst (jan 2025)'],
    ['[7]', 'PE-240-01 Aanvraag, beoordeling en goedkeuring van gevaarlijke stoffen — V1'],
    ['[8]', 'Rapportage verdiepende RI&E Gevaarlijke stoffen 2021 — GPS-A V3.0'],
    ['[9]', 'HS-P-0008 Taak Risico Analyse — Plant One Rotterdam'],
    ['[10]', 'HS-P-0009 Laatste Minuut Risico Analyse — Plant One Rotterdam'],
    ['[11]', 'HS-F-0003 TRA met hulplijst — Plant One Rotterdam'],
    ['[12]', 'Phoenix Metals BNP V1 — Bedrijfsnoodplan'],
    ['[13]', 'Demo Process VR — Procesbeschrijving demonstrator'],
    ['[14]', 'Overzicht Relatie BRZO elementen en VBS — Phoenix Metals'],
    ['[15]', 'Legal compliance Phoenix Metals 2025'],
    ['[16]', 'RI&E Inventarisatie Phoenix Metals MKB'],
    ['[17]', 'Gammaspectrometrie testrapport SARU ash'],
]
add_table(doc, ['Ref', 'Document'], refs_pm, col_widths=[1.5, 12.5])

doc.add_heading('7.3 AI-bladen en richtlijnen', level=2)
refs_ai = [
    ['AI-blad 14', 'Gevaarlijke stoffen'],
    ['AI-blad 23', 'Kankerverwekkende stoffen'],
    ['AI-blad 24', 'Preventieve maatregelen: kankerverwekkende stoffen'],
    ['SER MAC-waarden', 'Gezondheidswaardige arbeidsomstandigheden — MAC-waarden'],
    ['Stoffenmanager®', 'Premium pakket — risicobeoordeling gevaarlijke stoffen'],
]
add_table(doc, ['Bron', 'Omschrijving'], refs_ai, col_widths=[4, 10])

# ── Versiebeheer footer ────────────────────────────────────────────
doc.add_page_break()
doc.add_heading('Versiebeheer', level=1)

versions = [
    ['v1.0', '2025', 'Eerste opzet HSEQ Framework D2'],
    ['v2.0', '2025', 'Uitbreiding met stralingsveiligheid en uitgebreide PBM-matrix'],
    ['v3.0', '2025', 'Integratie TRA-procedures en BNP-referenties'],
    ['v4.0', datetime.date.today().strftime('%Y-%m-%d'), 'Volledige herschrijving: integrale risico-inventarisatie, CMR-protocol, uitgebreide TRA per werkzaamheid, stralingsveiligheid en calamiteitenprocedures'],
]
add_table(doc, ['Versie', 'Datum', 'Wijzigingen'], versions, col_widths=[2, 3, 9])

# ── Save ───────────────────────────────────────────────────────────
output_dir = '/root/projects/jg/2026-reach-phoenix-metals/deliverables/docx'
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, 'REACH_VeiligWerken_HSEQ_Framework_Phoenix_Metals_D2_v4.0.docx')
doc.save(output_path)
print(f'✅ Document gegenereerd: {output_path}')
