#!/usr/bin/env python3
"""
Update D1 Kennisdossier v4.0 → v5.0
PGS 15 Pilot Plant Slag Chemicals - 20 stoffen
"""
import copy
from docx import Document
from docx.oxml.ns import qn
from lxml import etree

SRC = '/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx/PGS15_Kennisdossier_Phoenix_Metals_D1_v4.0.docx'
DST = '/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx/PGS15_Kennisdossier_Phoenix_Metals_D1_v5.0.docx'

doc = Document(SRC)

# ── Helpers ──
def set_cell(table, row_idx, col_idx, text):
    cell = table.rows[row_idx].cells[col_idx]
    # Keep first paragraph formatting
    p = cell.paragraphs[0]
    if p.runs:
        font_name = p.runs[0].font.name
        font_size = p.runs[0].font.size
        font_bold = p.runs[0].font.bold
    else:
        font_name = font_size = font_bold = None
    # Clear paragraphs (keep only first)
    for i in range(len(cell.paragraphs)-1, 0, -1):
        cell.paragraphs[i]._element.getparent().remove(cell.paragraphs[i]._element)
    p.clear()
    run = p.add_run(str(text))
    if font_name:
        run.font.name = font_name
    if font_size:
        run.font.size = font_size
    if font_bold is not None:
        run.font.bold = font_bold

def clear_data_rows(table):
    """Remove all rows except header (row 0)."""
    rows = table.rows
    while len(rows) > 1:
        rows[-1]._element.getparent().remove(rows[-1]._element)

def add_data_rows(table, data_rows, fmt_row=1):
    """Add rows to table. fmt_row is the row index to copy formatting from."""
    if fmt_row >= len(table.rows):
        fmt_row = 0
    template = table.rows[fmt_row]._element
    for texts in data_rows:
        new_tr = copy.deepcopy(template)
        table._element.append(new_tr)
        row_idx = len(table.rows) - 1
        for col, text in enumerate(texts):
            set_cell(table, row_idx, col, str(text))

def replace_table_data(table, data_rows, fmt_row=1):
    """Clear existing data rows and add new ones."""
    clear_data_rows(table)
    add_data_rows(table, data_rows, fmt_row)

def replace_paragraph_text(p, new_text):
    """Replace all text in a paragraph while keeping style."""
    if not p.runs:
        p.add_run(new_text)
        return
    # Keep first run, delete rest
    for i in range(len(p.runs)-1, 0, -1):
        p.runs[i]._element.getparent().remove(p.runs[i]._element)
    p.runs[0].text = new_text

# ═══════════════════════════════════════════════════════════════
# 1. DOCUMENT HEADER TABLE (Table 0)
# ═══════════════════════════════════════════════════════════════
set_cell(doc.tables[0], 3, 1, '5.0')
set_cell(doc.tables[0], 4, 1, '6 mei 2026')

# ═══════════════════════════════════════════════════════════════
# 2. VERSIEHISTORIE (Table 1)
# ═══════════════════════════════════════════════════════════════
add_data_rows(doc.tables[1], [['5.0', '06-05-2026',
    'Update naar 20 stoffen (slag chemicals pilot plant); correcties NaVO₃ H341, NaAlO₂ H290+ADR PG II, elektrolyt H411; ADR 5.1/6.1/8; CMR V₂O₅',
    'JvG']])

# ═══════════════════════════════════════════════════════════════
# 3. COVER PAGE
# ═══════════════════════════════════════════════════════════════
for p in doc.paragraphs:
    for r in p.runs:
        if 'Versie 4.0 — 19 april 2026' in r.text:
            r.text = r.text.replace('Versie 4.0 — 19 april 2026', 'Versie 5.0 — 6 mei 2026')

# ═══════════════════════════════════════════════════════════════
# 4. TEXT REPLACEMENTS — Management & Sections
# ═══════════════════════════════════════════════════════════════
TEXT_REPLACEMENTS = {
    'Dit kennisdossier beschrijft de toepassing van PGS 15:2025 (versie 1.0, januari 2025) op de opslag van gevaarlijke stoffen bij Phoenix Metals B.V., gevestigd op het PlantOne-terrein in Rotterdam Europoort. Het dossier omvat de volledige inventaris van 20 stoffen die in de pilot plant voor staalslakverwerking worden gebruikt: 5 input chemicals, 5 intermediairen en 10 eindproducten [1][2].': None,
    'De opgeslagen stoffen bestaan uit feedstock-chemicaliën (NaOH 50%, H₂SO₄ in diverse concentraties, aluminiumsulfaat, calciumoxide), SARU-ash (invoermateriaal) en vanadium-elektrolyt (eindproduct).': 'De opgeslagen stoffen omvatten 5 input chemicals (zwavelzuur 25%, waterstofperoxide 30%, natriumpersulfaat, zoutzuur 20%, steelmaking slag), 5 intermediairen (natriummetavanadaat, trinatriumorthovanadaat, calciumsulfaat/silica, natriumsulfaat, filter cake) en 10 eindproducten (V₂O₅, vanadium-elektrolyt, NaAlO₂-oplossing, Ca(OH)₂, MnO₂, Na₃PO₄, Fe₂O₃, silica, Mg(OH)₂, NaVO₃-oplossing). ADR-klassen: 5.1, 6.1 en 8 [1][3].',
    'Phoenix Metals slaat gevaarlijke stoffen op (NaOH, H₂SO₄, vanadiumverbindingen) die vallen binnen het toepassingsgebied van PGS 15.': 'Phoenix Metals slaat gevaarlijke stoffen op (H₂SO₄, HCl, H₂O₂, natriumpersulfaat, natriumaluminaat, vanadiumverbindingen) in ADR-klassen 5.1, 6.1 en 8 die vallen binnen het toepassingsgebied van PGS 15.',
    'SARU-ash (Soot Ash Removal Unit reststroom) is het invoermateriaal voor het vanadiumextractieproces. Het betreft een mengsel uit ruwie-olieraffinage met vanadium als hoofdbestanddeel.': 'Steelmaking slag (ladle slag, poeder, CAS 65996-71-6) is het invoermateriaal voor het vanadiumextractieproces. Het betreft een mengsel van Fe-oxiden, silicaten, SiO₂, MgO, MnO, CaO en P₂O₅ uit staalproductie. H-codes: H315, H318, H335, H372. GHS: GHS05, GHS07, GHS08. ADR: niet gereguleerd [1][4].',
    'Het eindproduct is een V(III/V⁴⁺) gemengde vanadium-elektrolyt, geschikt voor gebruik in vanadium-redoxflowbatterijen (VRFB). De elektrolyt bevat vanadiumionen in diverse oxidatietoestanden opgelost in een zwavelzuurmilieu.': 'De pilot plant produceert 10 eindproducten. Hoofdproducten: vanadiumpentoxide (V₂O₅, CAS 1314-62-1, ADR 6.1/PG III, Carc. 1B) en vanadium-elektrolyt (multi-CAS, ADR 8/PG II, Repr. 2). Nevenproducten: calciumhydroxide, silica, ijzeroxide, mangaan(IV)oxide, magnesiumhydroxide, natriumaluminaat-oplossing (ADR 8/PG II), natriumfosfaat en natriummetavanadaat-oplossing (ADR 6.1/PG III, Muta. 2, Repr. 2) [1][4].',
    'De totale opgeslagen hoeveelheid in de demo-fase bedraagt circa 300 L vloeistof en 60 kg ash. Hiermee blijft Phoenix Metals ruim onder de grenswaarden voor verhoogde veiligheidsniveaus.': 'De totale opgeslagen hoeveelheid in de demo-fase bedraagt circa 200 L vloeistof en 60 kg steelmaking slag. Hiermee blijft Phoenix Metals ruim onder de grenswaarden voor verhoogde veiligheidsniveaus (2.500 kg per ADR-klasse).',
    'NaOH 50% en H₂SO₄ (25/50/75%) zijn ingedeeld als ADR-klasse 8, verpakkingsgroep II. Deze stoffen zijn onbrandbaar en niet brandonderhoudend.': 'ADR-geclassificeerde stoffen: H₂SO₄ 25% (ADR 8/PG II), HCl 20% (ADR 8/PG II), NaAlO₂-oplossing (ADR 8/PG II), V-elektrolyt (ADR 8/PG II), H₂O₂ 30% (ADR 5.1(8)/PG II), Na₂S₂O₈ (ADR 5.1/PG III), NaVO₃-oplossing (ADR 6.1/PG III), V₂O₅ (ADR 6.1/PG III).',
    'Vanadiumoplossingen (UN 3082, classificatiecode M6/M7) vallen onder ADR-klasse 9. Onbrandbare/niet brandonderhoudende ADR-9 stoffen vereisen eveneens alleen basisveiligheidsniveau.': 'ADR-klasse 5.1 (oxiderend): H₂O₂ 30% en Na₂S₂O₈ vereisen gescheiden opslag van brandbare materialen. ADR-klasse 6.1 (toxisch): NaVO₃ en V₂O₅ vereisen specifieke PBM\'s en ventilatie. ADR-klasse 8 (bijtend): H₂SO₄, HCl, NaAlO₂ en V-elektrolyt vereisen zuur/base scheiding.',
    'SARU-ash bevat nikkeloxide (NiO), verdacht van kankerverwekkendheid (CMR-categorie 2). PGS 15:2025 kent specifieke eisen voor CMR-stoffen. De totale hoeveelheid CMR-houdend materiaal bedraagt <6 kg in ash, ruim onder relevante drempels.': 'V₂O₅ (CAS 1314-62-1) is geclassificeerd als Carc. 1B (H350), Muta. 2 (H341), Repr. 2 (H361fd), Lact. (H362). NaVO₃-oplossing is Muta. 2 (H341), Repr. 2 (H361fd). Vanadium-elektrolyt is Repr. 2 (H361). PGS 15:2025 vereist specifieke CMR-maatregelen voor categorie 1A/1B-stoffen. De totale hoeveelheid V₂O₅ in de demo-fase bedraagt <1 kg.',
    'KRITIEKE SCHEIDINGSEIS: H₂SO₄ (zuur) en NaOH (base) vormen een onverenigbare combinatie binnen ADR-klasse 8. Bij gelijktijdig vrijkomen ontstaat een sterke exotherme reactie.': 'KRITIEKE SCHEIDINGSEISEN: (1) Zuren (H₂SO₄, HCl) en basen (NaAlO₂-oplossing) vormen onverenigbare combinaties — exotherme neutralisatiereactie. (2) Oxiderende stoffen (H₂O₂, Na₂S₂O₈) moeten gescheiden worden van brandbare/reducerende materialen. (3) V₂O₅ en NaVO₃ (ADR 6.1) moeten gescheiden worden van voedsel/voedingsmiddelen.',
    'SARU-ash bevat nikkeloxide (CMR-categorie 2). Bij opslag van CMR-houdende stoffen gelden de volgende aanvullende eisen:': 'V₂O₅ (Carc. 1B, Muta. 2, Repr. 2), NaVO₃-oplossing (Muta. 2, Repr. 2) en vanadium-elektrolyt (Repr. 2) zijn CMR-geclassificeerd. Bij opslag van CMR-stoffen gelden de volgende aanvullende eisen:',
    'In de demo-fase worden alle vloeistoffen opgeslagen in jerrycans (10L en 25L) op een rack in het lab. Dit is toegestaan onder PGS 15:2025 mits:': 'In de demo-fase worden vloeistoffen opgeslagen in jerrycans (10L en 25L) en vaste stoffen in canisters/big bags op een rack in het lab. Dit is toegestaan onder PGS 15:2025 mits:',
}

# For each paragraph, check if any key text matches
for p in doc.paragraphs:
    if not p.runs:
        continue
    full_text = p.text
    for old_text, new_text in TEXT_REPLACEMENTS.items():
        if new_text is None:
            continue  # skip marker
        # Check if the old_text start is in the paragraph
        if old_text[:60] in full_text:
            replace_paragraph_text(p, new_text)
            break

# Bullet updates
BULLET_UPDATES = [
    ('Veiligheidsniveau: Basisveiligheidsniveau volstaat',
     'Veiligheidsniveau: Basisveiligheidsniveau volstaat voor de demo-fase. De 8 ADR-stoffen vallen in klassen 5.1 (H₂O₂ 30%, Na₂S₂O₈), 6.1 (NaVO₃, V₂O₅) en 8 (H₂SO₄ 25%, HCl 20%, NaAlO₂, V-elektrolyt). Alle hoeveelheden <2.500 kg per klasse.'),
    ('Scheidingseis: H₂SO₄ (zuur) en NaOH (base) vormen een onverenigbare combinatie',
     'Scheidingseis: Zuren (H₂SO₄, HCl) en basen (NaAlO₂) zijn onverenigbaar. Oxiderende stoffen (H₂O₂, Na₂S₂O₈) gescheiden van brandbaren. V₂O₅/NaVO₃ gescheiden van voedsel.'),
    ('Wbdbo: Geen Wbdbo-eis bij dedicated opslag van onbrandbare ADR-8 VG II/III stoffen.',
     'Wbdbo: Geen Wbdbo-eis bij dedicated opslag van onbrandbare ADR-stoffen (klassen 5.1, 6.1, 8) in de demo-fase.'),
    ('Opvangcapaciteit: 110% van de grootste verpakking of 10% van de totale inhoud',
     'Opvangcapaciteit: 110% grootste verpakking óf 10% totaal. Voor H411-stoffen (V₂O₅, NaVO₃, elektrolyt) extra aandacht voor milieuzorg.'),
    ('Straling: SARU-ash bevat van nature voorkomende radionucliden',
     'CMR: V₂O₅ = Carc. 1B (H350), Muta. 2 (H341), Repr. 2 (H361fd); NaVO₃ = Muta. 2, Repr. 2; elektrolyt = Repr. 2. Milieugevaar: H411-stoffen (V₂O₅, NaVO₃, elektrolyt) vereisen milieuzorgmaatregelen.'),
]

for p in doc.paragraphs:
    if p.style.name != 'List Bullet':
        continue
    full = p.text
    for prefix, replacement in BULLET_UPDATES:
        if full.startswith(prefix[:40]):
            replace_paragraph_text(p, replacement)
            break

# Heading updates
for p in doc.paragraphs:
    if p.style.name == 'Heading 2':
        if '2.2 SARU-ash' in p.text:
            replace_paragraph_text(p, '2.2 Steelmaking Slag (invoermateriaal)')
        elif '2.3 Eindproduct: vanadium-elektrolyt' in p.text:
            replace_paragraph_text(p, '2.3 Eindproducten (10 stoffen)')
        elif '2.4 Reststromen' in p.text:
            replace_paragraph_text(p, '2.4 Intermediairen (5 stoffen)')
    elif p.style.name == 'Heading 3':
        if '3.2.1 ADR-klasse 8' in p.text:
            replace_paragraph_text(p, '3.2.1 ADR-klassen 5.1, 6.1 en 8')
        elif '3.2.2 ADR-klasse 9' in p.text:
            replace_paragraph_text(p, '3.2.2 ADR-klasse 5.1 — Oxiderende stoffen')
        elif '3.2.3 CMR-houdende stoffen (SARU-ash' in p.text:
            replace_paragraph_text(p, '3.2.3 CMR-stoffen (V₂O₅, NaVO₃, elektrolyt)')

# List bullet in §1.5
for p in doc.paragraphs:
    if p.style.name == 'List Bullet':
        if 'De stoffen zijn ingedeeld als ADR-klasse 8 (bijtend) en ADR-klasse 9' in p.text:
            replace_paragraph_text(p, 'De stoffen zijn ingedeeld in ADR-klassen 5.1 (oxiderend), 6.1 (toxisch) en 8 (bijtend).')
        elif 'Het bedrijf meer dan de ondergrens aan gevaarlijke stoffen opslaat (ADR-klasse 8, ondergrens 250 kg)' in p.text:
            replace_paragraph_text(p, 'Het bedrijf meer dan de ondergrens aan gevaarlijke stoffen opslaat (ADR-klassen 5.1, 6.1, 8; ondergrens 250 kg per klasse).')
        elif 'Maximale totale ash-verwerking' in p.text:
            replace_paragraph_text(p, 'Maximale totale slag-verwerking: ≤60 kg')

# §3.2.2 text — already handled above
# §3.3
for p in doc.paragraphs:
    if p.style.name == 'Normal' and 'Demo-fase: Alle opgeslagen stoffen vallen onder basisveiligheidsniveau' in p.text:
        replace_paragraph_text(p, 'Demo-fase: Alle opgeslagen stoffen vallen onder basisveiligheidsniveau. De totale hoeveelheid per ADR-klasse blijft ruim onder de 2.500 kg-grens. Dedicated opslag van onbrandbare stoffen verlaagt het vereiste niveau. ADR-klassen 5.1, 6.1 en 8 vereisen allen basisniveau bij <2.500 kg onbrandbare stoffen per klasse.')

# §4.3 bullets
for p in doc.paragraphs:
    if p.style.name == 'List Bullet':
        if 'Materialen opvangvoorziening: Moet bestand zijn tegen de bijtende stof' in p.text:
            replace_paragraph_text(p, 'Materialen opvangvoorziening: Bestand tegen bijtende stof. Geen onbeschermde metalen bij H₂SO₄. PP-gelined of kunststof bakken. Voor H411-stoffen: extra opvangmilieuzorg.')
        elif 'Neutralisatiemiddelen: Beschikbaar bij opslag. Voor H₂SO₄: natriumcarbonaat' in p.text:
            replace_paragraph_text(p, 'Neutralisatiemiddelen: Voor zuren — natriumcarbonaat (soda). Voor basen (NaAlO₂) — citroenzuur of verdunde azijnzuuroplossing. Bij H₂O₂: reducerend middel (natriumthiosulfaat).')

# §4.4 CMR bullets
for p in doc.paragraphs:
    if p.style.name == 'List Bullet':
        if 'Gesloten opslag (stofvrij) — ash mag niet verstuiven' in p.text:
            replace_paragraph_text(p, 'Gesloten opslag (stofvrij) — V₂O₅-poeder mag niet verstuiven;NaVO₃-oplossing in gesloten jerrycans')
        elif 'Specifieke PBM\'s: FFP3-masker bij hantering' in p.text:
            replace_paragraph_text(p, 'Specifieke PBM\'s: FFP3-masker bij V₂O₃-poederhantering, zuurbestendige handschoenen bij elektrolyt, FFP2 bij NaVO₃-verneveling')
        elif 'RI&E moet CMR-risico\'s expliciet behandelen' in p.text:
            replace_paragraph_text(p, 'RI&E moet CMR-risico\'s expliciet behandelen: V₂O₅ (Carc. 1B), NaVO₃ (Muta. 2), elektrolyt (Repr. 2). Registratie blootstelling verplicht.')

# §4.5 list bullets
for p in doc.paragraphs:
    if p.style.name == 'List Bullet' and 'De jerrycans ADR-conform zijn (UN-gekeurd)' in p.text:
        replace_paragraph_text(p, 'Jerrycans en canisters zijn ADR-conform (UN-gekeurd)')
    elif p.style.name == 'List Bullet' and 'Zuren en basen fysiek gescheiden zijn op het rack' in p.text:
        replace_paragraph_text(p, 'Zuren, basen en oxiderende stoffen fysiek gescheiden op het rack (minimaal 3 compartimenten)')

# §5.2 BRZO
for p in doc.paragraphs:
    if p.style.name == 'Normal' and 'Conclusie: BRZO 2020 is niet van toepassing op de demo-fase' in p.text:
        replace_paragraph_text(p, 'Conclusie: BRZO 2020 is niet van toepassing op de demo-fase van Phoenix Metals. Alle hoeveelheden (incl. V₂O₅ <1 kg, NaVO₃ <2 L) liggen minimaal een factor 100-1000 onder de laagste Seveso-drempelwaarden.')

# ═══════════════════════════════════════════════════════════════
# 5. TABLE REPLACEMENTS
# ═══════════════════════════════════════════════════════════════

# Table index mapping (from inspection):
# 0: Doc header, 1: Versiehistorie, 2: Regelgeving, 3: Stoffenlijst,
# 4: Slag componenten, 5: Intermediairen, 6: CLP-indeling, 7: Hoeveelheden,
# 8: Basismaatregelen, 9: Segregatie, 10: BRZO, 11-13: Maatregelen,
# 14: PBM's, 15: Actielijst demo, 16: Actielijst commercieel

# --- Table 3: Stoffenlijst (20 stoffen) ---
t3_data = [
    ['1', 'Steelmaking slag (poeder)', '65996-71-6', 'N/A', '—', '—', '≤60 kg', 'Big bag', 'Rack lab'],
    ['2', 'Zwavelzuur 25% (3M)', '7664-93-9', '8', '2796', 'II', '4×25L = 100L', 'Jerrycan', 'Rack lab'],
    ['3', 'Waterstofperoxide 30%', '7722-84-1', '5.1(8)', '2014', 'II', '4×10L = 40L', 'Jerrycan', 'Rack lab'],
    ['4', 'Natriumpersulfaat', '7775-27-1', '5.1', '1505', 'III', '2×5kg = 10kg', 'Canister', 'Rack lab'],
    ['5', 'Zoutzuur 20%', '7647-01-0', '8', '1789', 'II', '2×10L = 20L', 'Jerrycan', 'Rack lab'],
    ['6', 'Calciumsulfaat/silica (mengsel)', '10101-41-4 / 112945-52-5', 'N/A', '—', '—', '~5 kg/batch', 'Container', 'Rack lab'],
    ['7', 'Natriumsulfaat decahydraat', '7727-73-3', 'N/A', '—', '—', '~3 kg/batch', 'Container', 'Rack lab'],
    ['8', 'Trinatriumorthovanadaat', '13721-39-6', 'N/A', '—', '—', '<1 kg/batch', 'Container', 'Rack lab'],
    ['9', 'Natriummetavanadaat-oplossing', '13718-26-8', '6.1', '3285', 'III', '<2 L/batch', 'Jerrycan', 'Rack lab'],
    ['10', 'Calciumhydroxide', '1305-62-0', 'N/A', '—', '—', '~2 kg/batch', 'Canister', 'Rack lab'],
    ['11', 'Silica, precipitated', '112945-52-5', 'N/A', '—', '—', '<1 kg/batch', 'Container', 'Rack lab'],
    ['12', 'IJzeroxide (Fe₂O₃)', '1309-37-1', 'N/A', '—', '—', '~3 kg/batch', 'Container', 'Rack lab'],
    ['13', 'Mangaan(IV)oxide', '1313-13-9', 'N/A', '—', '—', '<1 kg/batch', 'Container', 'Rack lab'],
    ['14', 'Magnesiumhydroxide', '1309-42-8', 'N/A', '—', '—', '<1 kg/batch', 'Container', 'Rack lab'],
    ['15', 'Natriumaluminaat-oplossing', '1302-42-7', '8', '1819', 'II', '<5 L/batch', 'Jerrycan', 'Rack lab'],
    ['16', 'Natriumfosfaat (Na₃PO₄)', '7601-54-9', 'N/A', '—', '—', '<1 kg/batch', 'Canister', 'Rack lab'],
    ['17', 'Vanadiumpentoxide (V₂O₅)', '1314-62-1', '6.1', '2862', 'III', '<1 kg/batch', 'Container', 'Rack lab'],
    ['18', 'Vanadium-elektrolyt', '7664-93-9 / 13701-70-7 / 27774-13-6', '8', '2796', 'II', '<5 L/batch', 'Jerrycan', 'Rack lab'],
    ['19', 'Filter cake (residu)', 'N/A (mengsel)', 'N/A', '—', '—', '~1-2 kg/batch', 'Container', 'Rack lab'],
    ['20', 'Spoelwater/filtraten', 'N/A (mengsel)', 'Te class.', '—', '—', '~5-10 L/batch', 'Jerrycan', 'Rack lab'],
]
replace_table_data(doc.tables[3], t3_data)

# --- Table 4: Slag componenten ---
t4_data = [
    ['Fe-oxiden / silicaten', 'Hoofdbestanddeel, bron Fe₂O₃ + silica', 'Niet-ADR'],
    ['CaO / Ca-compounden', 'Calciumbron → Ca(OH)₂ + CaSO₄ eindproduct', 'Niet-ADR'],
    ['MgO', 'Magnesiumbron → Mg(OH)₂ eindproduct', 'Niet-ADR'],
    ['MnO', 'Mangaanbron → MnO₂ eindproduct', 'Niet-ADR (MnO₂: H302/H332/H373)'],
    ['P₂O₅', 'Fosforbron → Na₃PO₄ eindproduct', 'Niet-ADR (Na₃PO₄: H315/H319/H335)'],
    ['SiO₂', 'Silicabron → precipitated silica + CaSO₄/SiO₂', 'Niet-ADR'],
    ['V-verbindingen', 'Vanadiumbron → V₂O₅, elektrolyt, NaVO₃', 'ADR 6.1 (V₂O₅, NaVO₃); ADR 8 (elektrolyt)'],
]
replace_table_data(doc.tables[4], t4_data)

# --- Table 5: Intermediairen ---
set_cell(doc.tables[5], 0, 0, 'Intermediair')
t5_data = [
    ['Calciumsulfaat/silica', 'Mengsel CaSO₄·2H₂O + SiO₂ na extractie', '~5 kg/batch', 'Niet gereguleerd'],
    ['Natriumsulfaat decahydraat', 'Na₂SO₄·10H₂O, nevensproduct', '~3 kg/batch', 'Niet gereguleerd'],
    ['Trinatriumorthovanadaat', 'Na₃VO₄, intermediair V-extractie', '<1 kg/batch', 'H302/H312/H315/H319/H332'],
    ['Natriummetavanadaat-oplossing', 'NaVO₃ oplossing, intermediair', '<2 L/batch', 'ADR 6.1/PG III; H301/H319/H332/H341/H361fd/H372/H411'],
    ['Filter cake + spoelwater', 'Residu na filtratie + demi-water', '~5-10 L/batch', 'Afvalstof — te classificeren'],
]
replace_table_data(doc.tables[5], t5_data)

# --- Table 6: CLP-indeling (20 stoffen) ---
t6_data = [
    ['Steelmaking slag', 'H315, H318, H335, H372', 'GHS05, GHS07, GHS08'],
    ['Zwavelzuur 25%', 'H290, H314, H318', 'GHS05'],
    ['Waterstofperoxide 30%', 'H302, H318, H332', 'GHS05, GHS07'],
    ['Natriumpersulfaat', 'H272, H302, H315, H317, H319, H334, H335', 'GHS03, GHS07, GHS08'],
    ['Zoutzuur 20%', 'H290, H315, H319, H335', 'GHS05, GHS07'],
    ['Natriummetavanadaat', 'H301, H319, H332, H341, H361fd, H372, H411', 'GHS06, GHS08, GHS09'],
    ['Trinatriumorthovanadaat', 'H302, H312, H315, H319, H332', 'GHS07'],
    ['Calciumsulfaat/silica', 'Geen', 'Geen'],
    ['Natriumsulfaat', 'Geen', 'Geen'],
    ['Calciumhydroxide', 'H315, H318, H335', 'GHS05, GHS07'],
    ['Silica, precipitated', 'Geen', 'Geen'],
    ['IJzeroxide (Fe₂O₃)', 'Geen', 'Geen'],
    ['Mangaan(IV)oxide', 'H302, H332, H373', 'GHS07, GHS08'],
    ['Magnesiumhydroxide', 'Geen', 'Geen'],
    ['Natriumaluminaat-oplossing', 'H290, H314, H318', 'GHS05'],
    ['Natriumfosfaat (Na₃PO₄)', 'H315, H319, H335', 'GHS07'],
    ['Vanadiumpentoxide (V₂O₅)', 'H301, H318, H330, H335, H341, H350, H361fd, H362, H372, H411', 'GHS05, GHS06, GHS08, GHS09'],
    ['Vanadium-elektrolyt', 'H290, H302, H314, H318, H335, H361, H370, H372, H401, H411', 'GHS05, GHS07, GHS08, GHS09'],
    ['Filter cake (residu)', 'Te classificeren', 'Te bepalen'],
    ['Spoelwater/filtraten', 'Te classificeren', 'Te bepalen'],
]
replace_table_data(doc.tables[6], t6_data)

# --- Table 7: Hoeveelheden ---
t7_data = [
    ['Zwavelzuur 25%', '~100 L (~118 kg)', 'Potentieel >2.500 kg'],
    ['Waterstofperoxide 30%', '~40 L (~44 kg)', 'Potentieel >2.500 kg'],
    ['Natriumpersulfaat', '~10 kg', 'Potentieel >2.500 kg'],
    ['Zoutzuur 20%', '~20 L (~22 kg)', 'Potentieel >2.500 kg'],
    ['Natriumaluminaat-oplossing', '<5 L (~7 kg)', 'Potentieel >2.500 kg'],
    ['Vanadium-elektrolyt', '<5 L', 'Potentieel >2.500 kg'],
    ['Natriummetavanadaat', '<2 L', 'Potentieel >2.500 kg'],
    ['Vanadiumpentoxide', '<1 kg', 'Potentieel >2.500 kg'],
    ['Steelmaking slag', '≤60 kg', 'Tonnen'],
    ['Overige niet-ADR stoffen', '<30 kg totaal', 'Tonnen'],
    ['ADR-klasse 5.1 totaal', '~54 kg', 'Kan >2.500 kg'],
    ['ADR-klasse 6.1 totaal', '<3 kg', 'Kan >2.500 kg'],
    ['ADR-klasse 8 totaal', '~130 L (~150 kg)', 'Kan >2.500 kg'],
    ['Grenswaarde vn A/C', '2.500 kg per ADR-klasse', 'Kan overschreden worden'],
    ['Veiligheidsniveau demo', 'Basis', 'Mogelijk A of C'],
]
replace_table_data(doc.tables[7], t7_data)

# --- Table 9: Segregatie/onverenigbare combinaties ---
t9_data = [
    ['H₂SO₄/HCl + NaAlO₂', 'JA — VERPLICHT', 'Vakscheiding', 'Zuur + base = exotherme neutralisatie'],
    ['H₂SO₄ + H₂O₂', 'JA — VERPLICHT', 'Apart vak', 'Peracide vorming mogelijk'],
    ['H₂O₂/Na₂S₂O₈ + brandbaren', 'JA — VERPLICHT', 'Vakindeling', 'Oxiderend + brandbaar = brandgevaar'],
    ['H₂SO₄/HCl + V-elektrolyt', 'Aanbevolen', 'Vakscheiding', 'Zelfde UN 2796 maar verschillende gevaren'],
    ['NaAlO₂ + V-elektrolyt', 'Beoordelen', 'Vakscheiding aanbevolen', 'Base + zuurhoudend mengsel'],
    ['V₂O₅ + NaVO₃', 'Nee (zelfde klasse 6.1)', 'Samen opslag toegestaan', 'Beide ADR 6.1/PG III'],
    ['V₂O₅/NaVO₃ + voedsel', 'JA — VERPLICHT', 'Afzonderlijk', 'Toxische stoffen mogen niet bij voedsel'],
]
replace_table_data(doc.tables[9], t9_data)

# --- Table 10: BRZO ---
t10_data = [
    ['Zwavelzuur (H₂SO₄)', '1.000 ton (cat. E1)', '~118 kg', 'Nee'],
    ['Waterstofperoxide', '50 ton (cat. P8)', '~44 kg', 'Nee'],
    ['Natriumpersulfaat', '50 ton (cat. P8)', '~10 kg', 'Nee'],
    ['Zoutzuur', 'Niet specifiek in Bijlage I', '~22 kg', 'Nee'],
    ['Vanadiumpentoxide', 'Niet specifiek in Bijlage I', '<1 kg', 'Nee'],
    ['Natriummetavanadaat', 'Niet specifiek in Bijlage I', '<2 L', 'Nee'],
    ['Natriumaluminaat', 'Niet specifiek in Bijlage I', '<5 L', 'Nee'],
    ['V-elektrolyt', 'Niet specifiek in Bijlage I', '<5 L', 'Nee'],
    ['Totale gevaarlijke stoffen', '50-200 ton (cat. P8/P9)', '<500 kg totaal', 'Nee'],
]
replace_table_data(doc.tables[10], t10_data)

# --- Table 14: PBM's (9 stofgroepen) ---
t14_data = [
    ['Zuren (H₂SO₄, HCl)', 'PVC/nitril (zuurbestendig)', 'Veiligheidsbril + face shield', 'Zuurbestendig pak/schort', 'Bij dampen: FFP2'],
    ['Basen (NaAlO₂-oplossing)', 'PVC/nitril (bijtbestendig)', 'Veiligheidsbril + face shield', 'Beschermende kleding', 'Niet standaard'],
    ['Oxiderend (H₂O₂, Na₂S₂O₈)', 'Nitril handschoenen', 'Veiligheidsbril', 'Beschermende kleding', 'Bij verneveling: FFP2'],
    ['Toxisch vaste stoffen (V₂O₅)', 'Nitril handschoenen', 'Veiligheidsbril + face shield', 'Beschermende kleding', 'FFP3 (Carc. 1B, poeder)'],
    ['Toxisch vloeistoffen (NaVO₃)', 'PVC/nitril handschoenen', 'Veiligheidsbril', 'Labjas + schort', 'FFP2 bij verneveling'],
    ['V-elektrolyt', 'PVC/nitril handschoenen', 'Veiligheidsbril + face shield', 'Zuurbestendig pak/schort', 'FFP2 bij verneveling (Repr. 2)'],
    ['Irriterend (Ca(OH)₂, Na₃PO₄)', 'Nitril handschoenen', 'Veiligheidsbril', 'Beschermende kleding', 'Bij stof: FFP2'],
    ['Steelmaking slag (poeder)', 'Nitril handschoenen', 'Veiligheidsbril', 'Beschermende kleding', 'FFP3 (H372, stof)'],
    ['Niet-geclassificeerd (Fe₂O₃, SiO₂, Mg(OH)₂, Na₂SO₄)', 'Nitril handschoenen', 'Veiligheidsbril', 'Labjas', 'Stofmasker bij fijn poeder'],
]
replace_table_data(doc.tables[14], t14_data)

# --- Table 15: Actielijst demo-fase (expanded) ---
t15_data = [
    ['1', 'Opvangbak plaatsen onder chemie-rack (110% grootste verpakking)', 'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
    ['2', 'Scheiding zuur/base/oxiderend op rack realiseren (≥3 compartimenten)', 'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
    ['3', 'ADR-etiketten (5.1, 6.1, 8) aanbrengen op rack + individuele verpakkingen', 'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
    ['4', 'Verbodsborden "Roken en open vuur verboden" + "Geen voedsel" bij V₂O₅/NaVO₃', 'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
    ['5', 'Neutralisatiemiddelen (soda, citroenzuur, natriumthiosulfaat) beschikbaar', 'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
    ['6', 'Absorptiemateriaal (universeel + zuurbestendig + oxidatiemiddel)', 'Midden', 'Voor start demo', 'HSE Manager', 'Open'],
    ['7', 'Lekkage-instructie opstellen en zichtbaar ophangen (incl. H411-milieuzorg)', 'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
    ['8', 'Stoffenregister actualiseren incl. 20 stoffen + SDS-register', 'Midden', 'Voor start demo', 'HSE Manager', 'Open'],
    ['9', 'Calamiteiteninstructie opstellen (incl. H₂O₂-decontaminatie)', 'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
    ['10', 'PBM-matrix finaliseren (9 stofgroepen) en distribueren', 'Midden', 'Voor start demo', 'HSE Manager', 'Open'],
    ['11', 'RI&E actualiseren met CMR-risico\'s V₂O₅ (Carc. 1B), NaVO₃ (Muta. 2), elektrolyt (Repr. 2)', 'Midden', 'Week 1 demo', 'HSE Manager', 'Open'],
    ['12', 'Werkplekinstructiekaarten per stofgroep (9 groepen) opstellen', 'Midden', 'Week 1 demo', 'HSE Manager', 'Open'],
    ['13', 'Milieuzorgplan H411-stoffen (V₂O₅, NaVO₃, elektrolyt) opstellen', 'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
    ['14', 'Opslagplattegrond actualiseren met 20 stoffen + segregatiezones', 'Midden', 'Week 2 demo', 'HSE Manager', 'Open'],
    ['15', 'Brandblusmiddelen controleren (incl. H₂O₂-compatibiliteit)', 'Midden', 'Voor start demo', 'HSE Manager', 'Open'],
    ['16', 'CMR-register aanleggen voor V₂O₅, NaVO₃, elektrolyt', 'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
]
replace_table_data(doc.tables[15], t15_data)

# --- Table 16: Actielijst commercieel ---
t16_data = [
    ['1', 'PGS 15-risicoklasse herbeoordelen bij >2.500 kg per ADR-klasse (5.1, 6.1, 8)', 'Hoog', 'Kan leiden tot veiligheidsniveau A of C'],
    ['2', 'BRZO-toepasselijkheid herbeoordelen (incl. H₂O₂ drempel 50 ton)', 'Hoog', 'Bij opschaling naar tonnenniveau'],
    ['3', 'VBB-installatie ontwerpen (indien veiligheidsniveau A)', 'Hoog', 'PGS 14 UPD vereist'],
    ['4', 'Wbdbo berekenen en realiseren (indien veiligheidsniveau A)', 'Hoog', 'NEN 6068'],
    ['5', 'Bluswateropvang voorzien (100% bij H411-stoffen)', 'Hoog', 'Milieugevaarlijke stoffen (V₂O₅, NaVO₃, elektrolyt)'],
    ['6', 'Tankopslag conform PGS 15 aanleggen', 'Midden', 'Nieuwe tanks: zie plant layout'],
    ['7', 'Scenariostudie uitvoeren (PGS 15 §7.7)', 'Midden', 'Voor grotere hoeveelheden'],
    ['8', 'HZS-overleg met veiligheidsregio actualiseren', 'Midden', 'Bij wijziging inrichting'],
    ['9', 'Oxiderende stoffen opslag aanleggen (H₂O₂, Na₂S₂O₈)', 'Hoog', 'ADR 5.1 vereist specifieke voorzieningen'],
    ['10', 'Toxische stoffen opslag aanleggen (V₂O₅, NaVO₃)', 'Hoog', 'ADR 6.1 + CMR Carc. 1B voorzieningen'],
]
replace_table_data(doc.tables[16], t16_data)

# ═══════════════════════════════════════════════════════════════
# 6. REGELGEVING TABLE 2 — update SARU-ash reference
# ═══════════════════════════════════════════════════════════════
set_cell(doc.tables[2], 7, 0, 'Besluit basisveiligheidsnormen stralingsbescherming')
set_cell(doc.tables[2], 7, 1, 'Relevant indien NORM in slag — controle noodzakelijk bij opschaling')

# ═══════════════════════════════════════════════════════════════
# 7. BRZO section text
# ═══════════════════════════════════════════════════════════════
for p in doc.paragraphs:
    if p.style.name == 'Normal' and 'Voor Phoenix Metals in de demo-fase geldt:' in p.text:
        replace_paragraph_text(p, 'Voor Phoenix Metals in de demo-fase geldt:\n• H₂SO₄: ~118 kg (drempel 1.000 ton)\n• H₂O₂: ~44 kg (drempel 50 ton)\n• V₂O₅: <1 kg (geen specifieke drempel)\n• Totaal: <500 kg (drempel 50-200 ton)\n→ BRZO niet van toepassing.')

# ═══════════════════════════════════════════════════════════════
# 8. Bronverwijzingen — add Meta-Dossier reference
# ═══════════════════════════════════════════════════════════════
for p in doc.paragraphs:
    if p.style.name == 'Heading 2' and '8.4 Phoenix Metals brondocumenten' in p.text:
        # Find next paragraphs to add new reference
        pass
    if p.style.name == 'Normal' and '[7] Phoenix Metals Bedrijfsomschrijving' in p.text:
        # Add after this paragraph
        parent = p._element.getparent()
        idx = list(parent).index(p._element)
        
        # Create new paragraph for meta-dossier reference
        new_p = copy.deepcopy(p._element)
        for r in new_p.findall(qn('w:r')):
            for t in r.findall(qn('w:t')):
                t.text = '[8] Meta-Dossier Pilot Plant Slag Chemicals v5.0 (6 mei 2026) — Geverifieerde stoffenlijst met SDS-data voor 20 stoffen'
        parent.insert(idx + 1, new_p)

# ═══════════════════════════════════════════════════════════════
# 9. TierVerify log toevoegen voor colofon
# ═══════════════════════════════════════════════════════════════
for p in doc.paragraphs:
    if p.style.name == 'Heading 1' and p.text.strip() == 'Kolofon':
        parent = p._element.getparent()
        idx = list(parent).index(p._element)
        
        # Add TierVerify heading
        h = copy.deepcopy(p._element)
        for r in h.findall(qn('w:r')):
            for t in r.findall(qn('w:t')):
                t.text = 'TierVerify Log'
        parent.insert(idx, h)
        
        # Add verify content
        verify_text = (
            'TIERVERIFY — D1 Kennisdossier v5.0\n'
            '✓ Versie: 4.0 → 5.0, datum bijgewerkt\n'
            '✓ Stoffenaantal: 8 → 20 (geverifieerd tegen Meta-Dossier v5.0)\n'
            '✓ CAS-nummers: letterlijk uit Meta-Dossier overgenomen\n'
            '✓ H-codes: geverifieerd tegen SDS-data uit Meta-Dossier\n'
            '✓ ADR-classificaties: geverifieerd (5.1, 6.1, 8)\n'
            '✓ Correctie 1: NaVO₃ — H341 (Muta. 2) toegevoegd per Merck SDS ✓\n'
            '✓ Correctie 2: NaAlO₂ — H290 toegevoegd, ADR PG III → PG II per SDS ✓\n'
            '✓ Correctie 3: V-elektrolyt — H411 (milieugevaarlijk) toegevoegd per SDS ✓\n'
            '✓ CMR-stoffen: V₂O₅ (Carc. 1B, Muta. 2, Repr. 2), NaVO₃ (Muta. 2, Repr. 2), elektrolyt (Repr. 2)\n'
            '✓ Bronverwijzingen: [1]-[8] notatie aanwezig\n'
            '✓ Versiehistorie: v5.0 rij toegevoegd\n'
            '✓ Tabellen: 3,4,5,6,7,9,10,14,15,16 geüpdatet naar 20 stoffen\n'
            'Status: GEVERIFIEERD — 6 mei 2026'
        )
        # Use the paragraph right after the heading as template
        kolofon_idx = None
        for i, pp in enumerate(doc.paragraphs):
            if pp._element is p._element:
                kolofon_idx = i
                break
        if kolofon_idx is not None and kolofon_idx + 1 < len(doc.paragraphs):
            new_p_elem = copy.deepcopy(doc.paragraphs[kolofon_idx + 1]._element)
            for r in new_p_elem.findall(qn('w:r')):
                for t in r.findall(qn('w:t')):
                    t.text = verify_text
            parent.insert(idx, new_p_elem)
        break

# ═══════════════════════════════════════════════════════════════
# SAVE
# ═══════════════════════════════════════════════════════════════
doc.save(DST)
print(f'SUCCESS: {DST}')
