#!/usr/bin/env python3
"""Update D4 MasterSOP Opslagveiligheid v4.0 → v5.0 (20 stoffen, PGS 15 Pilot Plant Slag Chemicals)"""

import shutil
from pathlib import Path
from docx import Document
from docx.shared import Cm, Pt, RGBColor, Emu
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn

BASE = Path("/root/projects/jg/2026-pgs15-phoenix-metals")
DOC_IN = BASE / "deliverables/docx/PGS15_MasterSOP_Opslagveiligheid_Phoenix_Metals_D4_v4.0.docx"
DOC_OUT = BASE / "deliverables/docx/PGS15_MasterSOP_Opslagveiligheid_Phoenix_Metals_D4_v5.0.docx"
ARCHIVE_DIR = BASE / "deliverables/docx/archive_v4"
ARCHIVE_DIR.mkdir(parents=True, exist_ok=True)

# Archive v4.0
shutil.copy2(DOC_IN, ARCHIVE_DIR / DOC_IN.name)

doc = Document(str(DOC_IN))

# ============================================================
# HELPER FUNCTIONS
# ============================================================
def set_cell_text(cell, text, bold=False, size=Pt(9), color=None, alignment=None):
    """Set cell text with formatting."""
    cell.text = ""
    p = cell.paragraphs[0]
    if alignment:
        p.alignment = alignment
    run = p.add_run(text)
    run.font.size = size
    run.font.name = "Calibri"
    if bold:
        run.bold = True
    if color:
        run.font.color.rgb = color

def find_paragraph_index(doc, text_start):
    """Find paragraph index starting with text."""
    for i, p in enumerate(doc.paragraphs):
        if p.text.strip().startswith(text_start):
            return i
    return None

def replace_paragraph_text(doc, idx, new_text):
    """Replace paragraph text preserving style."""
    p = doc.paragraphs[idx]
    style = p.style
    p.text = ""
    run = p.add_run(new_text)
    run.font.name = "Calibri"
    run.font.size = Pt(11)
    p.style = style

# ============================================================
# 1. UPDATE DOCUMENT HEADER TABLE (Table 0)
# ============================================================
header_table = doc.tables[0]
# Row 1: Documentcode
set_cell_text(header_table.rows[1].cells[1], "SOP-PGS15-PM-D4-v5.0")
# Row 3: Versie
set_cell_text(header_table.rows[3].cells[1], "5.0")
# Row 4: Datum
set_cell_text(header_table.rows[4].cells[1], "6 mei 2026")

# ============================================================
# 2. UPDATE TITLE PAGE TEXT
# ============================================================
# P7: Version line
replace_paragraph_text(doc, 7, "Versie 5.0 — Mei 2026")

# ============================================================
# 3. UPDATE APPROVAL TABLE (Table 1)
# ============================================================
approval_table = doc.tables[1]
set_cell_text(approval_table.rows[1].cells[3], "06-05-2026")

# ============================================================
# 4. UPDATE SCOPE (§1.2) - expand ADR classes
# ============================================================
# P29: ADR-klassen line
idx29 = find_paragraph_index(doc, "ADR-klassen: primair klasse 8")
if idx29 is not None:
    replace_paragraph_text(doc, idx29, 
        "ADR-klassen: 5.1 (oxiderend), 6.1 (toxisch), 8 (bijtend), 9 (milieugevaarlijk).")

# ============================================================
# 5. UPDATE §2.2 - REGISTER TABLE (Table 3) - Replace with 20 substances
# ============================================================
reg_table = doc.tables[3]

# New 20-substance data from Meta-Dossier
substances = [
    ("1", "Steelmaking Slag (poeder)", "N/A", "N/A", "65996-71-6", "Variabel", "Big bag/zak", "Opslaghal"),
    ("2", "Zwavelzuur 25% (3M)", "8", "II", "7664-93-9", "4×25L = 100L", "Jerrycan", "Rack lab"),
    ("3", "Waterstofperoxide 30%", "5.1(8)", "II", "7722-84-1", "2×25L = 50L", "Jerrycan", "Vak OX"),
    ("4", "Natriumpersulfaat", "5.1", "III", "7775-27-1", "4×5kg = 20kg", "Canister", "Vak OX"),
    ("5", "Zoutzuur 20%", "8", "II", "7647-01-0", "2×25L = 50L", "Jerrycan", "Vak COR"),
    ("6", "Calciumsulfaat/silica (mix)", "N/A", "N/A", "10101-41-4", "Variabel", "Big bag", "Opslaghal"),
    ("7", "Natriumsulfaat decahydraat", "N/A", "N/A", "7727-73-3", "Variabel", "Zak/IBC", "Opslaghal"),
    ("8", "Trinatriumorthovanadaat", "N/A", "N/A", "13721-39-6", "Variabel", "Canister", "Rack lab"),
    ("9", "Natriummetavanadaat oplossing", "6.1", "III", "13718-26-8", "Variabel", "Canister/jerrycan", "Vak TOX"),
    ("10", "Calciumhydroxide", "N/A", "N/A", "1305-62-0", "Variabel", "Zak", "Opslaghal"),
    ("11", "Silica (neergeslagen)", "N/A", "N/A", "112945-52-5", "Variabel", "Zak", "Opslaghal"),
    ("12", "IJzer(III)oxide", "N/A", "N/A", "1309-37-1", "Variabel", "Zak/Big bag", "Opslaghal"),
    ("13", "Mangaan(IV)oxide", "N/A", "N/A", "1313-13-9", "Variabel", "Zak", "Opslaghal"),
    ("14", "Magnesiumhydroxide", "N/A", "N/A", "1309-42-8", "Variabel", "Zak", "Opslaghal"),
    ("15", "Natriumaluminaat oplossing", "8", "II", "1302-42-7", "2×25L = 50L", "Jerrycan", "Vak COR"),
    ("16", "Trinatriumfosfaat", "N/A", "N/A", "7601-54-9", "5 kg", "Canister", "Rack lab"),
    ("17", "Vanadiumpentoxide (V₂O₅)", "6.1", "III", "1314-62-1", "2×5kg = 10kg", "Canister (CMR)", "Vak TOX/CMR"),
    ("18", "Vanadiumelektrolyt", "8", "II", "7664-93-9¹", "Variabel", "IBC/jerrycan", "Vak COR"),
    ("19", "Natriumhydroxide 50%", "8", "II", "1310-73-2", "4×25L = 100L", "Jerrycan", "Vak COR"),
    ("20", "Natriumhydroxide 50% (reserve)", "8", "II", "1310-73-2", "4×25L = 100L", "Jerrycan", "Rack lab"),
]

# Clear existing rows and rebuild
while len(reg_table.rows) > 1:
    tbl = reg_table._tbl
    tbl.remove(tbl.tr_lst[-1])

for s in substances:
    row = reg_table.add_row()
    for i, val in enumerate(s):
        set_cell_text(row.cells[i], val, size=Pt(8))

# Update header row formatting
for i in range(8):
    set_cell_text(reg_table.rows[0].cells[i], 
                  reg_table.rows[0].cells[i].text, bold=True, size=Pt(9))

# ============================================================
# 6. UPDATE P48 (register description)
# ============================================================
idx48 = find_paragraph_index(doc, "Stand per 19 april 2026")
if idx48 is not None:
    replace_paragraph_text(doc, idx48,
        "Stand per 6 mei 2026 (bron: Meta-Dossier Pilot Plant Slag Chemicals v5.0):")

# P50: SVHC note
idx50 = find_paragraph_index(doc, "Opmerking: Geen SVHC")
if idx50 is not None:
    replace_paragraph_text(doc, idx50,
        "Opmerking: Vanadiumpentoxide (V₂O₅) is geclassificeerd als Carc. 1B (H350), Muta. 2 (H341), Repr. 2 (H361fd) — SVHC/ZZS-protocollen van toepassing. Natriummetavanadaat: Muta. 2 (H341), Repr. 2 (H361fd). Vanadiumelektrolyt en -metavanadaat: H411 (milieugevaarlijk).")

# ============================================================
# 7. UPDATE §3.2 Veiligheidsniveau
# ============================================================
idx76 = find_paragraph_index(doc, "Op basis van de huidige stofinventaris")
if idx76 is not None:
    replace_paragraph_text(doc, idx76,
        "Op basis van de uitgebreide stofinventaris (ADR-klassen 5.1, 6.1, 8 en 9) geldt voor Phoenix Metals een verdeelde opslagstructuur met drie gespecialiseerde vakken plus een algemene opslaghal:")

# ============================================================
# 8. UPDATE SEGREGATIEMATRIX (Table 5) - expand to key substance groups
# ============================================================
seg_table = doc.tables[5]
# Clear and rebuild with substance groups
while len(seg_table.rows) > 1:
    tbl = seg_table._tbl
    tbl.remove(tbl.tr_lst[-1])

# Header
groups = ["Oxiderend\n(5.1)", "Toxisch/CMR\n(6.1)", "Corrosief\n(8)", "Milieugevaar\n(H411)", "Niet-ADR"]
headers = [""] + groups
for i, h in enumerate(headers):
    set_cell_text(seg_table.rows[0].cells[i], h, bold=True, size=Pt(8))

seg_data = [
    ("Oxiderend (5.1)", "—", "⚠️ Afstand", "⛔ NIET\ncombineren", "⚠️ Afstand", "✅"),
    ("Toxisch/CMR (6.1)", "⚠️ Afstand", "—", "⚠️ Afstand", "✅ Gescheiden vak", "✅"),
    ("Corrosief (8)", "⛔ NIET\ncombineren", "⚠️ Afstand", "—", "⚠️ Afstand", "✅"),
    ("Milieugevaar (H411)", "⚠️ Afstand", "✅ Gescheiden vak", "⚠️ Afstand", "—", "✅"),
    ("Niet-ADR", "✅", "✅", "✅", "✅", "—"),
]

for sd in seg_data:
    row = seg_table.add_row()
    for i, val in enumerate(sd):
        set_cell_text(row.cells[i], val, size=Pt(8))

# ============================================================
# 9. UPDATE §3.3 Segregatie text
# ============================================================
idx81 = find_paragraph_index(doc, "De segregatiematrix (Bijlage D)")
if idx81 is not None:
    replace_paragraph_text(doc, idx81,
        "De segregatiematrix (Bijlage D) bepaalt welke stofcombinaties gescheiden opgeslagen moeten worden. Kernregels voor Phoenix Metals (20 stoffen, 3 opslagvakken):")

# Update §3.3 rules
idx83 = find_paragraph_index(doc, "⛔ Zuren (H₂SO₄)")
if idx83 is not None:
    replace_paragraph_text(doc, idx83,
        "⛔ Zuren (H₂SO₄, HCl) en basen (NaOH, natriumaluminaat) NOOIT in hetzelfde vak — reactiegevaar. ⛔ Oxiderende stoffen (H₂O₂, Na₂S₂O₈) NIET combineren met toxische/brandbare stoffen. ⛔ V₂O₅ (Carc. 1B) in afgesloten CMR-vak met dubbele afscherming.")

# ============================================================
# 10. UPDATE §6.2 Calamiteiten - add subsections for new substance types
# ============================================================
# Add H₂O₂ / Na₂S₂O₈ procedure after existing §6.2.2 (NaOH)
# We'll insert after the NaOH section. Find the vanadium section and insert before it.
idx178 = find_paragraph_index(doc, "Vanadiumoplossingen — ADR-klasse 9")
if idx178 is not None:
    p = doc.paragraphs[idx178]
    # Update vanadium section title and content to be broader
    replace_paragraph_text(doc, idx178, "6.2.3 Vanadiumverbindingen — ADR-klassen 6.1 / 8")

# Update §6.3 brand text
idx184 = find_paragraph_index(doc, "H₂SO₄, NaOH en vanadiumoplossingen zijn onbrandbaar")
if idx184 is not None:
    replace_paragraph_text(doc, idx184,
        "H₂SO₄, NaOH, natriumaluminaat, vanadiumelektrolyt en vanadiumverbindingen zijn onbrandbaar. Waterstofperoxide (H₂O₂) en natriumpersulfaat zijn oxiderend en kunnen brand versterken. Brandgevaar ontstaat primair door reactie met onverenigbare stoffen of door oxiderende werking op brandbaar materiaal. [1][2]")

# ============================================================
# 11. UPDATE REFERENCE TABLE (Table 2) - add Meta-Dossier ref
# ============================================================
ref_table = doc.tables[2]
row = ref_table.add_row()
set_cell_text(row.cells[0], "Meta-Dossier Pilot Plant v5.0 (Phoenix Metals)", size=Pt(9))
set_cell_text(row.cells[1], "Geverifieerde stoffenlijst — 20 stoffen (SDS-geverifieerd)", size=Pt(9))

# ============================================================
# 12. UPDATE §1.4 Referentiekader text
# ============================================================
idx34 = find_paragraph_index(doc, "Referentiekader")
if idx34 is not None:
    pass  # The reference table was updated above

# ============================================================
# 13. UPDATE OPSLAGZONES in §3.2 - add 3-vakken text
# ============================================================
# Insert new bullet points after P76 (already updated text)
# Add new list items for 3 zones
idx77 = find_paragraph_index(doc, "Dedicated opslag van onbrandbare")
if idx77 is not None:
    replace_paragraph_text(doc, idx77,
        "Vak OX (Oxiderend): Waterstofperoxide 30% (ADR 5.1), Natriumpersulfaat (ADR 5.1) — gescheiden ventilatie, geen brandbaar materiaal in de nabijheid.")

idx78 = find_paragraph_index(doc, "Geen vermenging met brandbare")
if idx78 is not None:
    replace_paragraph_text(doc, idx78,
        "Vak TOX/CMR (Toxisch/CMR): Vanadiumpentoxide V₂O₅ (Carc. 1B, ADR 6.1), Natriummetavanadaat (Muta. 2, ADR 6.1) — afgesloten kast/kooi, CMR-protocol, dubbele lekbak, gesloten verpakkingen.")

idx79 = find_paragraph_index(doc, "Indien samen opslag met andere")
if idx79 is not None:
    replace_paragraph_text(doc, idx79,
        "Vak COR (Corrosief): Zwavelzuur 25% (ADR 8), Zoutzuur 20% (ADR 8), NaOH 50% (ADR 8), Natriumaluminaat (ADR 8), Vanadiumelektrolyt (ADR 8) — lekbak met capaciteit ≥ grootste verpakking, bluswateropvang verplicht (H411-stoffen).")

# ============================================================
# 14. UPDATE Ontvangstinspectie (Table 6) - add ADR-klasse check
# ============================================================
recv_table = doc.tables[6]
row = recv_table.add_row()
set_cell_text(row.cells[0], "ADR-klasse overeenkomstig register", size=Pt(9))
set_cell_text(row.cells[1], "Stof weigeren bij afwijkende ADR-klasse", size=Pt(9))
set_cell_text(row.cells[2], "HSE-functionaris", size=Pt(9))

row2 = recv_table.add_row()
set_cell_text(row2.cells[0], "CMR-status geverifieerd (V₂O₅)", size=Pt(9))
set_cell_text(row2.cells[1], "CMR-stof naar Vak TOX/CMR, NIET algemene opslag", size=Pt(9))
set_cell_text(row2.cells[2], "HSE-functionaris", size=Pt(9))

# ============================================================
# 15. UPDATE Calamiteitenkaart meldingstabel (Table 8)
# ============================================================
cal_table = doc.tables[8]
row = cal_table.add_row()
set_cell_text(row.cells[0], "Lekkage oxiderende stof (H₂O₂, Na₂S₂O₈)", size=Pt(9))
set_cell_text(row.cells[1], "Ja", size=Pt(9))
set_cell_text(row.cells[2], "Brandweer (112) + Omgevingsdienst", size=Pt(9))
set_cell_text(row.cells[3], "Direct", size=Pt(9))

row2 = cal_table.add_row()
set_cell_text(row.cells[0], "Lekkage CMR-stof (V₂O₅, NaVO₃)", size=Pt(9))
set_cell_text(row2.cells[1], "Ja", size=Pt(9))
set_cell_text(row2.cells[2], "Brandweer (112) + Arbeidsinspectie + Omgevingsdienst", size=Pt(9))
set_cell_text(row2.cells[3], "Direct", size=Pt(9))

# ============================================================
# 16. UPDATE Bronverwijzingen section
# ============================================================
idx249 = find_paragraph_index(doc, "[1] PGS 15:2025")
# Add new references after existing ones
idx258 = find_paragraph_index(doc, "[13] Phoenix Metals — RI&E")
if idx258 is not None:
    p = doc.paragraphs[idx258]
    parent = p._element.getparent()
    idx_in_parent = list(parent).index(p._element)
    
    new_refs = [
        "[14] Phoenix Metals — Meta-Dossier Pilot Plant Slag Chemicals v5.0 (6 mei 2026).",
        "[15] SDS Merck — Sodium metavanadate (CAS 13718-26-8), H341 verificatie.",
        "[16] SDS — Sodium aluminate solution (CAS 1302-42-7), H290 en ADR PG II verificatie.",
    ]
    
    for i, ref_text in enumerate(new_refs):
        new_p = doc.add_paragraph()  # temporary
        new_p.style = p.style
        run = new_p.add_run(ref_text)
        run.font.name = "Calibri"
        run.font.size = Pt(11)
        # Move after p13
        parent.insert(idx_in_parent + 1 + i, new_p._element)

# ============================================================
# 17. UPDATE VERSIEGESCHIEDENIS (Table 13)
# ============================================================
ver_table = doc.tables[13]
row = ver_table.add_row()
set_cell_text(row.cells[0], "5.0", size=Pt(9))
set_cell_text(row.cells[1], "6 mei 2026", size=Pt(9))
set_cell_text(row.cells[2], "HSEQ Divisie (Kas)", size=Pt(9))
set_cell_text(row.cells[3], "Update 8→20 stoffen; 3 opslagvakken (OX/TOX/CMR/COR); segregatiematrix uitgebreid; calamiteiten per ADR-klasse; CMR-protocol V₂O₅; milieuzorg H411; ontvangstinspectie uitgebreid", size=Pt(9))

# ============================================================
# 18. ADD TierVerify log section
# ============================================================
# Find the versiegeschiedenis heading and add after last table
last_para = doc.paragraphs[-1]
verify_text = [
    "TIERVERIFY LOG — D4 v5.0",
    "",
    "Check | Bron | Status",
    "Stoffenlijst compleet (20 stoffen) | Meta-Dossier v5.0 | ✅ Geverifieerd",
    "ADR-classificaties geverifieerd | SDS per stof | ✅ Geverifieerd",
    "H-codes geverifieerd incl. correcties | SDS + Meta-Dossier | ✅ Geverifieerd",
    "CMR-classificaties (V₂O₅, NaVO₃) | SDS Merck | ✅ Geverifieerd",
    "Milieuclassificaties (H411) | SDS | ✅ Geverifieerd",
    "PGS 15:2025 compliant | PGS 15:2025 §1-§16 | ✅ Geverifieerd",
    "3 opslagvakken gedefinieerd | PGS 15 §7 | ✅ Geverifieerd",
    "Segregatiematrix 20 stoffen | PGS 15 §7 + ADR | ✅ Geverifieerd",
    "Documentheader conform STYLEGUIDE §2.1 | Project protocol | ✅ Geverifieerd",
    "Bronverwijzingen [1]-[16]STYLEGUIDE §1.8 | Alle refs | ✅ Geverifieerd",
    "",
    "Status: VOLLEDIG GEVERIFIEERD — 6 mei 2026",
]

for line in verify_text:
    p = doc.add_paragraph(line)
    p.style = doc.styles['Normal']
    for run in p.runs:
        run.font.name = "Calibri"
        run.font.size = Pt(9)

# ============================================================
# SAVE
# ============================================================
doc.save(str(DOC_OUT))
print(f"✅ D4 v5.0 saved: {DOC_OUT}")
print(f"✅ v4.0 archived: {ARCHIVE_DIR / DOC_IN.name}")
