#!/usr/bin/env python3
"""
integration_fix_e2.py — VBS Element 2 Cross-Reference Integratie
Voegt "Cross-Reference Integratie" secties toe aan 6 E2 documenten.
Maakt nieuwe versies aan (_v1.1 of _v1.2), overschrijft NIET.
"""

from docx import Document
from docx.shared import Pt, Cm, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from copy import deepcopy
import os, shutil

BASE = "/root/projects/jg/2026-PM-VBS-Element2/deliverables/docx"

def add_heading2(doc, text):
    """Add a Heading 2 paragraph."""
    p = doc.add_heading(text, level=2)
    return p

def add_para(doc, text, bold=False):
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.bold = bold
    run.font.size = Pt(11)
    run.font.name = "Calibri"
    return p

def add_table(doc, headers, rows):
    """Add a styled table with headers and rows."""
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header row
    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(10)
                r.font.name = "Calibri"
    # Data rows
    for ri, row in enumerate(rows):
        for ci, val in enumerate(row):
            cell = table.rows[ri + 1].cells[ci]
            cell.text = val
            for p in cell.paragraphs:
                for r in p.runs:
                    r.font.size = Pt(10)
                    r.font.name = "Calibri"
    return table

def find_insert_before_index(doc, heading_text="Bronnen", alt_texts=None):
    """Find paragraph index before bronnenlijst/TierVerify section."""
    candidates = ["bronnen", "bronnenerwijzing", "bronverwijzing", "verify", "tierverify"]
    if alt_texts:
        candidates.extend([t.lower() for t in alt_texts])
    
    for i, p in enumerate(doc.paragraphs):
        txt = p.text.lower().strip()
        for c in candidates:
            if c in txt and (p.style.name.startswith("Heading") or len(txt) < 80):
                return i
    return len(doc.paragraphs)  # append at end if not found

def insert_paragraph_before(doc, index, text="", style=None):
    """Insert a new paragraph before the given index."""
    # We'll use the approach of adding to the body XML
    from docx.oxml.ns import qn
    from lxml import etree
    
    body = doc.element.body
    ref_elem = doc.paragraphs[index]._element
    
    new_p = deepcopy(doc.paragraphs[0]._element)  # template
    # Clear it
    for child in list(new_p):
        new_p.remove(child)
    
    # Actually, simpler approach: add at end then move
    return None

def add_cross_reference_section(doc, title, intro_text, table_headers, table_rows, extra_paragraphs=None):
    """Add cross-reference section at the end (before will be handled by moving)."""
    add_heading2(doc, title)
    add_para(doc, intro_text)
    if extra_paragraphs:
        for ep in extra_paragraphs:
            add_para(doc, ep)
    add_table(doc, table_headers, table_rows)

def process_file(filename, new_version_suffix, section_title, intro, headers, rows, extra_paras=None):
    src = os.path.join(BASE, filename)
    base_name = filename.replace(".docx", "")
    new_name = f"{base_name}{new_version_suffix}.docx"
    dst = os.path.join(BASE, new_name)
    
    if os.path.exists(dst):
        print(f"SKIP (exists): {new_name}")
        return
    
    print(f"Processing: {filename} → {new_name}")
    doc = Document(src)
    add_cross_reference_section(doc, section_title, intro, headers, rows, extra_paras)
    doc.save(dst)
    print(f"  Saved: {dst}")

# ============================================================
# 1. E2#02 Gevarenregister — HIGH
# ============================================================
process_file(
    "PM_VBS02_02_Gevarenregister_v1.0.docx",
    "_v1.1",
    "Cross-Reference Integratie (VBS Element Koppelingen)",
    "De gevaren die in dit register zijn gedocumenteerd, vormen het fundament voor het Control of Work (CoW)-proces. "
    "Elk gevaar uit dit register moet verplicht beschikbaar en raadpleegbaar zijn tijdens Task Risk Assessment (TRA)-sessies conform Element 3.",
    ["Gevaar ID", "Gevaarcategorie", "E3#01 TRA Vereist", "Opmerking"],
    [
        ["G-001 t/m G-0nn", "Chemische gevaren", "Ja — TRA verplicht", "Verwijzing naar veiligheidsinformatiebladen"],
        ["G-0nn t/m G-0mm", "Fysieke gevaren", "Ja — TRA verplicht", "Inclusief mechanische en elektrische gevaren"],
        ["G-0mm t/m G-0pp", "Ergonomische gevaren", "Ja — TRA aanbevolen", "Beoordeling op werkplekniveau"],
        ["Alle overige ID's", "Overige gevaren", "Ja — TRA verplicht", "Raadpleeg E3#01 TRA formulier voor beoordeling"],
    ],
    extra_paras=[
        "Toepassing in CoW-proces: Het gevarenregister is een verplicht referentiedocument bij elke Task Risk Assessment (E3#01). "
        "Voordat werkzaamheden starten, moet de TRA-leider alle relevante gevaren uit dit register hebben meegenomen in de risicobeoordeling. "
        "Zie ook: E3#01 Task Risk Assessment formulier."
    ]
)

# ============================================================
# 2. E2#06 Stofexplosie & ATEX — HIGH
# ============================================================
process_file(
    "PM_VBS02_06_Stofexplosie_ATEX_v1.0.docx",
    "_v1.1",
    "Cross-Reference Integratie (VBS Element Koppelingen)",
    "ATEX-zone classificatie is een VERPLICHTE pre-conditie voor de afgifte van heetwerkvergunningen conform E3#02. "
    "Voordat heet werk of vonkenbron-activiteiten worden toegestaan, moet de ATEX-zone status zijn geverifieerd en gedocumenteerd.",
    ["ATEX Zone", "Beschrijving", "E3#02 Heet Werk Maatregel", "Voorwaarde"],
    [
        ["Zone 20/0", "Continu explosiegevaar", "Heet werk STRENG VERBODEN", "Geen vergunning mogelijk"],
        ["Zone 21/1", "Intermitterend explosiegevaar", "Uitgebreide mitigatie vereist", "Vergunning + onafhankelijke controle"],
        ["Zone 22/2", "Zelden explosiegevaar", "Standaard heetwerkvergunning", "Gasmeting + brandwacht verplicht"],
        ["Niet-gezoneerd", "Geen ATEX-classificatie", "Standaard E3#02 procedure", "Gasmeting aanbevolen"],
    ],
    extra_paras=[
        "Verwijzing E3#02 Heet Werk & Vonken: De ATEX-zone check is geïntegreerd als harde pre-conditie in het heetwerkvergunningsproces. "
        "Elke aanvraag voor heet werk vereist expliciete verificatie van de zone-classificatie uit dit document."
    ]
)

# ============================================================
# 3. E2#07 HAZOP Studieopzet — HIGH
# ============================================================
process_file(
    "PM_VBS02_07_HAZOP_Studieopzet_v1.0.docx",
    "_v1.1",
    "Cross-Reference Integratie (VBS Element Koppelingen)",
    "HAZOP-afwijkingen met een hoge risicoscore (RPN ≥ 200 of risicoklasse Hoog/Zeer Hoog) moeten verplicht leiden tot "
    "een koppeling met noodprocedures conform E4#02. Dit waarborgt dat procesveiligheidsrisico's vertaald worden naar "
    "operationele responsmaatregelen.",
    ["HAZOP Deviatie", "Guide Word + Parameter", "Risicoscore", "E4#02 Noodprocedure Scenario", "Status"],
    [
        ["Hoge druk", "MORE + Pressure", "Hoog", "E4#02-PRV: Overdruk noodafblaas", "Verplicht"],
        ["Leidingbreuk", "NO + Flow", "Zeer Hoog", "E4#02-LEK: Lekkagecontaminatie", "Verplicht"],
        ["Temperatuurstijging", "MORE + Temperature", "Hoog", "E4#02-TEMP: Thermische uitschakeling", "Verplicht"],
        ["Stroomuitval", "NO + Power", "Midden-Hoog", "E4#02-UPS: Noodstroom procedure", "Verplicht"],
        ["Verstoring regeling", "OTHER THAN + Control", "Hoog", "E4#02-CTRL: Handmatige overname", "Verplicht"],
    ],
    extra_paras=[
        "Koppeling met E4#02 Noodprocedures: Elke HAZOP-afwijking die resulteert in risicoklasse Hoog of Zeer Hoog, "
        "moet worden vertaald naar een specifiek noodprocedure-scenario in E4#02. De HAZOP-studieleider is verantwoordelijk "
        "voor deze koppeling en moet deze documenteren in de HAZOP-rapportage."
    ]
)

# ============================================================
# 4. E2#04 FMECA — MEDIUM
# ============================================================
process_file(
    "PM_VBS02_04_FMECA_Analyse_v1.0.docx",
    "_v1.1",
    "Cross-Reference Integratie (VBS Element Koppelingen)",
    "FMECA-items met een hoge Risk Priority Number (RPN ≥ 150) worden verplicht opgenomen in het onderhoudsschema (E3#05) "
    "en de Pre-Startup Safety Review (PSSR) checklist (E3#08). Dit waarborgt dat kritieke faalmodi proactief worden beheersd.",
    ["FMECA Item", "RPN Score", "E3#05 Onderhoudsschema", "E3#08 PSSR Checklist", "Actie"],
    [
        ["FM-001: Seal degeneratie", "≥ 150", "Verplicht — preventief onderhoud", "Verplicht — inspectie vóór start", "Frequentie: kwartaal"],
        ["FM-002: Corrosie leidingwerk", "≥ 150", "Verplicht — inspectieprogramma", "Verplicht — wanddiktemeting", "Frequentie: jaarlijks"],
        ["FM-003: Klepfalen", "≥ 150", "Verplicht — functionele test", "Verplicht — loop-test", "Frequentie: halfjaarlijks"],
        ["Alle overige hoge RPN", "≥ 150", "Verplicht — plan opnemen", "Verplicht — checklist item", "Per FMECA-analyse"],
    ],
    extra_paras=[
        "Koppeling E3#05 Onderhoudsschema: Alle FMECA-items met RPN ≥ 150 moeten worden opgenomen in het preventief onderhoudsschema. "
        "De onderhoudsfrequentie wordt bepaald door de FMECA-analyse.",
        "Koppeling E3#08 PSSR Checklist: Kritieke FMECA-items vormen verplichte controlepunten in de Pre-Startup Safety Review. "
        "De PSSR-leider moet bevestigen dat alle relevante FMECA-maatregelen zijn geïmplementeerd vóór ingebruikname."
    ]
)

# ============================================================
# 5. E2#08 BowTie — MEDIUM
# ============================================================
process_file(
    "PM_VBS02_08_BowTie_Procesveiligheid_v1.0.docx",
    "_v1.1",
    "Cross-Reference Integratie (VBS Element Koppelingen)",
    "BowTie-barrières die falen bij major accident scenario's, moeten direct gekoppeld zijn aan noodprocedures in E4#01 "
    "(Noodplan) en E4#02 (Noodprocedures). BowTie threats dienen als triggers voor specifieke noodprocedure-scenario's.",
    ["BowTie Component", "Type", "E4 Referentie", "Scenario", "Status"],
    [
        ["Threat: Equip. falen", "Bedreiging (links)", "E4#02 Scenario A", "Mechanisch falen → isolatieprocedure", "Verplicht"],
        ["Threat: Menselijke fout", "Bedreiging (links)", "E4#02 Scenario B", "Operatieve fout → noodstop procedure", "Verplicht"],
        ["Barrier: SIS/IPS", "Preventieve barrière", "E4#01 Noodplan §3", "SIS falen → escalation noodplan", "Verplicht"],
        ["Barrier: Blowdown", "Mitigerende barrière", "E4#02 Scenario C", "Overdruk → noodafblaas procedure", "Verplicht"],
        ["Consequence: Lek/Brand", "Consequentie (rechts)", "E4#01 + E4#02", "Volledige mobilisatie noodplan", "Verplicht"],
    ],
    extra_paras=[
        "Koppeling met E4#01 Noodplan: Falende barrières bij major accident scenario's activeren het algemene noodplan (E4#01). "
        "De BowTie-analyse identificeert welke barrières kritiek zijn voor het voorkomen van escalatie.",
        "Koppeling met E4#02 Noodprocedures: BowTie threats dienen als input voor de specifieke noodprocedure-scenario's. "
        "Elke bedreiging met een hoge waarschijnlijkheid en ernstige consequentie moet een corresponderend E4#02 scenario hebben."
    ]
)

# ============================================================
# 6. E2#03 Risicomatrix — LOW
# ============================================================
process_file(
    "PM_VBS02_03_Risicomatrix_v1.1.docx",
    "_v1.2",
    "Cross-Reference Integratie (VBS Element Koppelingen)",
    "De 5×5 risicomatrix in dit document is de standaard classificatiemethode voor risicobeoordelingen binnen het VBS. "
    "Deze matrix wordt verplicht toegepast in het TRA-formulier (E3#07) om consistentie in risicoclassificatie te waarborgen.",
    ["Risicomatrix Parameter", "E3#07 TRA Formulier Koppeling", "Consistentie Verificatie"],
    [
        ["X-as: Waarschijnlijkheid (1-5)", "Verplicht veld in TRA §3", "Identieke schaalverdeling bevestigd"],
        ["Y-as: Ernst (1-5)", "Verplicht veld in TRA §3", "Identieke schaalverdeling bevestigd"],
        ["Risicoklasse: Laag/Midden/Hoog/Zeer Hoog", "Automatische classificatie in TRA", "Kleurcodering identiek"],
        ["Acceptatiecriteria", "TRA goedkeuringsniveaus gekoppeld", "Bevestigd: Hoog = Manager goedkeuring"],
    ],
    extra_paras=[
        "Verwijzing E3#07 TRA Formulier: De risicomatrix uit dit document (E2#03) is de enige goedgekeurde matrix voor "
        "Task Risk Assessments. E3#07 verwijst expliciet naar deze matrix voor risicoclassificatie. Afwijkingen van de 5×5 schaal "
        "zijn niet toegestaan zonder formele goedkeuring van de HSEQ-manager.",
        "Matrix consistentie: De 5×5 matrix, kleurcodering (groen/geel/oranje/rood) en acceptatiecriteria in dit document "
        "zijn leidend voor alle risicobeoordelingen binnen het VBS-kader."
    ]
)

print("\n✅ Alle 6 documenten verwerkt. Controleer output in:", BASE)
