#!/usr/bin/env python3
"""Generate PGS15_Audit_Procedure_v5.0.docx from v4.0 with 20-stoffen updates."""
import shutil
from pathlib import Path
from docx import Document
from docx.shared import Cm, Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn

BASE = Path("/root/projects/jg/2026-pgs15-phoenix-metals")
SRC = BASE / "deliverables/docx/PGS15_Audit_Procedure_v4.0.docx"
DST = BASE / "deliverables/docx/PGS15_Audit_Procedure_v5.0.docx"
ARCHIVE = BASE / "deliverables/docx/archive_v4"
LOGO = Path("/root/projects/jg/assets/branding/jvg-consultancy-logo.png")

# Archive v4.0
ARCHIVE.mkdir(parents=True, exist_ok=True)
if not (ARCHIVE / "PGS15_Audit_Procedure_v4.0.docx").exists():
    shutil.copy2(SRC, ARCHIVE / "PGS15_Audit_Procedure_v4.0.docx")

doc = Document(str(SRC))

# ── Helper functions ──
def find_paragraph(text_frag):
    for p in doc.paragraphs:
        if text_frag in p.text:
            return p
    return None

def replace_in_paragraph(p, old, new):
    for run in p.runs:
        if old in run.text:
            run.text = run.text.replace(old, new)

def set_cell_text(table, row, col, text):
    cell = table.rows[row].cells[col]
    for p in cell.paragraphs:
        p.clear()
    cell.paragraphs[0].text = text

def add_paragraph_after(ref_para, text, style=None):
    """Insert paragraph after ref_para."""
    new_p = doc.add_paragraph()
    # Move after ref
    ref_para._element.addnext(new_p._element)
    if style:
        new_p.style = style
    new_p.text = text
    return new_p

def replace_paragraph_text(para, new_text):
    """Replace all runs with single text."""
    for run in para.runs:
        run.text = ""
    if para.runs:
        para.runs[0].text = new_text
    else:
        para.text = new_text

# ── 1. Update Document Header (Table 0) ──
t0 = doc.tables[0]
set_cell_text(t0, 2, 1, "5.0")
set_cell_text(t0, 6, 1, "6 mei 2026")

# ── 2. Update Title ──
for p in doc.paragraphs:
    if "Versie 4.0" in p.text:
        replace_paragraph_text(p, "Versie 5.0 — Mei 2026")

# ── 3. Version History (Table 1) ──
t1 = doc.tables[1]
# Add row for v5.0
new_row = t1.add_row()
new_row.cells[0].text = "5.0"
new_row.cells[1].text = "Mei 2026"
new_row.cells[2].text = "HSEQ Manager"
new_row.cells[3].text = ("Update scope naar 20 stoffen; 3 opslagvakken; 3 ADR-klassen (5.1, 6.1, 8); "
                          "CMR-criteria (Carc. 1B, Muta. 2, Repr. 2); milieu H411; "
                          "uitgebreid steekproefregime; auditorbekwaamheid ADR/CMR")

# ── 4. Scope (§2.2) ──
# Replace bullet list in scope
p22 = find_paragraph("Deze procedure is van toepassing op alle opslag")
if p22:
    replace_paragraph_text(p22, 
        "Deze procedure is van toepassing op alle opslag-, overslag- en handling-activiteiten van gevaarlijke stoffen bij Phoenix Metals B.V. Pilot Plant Slag Chemicals, omvattende 20 stoffen (5 input chemicals, 5 intermediates, 10 end products), 3 opslagvakken en 3 ADR-klassen (5.1, 6.1, 8).")

# Replace bullets
old_bullets_scope = [
    ("Buitenkoudopslag van ammoniak", "Opslagvak A — Input Chemicals: zwavelzuur 25% (ADR 8/PG II), waterstofperoxide 30% (ADR 5.1(8)/PG II), natriumpersulfaat (ADR 5.1/PG III), zoutzuur 20% (ADR 8/PG II), staalslakpoeder (niet-ADR)"),
    ("Opslag van zwavelzuur", "Opslagvak B — Intermediates: natriummetavanadaat (ADR 6.1/PG III, CMR: Muta. 2, Repr. 2, milieu H411), trisodiumorthovanadaat (niet-ADR), natriumsulfaat, calciumsulfaat/silica"),
    ("Bewaren van vanadiumgerelateerde", "Opslagvak C — End Products: vanadiumpentoxide (ADR 6.1/PG III, Carc. 1B, Muta. 2, Repr. 2, Lact., milieu H411), vanadiumelektrolyt (ADR 8/PG II, Repr. 2, milieu H411), natriumaluminaat (ADR 8/PG II), calciumhydroxide, mangaan(IV)oxide, ijzer(III)oxide, silica, magnesiumhydroxide, natriumfosfaat"),
    ("Alle ondersteunende processen", "Alle ondersteunende processen: labeling, SDS-beheer, pompsystemen, lekdetectie, blusvoorzieningen, CMR-protocollen, milieuvoorzieningen (H411-stoffen)"),
]

for old_frag, new_text in old_bullets_scope:
    p = find_paragraph(old_frag)
    if p:
        replace_paragraph_text(p, new_text)

# ── 5. Update §2.3 Frequency table ──
t2 = doc.tables[2]
# Row 2: tussentijdse audit trigger update
set_cell_text(t2, 2, 2, "Wijziging proces, stof, of installatie; nieuwe stof toegevoegd (bijv. uitbreiding 8→20 stoffen)")

# ── 6. Update §3 Rollen & Verantwoordelijkheden (Table 3) ──
t3 = doc.tables[3]
# Lead Auditor bevoegdheid
set_cell_text(t3, 1, 3, 
    "ISO 19011-kwalificatie; PGS 15:2025 kennis; ADR-competentie (klassen 5.1, 6.1, 8); "
    "CMR-protocolkennis (Carc. 1B, Muta. 2, Repr. 2); milieu-H411 beoordelingservaring")
# Auditor bevoegdheid
set_cell_text(t3, 2, 3, 
    "PGS 15 basiskennis; ADR-basiskennis (5.1, 6.1, 8); CMR-bewustzijn; audit-ervaring")

# ── 7. Update §4.2 Scope bepalen ──
p42 = find_paragraph("Fysieke scope: welke opslaglocaties")
if p42:
    replace_paragraph_text(p42, "Fysieke scope: welke opslagvakken (A, B, C), installaties en gebieden — inclusief alle 20 stoffen")

# ── 8. Update §4.3 Documenten verzamelen ──
p_sds = find_paragraph("Safety Data Sheets (SDS'en) van alle opgeslagen")
if p_sds:
    replace_paragraph_text(p_sds, "Safety Data Sheets (SDS'en) van alle 20 opgeslagen stoffen — inclusief CMR-classificaties en milieu-H-codes (H411)")

# ── 9. Update §4.4 Checklist ──
p_checklist = find_paragraph("De checklist dekt minimaal")
if p_checklist:
    replace_paragraph_text(p_checklist, 
        "De checklist dekt minimaal (uitgebreid voor 20 stoffen, 3 ADR-klassen en CMR-stoffen):")

# Add CMR/milieu bullets after existing checklist items
p_pbm = find_paragraph("Persoonlijke beschermingsmiddelen")
if p_pbm:
    add_items = [
        ("List Bullet", "CMR-protocollen: afzondering Carc. 1B-stoffen (V₂O₅), Muta. 2-stoffen (natriummetavanadaat), Repr. 2-stoffen — gesloten opslag, blootstellingslimieten, medische controle"),
        ("List Bullet", "Milieumaatregelen: H411-stoffen (natriummetavanadaat, V₂O₅, vanadiumelektrolyt) — vloeistofdichte vloer, afvangbekkens, geen afvoer naar riool"),
        ("List Bullet", "ADR-scheiding: klasse 5.1 (oxiderend) gescheiden van 6.1 (toxisch) en 8 (corrosief) per ADR 7.5.4; compatibiliteitsmatrix gecontroleerd"),
        ("List Bullet", "Steekproefregime: bij 20 stoffen minimaal 50% steekproef (10 stoffen) per audit; CMR-stoffen altijd volledig gecontroleerd"),
    ]
    for style, text in add_items:
        new_p = doc.add_paragraph()
        p_pbm._element.addnext(new_p._element)
        new_p.style = style
        new_p.text = text
        p_pbm = new_p  # chain inserts

# ── 10. Update §5.4 Interviews ──
p_kennis = find_paragraph("Kennis van gevaren opgeslagen stoffen")
if p_kennis:
    replace_paragraph_text(p_kennis, 
        "Kennis van gevaren per opslagvak: ADR-klassen 5.1 (oxiderend), 6.1 (toxisch), 8 (corrosief); CMR-risico's (V₂O₅ Carc. 1B); milieugevaren (H411)")

# ── 11. Update §6 Bevindingen Classificatie (Table 4) ──
t4 = doc.tables[4]
# Add rows for new classification types
for label, desc, opvolging in [
    ("CMR-non-conform", "Afwijking in opslag, handling of PBM's bij CMR-geclassificeerde stoffen (Carc. 1B, Muta. 2, Repr. 2)", 
     "Directe actie; CAP binnen 1 week; directie geïnformeerd binnen 24 uur"),
    ("Milieu-tekortkoming", "Onvoldoende milieuvoorzieningen voor H411-geclassificeerde stoffen (vloeistofdichte vloer, afvangbekkens)",
     "CAP binnen 2 weken; milieucoördinator betrokken"),
]:
    row = t4.add_row()
    row.cells[0].text = label
    row.cells[1].text = label
    row.cells[2].text = desc
    row.cells[3].text = opvolging

# ── 12. Update §7.1 Rapportstructuur ──
p_rapport = find_paragraph("Gedetailleerde bevindingen per PGS 15")
if p_rapport:
    replace_paragraph_text(p_rapport, "Gedetailleerde bevindingen per PGS 15:2025 hoofdstuk, inclusief CMR-specifieke en milieu-H411 bevindingen")

# ── 13. Update §7.3 Distributie (Table 5) ──
t5 = doc.tables[5]
# Add Milieucoördinator
row = t5.add_row()
row.cells[0].text = "Milieucoördinator"
row.cells[1].text = "Digitaal (PDF)"
row.cells[2].text = "Binnen 10 werkdagen (bij milieu-gerelateerde bevindingen)"

# ── 14. Update §8.2 Termijnen (Table 6) ──
t6 = doc.tables[6]
# Add CMR row
row = t6.add_row()
row.cells[0].text = "CMR-non-conform"
row.cells[1].text = "Binnen 3 werkdagen"
row.cells[2].text = "Binnen 1 week"
row.cells[3].text = "Her-audit binnen 2 weken"
# Add milieu row
row = t6.add_row()
row.cells[0].text = "Milieu-tekortkoming"
row.cells[1].text = "Binnen 5 werkdagen"
row.cells[2].text = "Binnen 2 weken"
row.cells[3].text = "Volgende geplande audit of eerder"

# ── 15. Update §9 Bijlage A Audit Programma (Table 7) ──
t7 = doc.tables[7]
# Update existing rows to reflect new scope
set_cell_text(t7, 1, 1, "Opslagvak A — Input Chemicals")
set_cell_text(t7, 1, 2, "ADR 8 (H₂SO₄, HCl), ADR 5.1 (H₂O₂, Na₂S₂O₈), staalslakpoeder; ventilatie, scheiding, labeling")
set_cell_text(t7, 2, 1, "Opslagvak B — Intermediates")
set_cell_text(t7, 2, 2, "ADR 6.1 (natriummetavanadaat: CMR Muta.2/Repr.2, H411); trisodiumorthovanadaat; niet-ADR stoffen; CMR-protocollen")
set_cell_text(t7, 3, 1, "Opslagvak C — End Products")
set_cell_text(t7, 3, 2, "ADR 6.1 (V₂O₅: Carc.1B, H411); ADR 8 (vanadiumelektrolyt H411, natriumaluminaat); niet-ADR eindproducten")
# Update row 4 (was Documentatie)
set_cell_text(t7, 4, 2, "SDS'en 20 stoffen, RI&E, CMR-registratie, milieuvergunning H411, procedures")
# Update row 5
set_cell_text(t7, 5, 2, "Trainingsregistraties, CMR-instructie, ADR-competentie, milieu-protocollen")
# Add new rows
for nr, name, scope_text in [
    ("6", "CMR-compliance", "Carc. 1B (V₂O₅), Muta. 2 (natriummetavanadaat), Repr. 2 — gesloten opslag, blootstellingslimieten, medische controle"),
    ("7", "Milieumaatregelen H411", "Afvangbekkens, vloeistofdichte vloer, geen afvoer naar riool — natriummetavanadaat, V₂O₅, vanadiumelektrolyt"),
]:
    row = t7.add_row()
    row.cells[0].text = nr
    row.cells[1].text = name
    row.cells[2].text = scope_text
    row.cells[3].text = "[datum]"
    row.cells[4].text = "[naam]"
    row.cells[5].text = "Gepland"

# ── 16. Update §10 Bronverwijzingen ──
# Update ref [6]
p_ref6 = find_paragraph("[6] Safety Data Sheets")
if p_ref6:
    replace_paragraph_text(p_ref6, 
        "[6] Safety Data Sheets — 20 stoffen: zwavelzuur 25%, waterstofperoxide 30%, natriumpersulfaat, zoutzuur 20%, staalslakpoeder, calciumsulfaat/silica, natriumsulfaat, trisodiumorthovanadaat, natriummetavanadaat, calciumhydroxide, silica, ijzer(III)oxide, mangaan(IV)oxide, magnesiumhydroxide, natriumaluminaat, natriumfosfaat, vanadiumpentoxide, vanadiumelektrolyt")

# Update ref [7] v4.0 → v5.0
p_ref7 = find_paragraph("[7] Intern document: PM-HSE-PROC-AUD-003")
if p_ref7:
    replace_paragraph_text(p_ref7, "[7] Intern document: PM-HSE-PROC-AUD-004 v4.0 (voorgaande versie audit procedure)")

# Update ref [8] and [9]
p_ref8 = find_paragraph("[8] Intern document: Audit Checklist")
if p_ref8:
    replace_paragraph_text(p_ref8, "[8] Intern document: Audit Checklist v5.0 (PM-HSE-FORM-AUD-005)")

p_ref9 = find_paragraph("[9] Intern document: Rapport Template")
if p_ref9:
    replace_paragraph_text(p_ref9, "[9] Intern document: Rapport Template v5.0 (PM-HSE-TMPL-AUD-005)")

# Add new references
last_ref = find_paragraph("[9]")
if last_ref:
    new_refs = [
        "[10] ADR 2025 — European Agreement concerning the International Carriage of Dangerous Goods by Road",
        "[11] Richtlijn 2004/37/EG — Carcinogenen en mutagenen op het werk (CMR-richtlijn)",
        "[12] Stoffenlijst v5.0 — Meta-Dossier Pilot Plant Slag Chemicals, 6 mei 2026",
    ]
    ref_p = last_ref
    for ref in new_refs:
        np = doc.add_paragraph()
        ref_p._element.addnext(np._element)
        np.text = ref
        # Copy style
        ref_p = np

# ── 17. Add TierVerify section at end ──
end_p = find_paragraph("— Einde document —")
if end_p:
    replace_paragraph_text(end_p, "")
    tv_items = [
        ("Heading 1", "TierVerify — Verificatielog"),
        ("Normal", "Document: PGS15_Audit_Procedure_v5.0.docx"),
        ("Normal", "Datum: 6 mei 2026 | Auteur: HSEQ Manager | Status: Definitief"),
        ("Normal", ""),
        ("Normal", "Verificatiechecks:"),
        ("List Bullet", "☐ Bronverwijzingen: [1]–[12] aanwezig en traceerbaar"),
        ("List Bullet", "☐ Documentheader: Project, Type, Auteur, Versie, Datum, Status — compleet"),
        ("List Bullet", "☐ Scope update: 20 stoffen, 3 opslagvakken, 3 ADR-klassen — verwerkt"),
        ("List Bullet", "☐ CMR-criteria: Carc. 1B (V₂O₅), Muta. 2 (natriummetavanadaat), Repr. 2 — opgenomen"),
        ("List Bullet", "☐ Milieu H411: natriummetavanadaat, V₂O₅, vanadiumelektrolyt — opgenomen"),
        ("List Bullet", "☐ Correcties: H341 toegevoegd, natriumaluminaat ADR PG II, H411 vanadiumelektrolyt — verwerkt"),
        ("List Bullet", "☐ Steekproefregime: 50% minimaal, CMR altijd volledig — opgenomen"),
        ("List Bullet", "☐ Auditorbekwaamheid: ADR 5.1/6.1/8 + CMR — opgenomen"),
        ("List Bullet", "☐ Bevindingstypen: CMR-non-conform, milieu-tekortkoming — toegevoegd"),
        ("Normal", ""),
        ("Normal", "Bronnen geraadpleegd: Meta-Dossier v5.0, 18+ SDS'en, PGS 15:2025, ADR 2025, CMR-richtlijn"),
        ("Normal", "Status: ✅ Geverifieerd — gereed voor uitgifte"),
        ("Normal", ""),
        ("Normal", "— Einde document —"),
    ]
    prev = end_p
    for style, text in tv_items:
        np = doc.add_paragraph()
        prev._element.addnext(np._element)
        np.style = style
        np.text = text
        prev = np

# ── 18. Add logo to header ──
# Try to add logo to first table or create a header reference
# Add logo after title
for section in doc.sections:
    header = section.header
    if not header.paragraphs:
        header.add_paragraph()
    hp = header.paragraphs[0]
    hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    run = hp.add_run()
    run.add_picture(str(LOGO), width=Cm(2.0), height=Cm(1.8))

# ── Save ──
doc.save(str(DST))
print(f"✅ Saved: {DST}")
print(f"✅ Archived v4.0 to: {ARCHIVE}")
