#!/usr/bin/env python3
"""
integration_fix_e1.py — HQ_04 Technical Writer
Voegt cross-referenties toe aan VBS Element 1 documenten (E1 ↔ E2/E3/E4).
"""

import re, os, copy
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

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

# Document definitions: (filename_pattern, cross_refs)
# cross_refs = list of (ref_code, element_name, description)
DOCS = [
    {
        "pattern": "PM_VBS01_04_Training_Matrix_v1.2.docx",
        "version": "1.3",
        "refs": [
            ("E3#01", "Control of Work", "Verplichte CoW-training voor alle medewerkers"),
            ("E4#03", "BHV Organisatie", "BHV-training en hercertificering"),
            ("E4#07", "Oefenprogramma", "Jaarlijkse oefen-deelname verplicht"),
            ("E2#01", "Stofinventarisatie", "H\u2082SO\u2084 en V\u2082O\u2085 veiligheidstraining"),
        ],
    },
    {
        "pattern": "PM_VBS01_07_Competentie_Assessment_v1.1.docx",
        "version": "1.2",
        "refs": [
            ("E2#02", "Gevarenregister", "Toetsing gevarenregister-kennis"),
            ("E3#01", "Control of Work", "Toetsing CoW-procedurekennis"),
            ("E2#02", "Gevarenregister", "Minimumeis: medewerker moet gevaren kunnen benoemen"),
        ],
    },
    {
        "pattern": "PM_VBS01_11_Veiligheidsprestatie_Indicatoren_v1.1.docx",
        "version": "1.2",
        "refs": [
            ("E3#10", "KPI Matrix", "Operationele KPI\u2019s integratie"),
            ("E4#07", "Oefenprogramma", "Noodresponse responsetijd-KPI"),
            ("E4#05", "Crisiscommunicatie", "Noodresponse communicatie-KPI"),
        ],
    },
    {
        "pattern": "PM_VBS01_12_Communicatie_Meldingsprocedure_v1.1.docx",
        "version": "1.2",
        "refs": [
            ("E4#05", "Crisiscommunicatie", "Koppeling escalatieprocedure met crisiscommunicatie"),
            ("E4#05", "Crisiscommunicatie", "Drempelwaarden voor escalatie routine \u2192 crisis"),
        ],
    },
    {
        "pattern": "PM_VBS01_05_Inwerkprogramma_v1.2.docx",
        "version": "1.3",
        "refs": [
            ("E2#01", "Stofinventarisatie", "Verwijzing stofspecifieke inwerkmodule"),
            ("E3#03", "Gevaarlijke Stoffen", "Omgaan met gevaarlijke stoffen tijdens inwerk"),
            ("E4#04", "Evacuatieplan", "Evacuatieprocedure als onderdeel inwerkprogramma"),
        ],
    },
    {
        "pattern": "PM_VBS01_06_Toolbox_Meeting_Procedure_v1.1.docx",
        "version": "1.2",
        "refs": [
            ("E2#02", "Gevarenregister", "Verplichte input: gevarenregister als bron voor toolbox-onderwerpen"),
        ],
    },
    {
        "pattern": "PM_VBS01_10_Procedure_Onderaannemers_v1.1.docx",
        "version": "1.2",
        "refs": [
            ("E3#01", "Control of Work", "CoW-procedurevereisten voor onderaannemers"),
            ("E3#07", "Arbeidsomstandigheden", "Arbeidsomstandigheden-eisen derden"),
            ("E4#04", "Evacuatieplan", "Evacuatieverantwoordelijkheden onderaannemers"),
        ],
    },
]


def bump_filename(fname, new_version):
    """Replace version in filename."""
    return re.sub(r'_v[\d.]+\.docx$', f'_v{new_version}.docx', fname)


def find_insert_index(doc):
    """Find insertion point: before Bronnenlijst or TierVerify section, or at end."""
    for i, p in enumerate(doc.paragraphs):
        text = p.text.strip().lower()
        if any(kw in text for kw in ['bronnenlijst', 'tierverify', 'bronverwijzing', 'tier verify']):
            return i
    return len(doc.paragraphs)


def add_cross_ref_section(doc, refs, insert_idx):
    """Add heading + table at insert_idx."""
    # We need to work with the XML directly to insert at the right position
    from docx.oxml.ns import qn
    
    body = doc.element.body
    
    # Find the element at insert_idx
    all_paragraphs = doc.paragraphs
    if insert_idx < len(all_paragraphs):
        ref_element = all_paragraphs[insert_idx]._element
    else:
        ref_element = None
    
    # Create heading
    heading = doc.add_heading('Cross-Reference Integratie (VBS Element Koppelingen)', level=2)
    
    # Create intro paragraph
    intro = doc.add_paragraph()
    intro_run = intro.add_run(
        'Onderstaande tabel bevat de ge\u00efntegreerde cross-referenties tussen dit Element 1-document '
        'en gerelateerde documenten uit Element 2, 3 en 4 van het VBS.'
    )
    intro_run.font.size = Pt(11)
    intro_run.font.name = 'Calibri'
    
    # Create table
    table = doc.add_table(rows=1, cols=3)
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    
    # Header row
    hdr = table.rows[0]
    for i, text in enumerate(['Referentie', 'Element', 'Beschrijving']):
        cell = hdr.cells[i]
        cell.text = ''
        run = cell.paragraphs[0].add_run(text)
        run.bold = True
        run.font.size = Pt(10)
        run.font.name = 'Calibri'
        run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
        # Dark blue background
        from docx.oxml import OxmlElement
        shading = OxmlElement('w:shd')
        shading.set(qn('w:fill'), '003366')
        shading.set(qn('w:val'), 'clear')
        cell._element.get_or_add_tcPr().append(shading)
    
    # Data rows
    for ref_code, element_name, desc in refs:
        row = table.add_row()
        for i, text in enumerate([ref_code, element_name, desc]):
            cell = row.cells[i]
            cell.text = ''
            run = cell.paragraphs[0].add_run(text)
            run.font.size = Pt(10)
            run.font.name = 'Calibri'
    
    # Move all new elements before ref_element
    new_elements = [heading._element, intro._element, table._element]
    if ref_element is not None:
        for elem in reversed(new_elements):
            body.remove(elem)
            body.insert(body.index(ref_element), elem)
    
    return doc


def process_doc(doc_config):
    pattern = doc_config["pattern"]
    new_version = doc_config["version"]
    refs = doc_config["refs"]
    
    src_path = os.path.join(BASE, pattern)
    if not os.path.exists(src_path):
        print(f"⚠️  Niet gevonden: {src_path}")
        return False
    
    doc = Document(src_path)
    insert_idx = find_insert_index(doc)
    
    # Update version in document header if present
    for p in doc.paragraphs[:10]:
        if 'Versie' in p.text and any(ch.isdigit() for ch in p.text):
            for run in p.runs:
                if re.search(r'v?[\d.]+', run.text):
                    old_ver_match = re.search(r'(v?)([\d.]+)', run.text)
                    if old_ver_match:
                        run.text = run.text.replace(old_ver_match.group(0), 
                                                    f'{old_ver_match.group(1)}{new_version}')
                        break
            break
    
    add_cross_ref_section(doc, refs, insert_idx)
    
    new_fname = bump_filename(pattern, new_version)
    dst_path = os.path.join(BASE, new_fname)
    doc.save(dst_path)
    print(f"✅ {new_fname} ({len(refs)} cross-refs)")
    return True


if __name__ == "__main__":
    print("=" * 60)
    print("VBS Element 1 — Cross-Reference Integratie Fix")
    print("=" * 60)
    
    ok = 0
    for cfg in DOCS:
        if process_doc(cfg):
            ok += 1
    
    print(f"\nVoltooid: {ok}/{len(DOCS)} documenten verwerkt.")
