#!/usr/bin/env python3
"""Generate PM_VBS05_06_RASCI_Rollenmatrix_v1.0.docx"""

from docx import Document
from docx.shared import Inches, Cm, Pt, Emu, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
import os

OUTPUT = "/root/projects/jg/2026-PM-VBS-Element5/deliverables/docx/PM_VBS05_06_RASCI_Rollenmatrix_v1.0.docx"
LOGO = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"

doc = Document()

# --- Styles ---
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
style.font.color.rgb = RGBColor(0x1F, 0x29, 0x37)
style.paragraph_format.space_after = Pt(4)

for lvl in range(1, 4):
    hs = doc.styles[f'Heading {lvl}']
    hs.font.name = 'Calibri'
    hs.font.bold = True
    hs.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
    hs.font.size = Pt(14) if lvl == 1 else Pt(13) if lvl == 2 else Pt(12)

PRIMARY = RGBColor(0x00, 0x33, 0x66)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)

def set_cell_shading(cell, color_hex):
    shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color_hex}" w:val="clear"/>')
    cell._tc.get_or_add_tcPr().append(shading)

def set_cell(cell, text, bold=False, font_size=9, color=None, bg=None, alignment=WD_ALIGN_PARAGRAPH.LEFT):
    cell.text = ""
    p = cell.paragraphs[0]
    p.alignment = alignment
    run = p.add_run(text)
    run.font.name = 'Calibri'
    run.font.size = Pt(font_size)
    run.font.bold = bold
    if color:
        run.font.color.rgb = color
    if bg:
        set_cell_shading(cell, bg)

def header_row(table, row_idx, texts, bg="003366"):
    for i, t in enumerate(texts):
        set_cell(table.cell(row_idx, i), t, bold=True, font_size=9, color=WHITE, bg=bg, alignment=WD_ALIGN_PARAGRAPH.CENTER)

def add_table_borders(table):
    tbl = table._tbl
    tblPr = tbl.tblPr if tbl.tblPr is not None else parse_xml(f'<w:tblPr {nsdecls("w")}/>')
    borders = parse_xml(
        f'<w:tblBorders {nsdecls("w")}>'
        '<w:top w:val="single" w:sz="4" w:space="0" w:color="BFBFBF"/>'
        '<w:left w:val="single" w:sz="4" w:space="0" w:color="BFBFBF"/>'
        '<w:bottom w:val="single" w:sz="4" w:space="0" w:color="BFBFBF"/>'
        '<w:right w:val="single" w:sz="4" w:space="0" w:color="BFBFBF"/>'
        '<w:insideH w:val="single" w:sz="4" w:space="0" w:color="BFBFBF"/>'
        '<w:insideV w:val="single" w:sz="4" w:space="0" w:color="BFBFBF"/>'
        '</w:tblBorders>'
    )
    tblPr.append(borders)

# ====== COVER PAGE ======
for _ in range(4):
    doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("JvG Consultancy")
run.font.size = Pt(28)
run.font.bold = True
run.font.color.rgb = PRIMARY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Safety • Governance • Advisory")
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(0x6B, 0x72, 0x80)

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Management of Change")
run.font.size = Pt(22)
run.font.bold = True
run.font.color.rgb = PRIMARY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("RASCI Rollenmatrix")
run.font.size = Pt(20)
run.font.color.rgb = PRIMARY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("BRZO Element IV — VBS Element 5")
run.font.size = Pt(13)
run.font.color.rgb = RGBColor(0x6B, 0x72, 0x80)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Phoenix Metals")
run.font.size = Pt(16)
run.font.bold = True
run.font.color.rgb = PRIMARY

for _ in range(3):
    doc.add_paragraph()

# Document header info
info_table = doc.add_table(rows=6, cols=2)
info_table.alignment = WD_TABLE_ALIGNMENT.CENTER
info_data = [
    ("Project:", "Phoenix Metals — VBS Element 5: Management of Change"),
    ("Type:", "RASCI Rollenmatrix (Doc 6/6)"),
    ("Auteur:", "JvG Consultancy"),
    ("Versie:", "1.0"),
    ("Datum:", "29 april 2026"),
    ("Status:", "Definitief"),
]
for i, (k, v) in enumerate(info_data):
    set_cell(info_table.cell(i, 0), k, bold=True, font_size=10, color=PRIMARY)
    set_cell(info_table.cell(i, 1), v, font_size=10)

doc.add_page_break()

# ====== DOCUMENTBEHEERSING ======
doc.add_heading("Documentbeheersing", level=1)
doc.add_heading("Versiebeheer", level=2)
vt = doc.add_table(rows=2, cols=4)
add_table_borders(vt)
header_row(vt, 0, ["Versie", "Datum", "Auteur", "Wijziging"])
vr = vt.rows[1]
for i, t in enumerate(["1.0", "29-04-2026", "JvG Consultancy", "Initiële versie"]):
    set_cell(vr.cells[i], t, font_size=9)

doc.add_heading("Distributielijst", level=2)
dt = doc.add_table(rows=5, cols=3)
add_table_borders(dt)
header_row(dt, 0, ["Functie", "Naam", "Distributie"])
dist = [
    ("Directie", "TBD", "Goedkeuring"),
    ("MoC-coördinator / HSE Manager", "TBD", "Implementatie"),
    ("Operations Manager", "TBD", "Implementatie"),
    ("Maintenance Manager", "TBD", "Implementatie"),
]
for i, (f, n, d) in enumerate(dist):
    for j, t in enumerate([f, n, d]):
        set_cell(dt.rows[i+1].cells[j], t, font_size=9)

doc.add_heading("Inhoudsopgave", level=1)
toc_items = [
    "1. Inleiding",
    "2. Roldefinities",
    "3. Bevoegdheidsmatrix",
    "4. RASCI Matrix",
    "5. Competentie-eisen",
    "6. Escalatieprotocol",
    "7. Afwezigheid & Vervanging",
    "Bronnenlijst",
    "TierVerify Log",
]
for item in toc_items:
    p = doc.add_paragraph(item)
    p.paragraph_format.space_after = Pt(2)

doc.add_page_break()

# ====== H1: INLEIDING ======
doc.add_heading("1. Inleiding", level=1)
doc.add_heading("1.1 Doel", level=2)
doc.add_paragraph(
    "Dit document definieert de RASCI-rollenmatrix voor het Management of Change (MoC) proces bij Phoenix Metals. "
    "De matrix legt verantwoordelijkheden, bevoegdheden en communicatielijnen vast voor elke fase van het MoC-proces, "
    "van initiatie tot en met afsluiting."
)
doc.add_paragraph(
    "De RASCI-rollenmatrix is een operationeel instrument dat aansluit bij het beleidskader (Doc 1, §7 — Beleidsverantwoordelijkheden) [1] "
    "en de MoC-procedure (Doc 2) [2]. Het zorgt voor eenduidige taakverdeling en elimineert ambiguïteit over wie welke beslissing neemt."
)

doc.add_heading("1.2 RASCI-definitie", level=2)
rasci_def = doc.add_table(rows=6, cols=3)
add_table_borders(rasci_def)
header_row(rasci_def, 0, ["Code", "Rol", "Betekenis"])
defs = [
    ("R", "Responsible", "Voert de taak uit; is verantwoordelijk voor de uitvoering"),
    ("A", "Accountable", "Eindverantwoordelijk; keurt goed en draagt eindverantwoordelijkheid"),
    ("S", "Supportive", "Ondersteunt de uitvoering met expertise of middelen"),
    ("C", "Consulted", "Wordt geraadpleegd vóór besluitvorming (tweerichtingsverkeer)"),
    ("I", "Informed", "Wordt geïnformeerd na besluitvorming (eenrichtingsverkeer)"),
]
for i, (c, r, b) in enumerate(defs):
    set_cell(rasci_def.rows[i+1].cells[0], c, bold=True, font_size=9, color=PRIMARY, alignment=WD_ALIGN_PARAGRAPH.CENTER)
    set_cell(rasci_def.rows[i+1].cells[1], r, bold=True, font_size=9)
    set_cell(rasci_def.rows[i+1].cells[2], b, font_size=9)

doc.add_page_break()

# ====== H2: ROLDEFINITIES ======
doc.add_heading("2. Roldefinities", level=1)
doc.add_paragraph(
    "Het MoC-proces kent acht gedefinieerde rollen. Elke rol wordt hieronder uitgebreid beschreven met verantwoordelijkheden, "
    "bevoegdheden en rapportagelijnen."
)

roles = [
    ("2.1", "Directie", [
        "Eindverantwoordelijk voor het MoC-beleid en -proces binnen de gehele organisatie",
        "Goedkeuring van wijzigingen geclassificeerd als Hoog of Kritiek risiconiveau",
        "Kwartaalreview van MoC-KPI's en trendanalyse via het MoC-dashboard (Doc 5) [3]",
        "Primair escalatiepunt voor onoplosbare geschillen binnen het MoC-team",
        "Toewijzing van budget en middelen voor MoC-gerelateerde investeringen",
        "Goodkeuring van het jaarlijkse MoC-trainingsplan",
    ]),
    ("2.2", "MoC-coördinator / HSE Manager", [
        "Dagelijks beheer van het MoC-proces; eerste aanspreekpunt voor alle MoC-aangelegenheden",
        "Voorzitter van het MoC-beoordelingsteam; leidt waardigheidstoets en risicoclassificatie",
        "Beheer van het MoC-register en dashboard (Doc 5) [3]; waarborgt actualiteit en integriteit",
        "Rapportage van MoC-KPI's (doorlooptijd, afwijzingspercentage, openstaande acties) aan Directie",
        "Archivering van volledige MoC-dossiers conform retention policy",
        "Coördinatie van MoC-training en competentieontwikkeling; verwijzing naar VBS01_04 [4]",
        "Bevoegd voor goedkeuring van Laag en Gemiddeld risiconiveau wijzigingen",
        "Toezicht op tijdige afsluiting van actiepunten en evaluaties",
    ]),
    ("2.3", "MoC-teamlid Operations", [
        "Beoordeelt operationele impact van voorgestelde wijzigingen op productieprocessen",
        "Levert risico-input vanuit operationeel perspectief (productstilstand, logistiek, planning)",
        "Beoordeelt uitvoerbaarheid van voorgestelde wijzigingen in de praktijk",
        "Benoemt interacties met lopende operationele activiteiten en gelijktijdige werkzaamheden",
        "vertegenwoordigt de werkvloer bij veiligheidsstudies (HAZOP, What-If)",
    ]),
    ("2.4", "MoC-teamlid Maintenance & Reliability", [
        "Beoordeelt technische impact op installatie-integriteit en betrouwbaarheid",
        "Initieert en coördineert Pre-Startup Safety Reviews (PSSR) waar vereist",
        "Beoordeelt impact op onderhoudsstrategie, reserveonderdelen en inspectieprogramma's",
        "Input op technische haalbaarheid en benodigde modificaties aan installaties",
        "Verwijdert of actualiseert technische documentatie en P&ID's",
    ]),
    ("2.5", "MoC-teamlid HSE", [
        "Beoordeelt veiligheids- en milieu-impact van voorgestelde wijzigingen",
        "Toetst wijzigingen aan geldende wet- en regelgeving (BRZO, Arbowet, Omgevingswet)",
        "Bepaalt het benodigde type veiligheidsstudie (HAZOP, LOPA, What-If, FMEA) op basis van risiconiveau",
        "Koppelt wijzigingen aan de Risico-Inventarisatie & -Evaluatie (RI&E) [5]",
        "Bewaakt naleving van veiligheidsmaatregelen tijdens implementatie",
    ]),
    ("2.6", "Aanvrager / Initiator", [
        "Dient het MoC-verzoek in via het gestandaardiseerde formulier (Doc 4) [6]",
        "Levert alle benodigde informatie: technische specificaties, risico-inschatting, rationale",
        "Voert goedgekeurde wijzigingen uit conform de vastgestelde implementatieplanning",
        "Behandelt toegewezen actiepunten binnen gestelde termijnen",
        "Draagt bij aan de evaluatie na implementatie (effectmeting, lessen)",
    ]),
    ("2.7", "Operationeel Management / Shift Supervisors", [
        "Communicatie van goedgekeurde wijzigingen naar de werkvloer (toolbox meetings, shift-overdracht)",
        "Toezicht op naleving van nieuwe werkinstructies en procedures",
        "Praktijkinput over werkbare uitvoering en mogelijke knelpunten",
        "Melding van afwijkingen of onvoorziene effecten na implementatie",
        "Waarborgt dat medewerkers op de hoogte zijn van actieve MoC's in hun werkgebied",
    ]),
    ("2.8", "Externe Deskundige", [
        "Levert specifieke expertise die intern niet beschikbaar is (bijv. procesveiligheid, metallurgie, explosieveiligheid)",
        "Geeft advies; neemt geen besluiten — besluitbevoegdheid blijft bij het MoC-team",
        "Rapporteert bevindingen schriftelijk; output wordt onderdeel van het MoC-dossier",
        "Wordt ingeschakeld bij Hoog en Kritiek risiconiveau of bij complexe veiligheidsstudies",
        "Voldoet aan de competentie-eisen zoals vastgelegd in dit document (§5)",
    ]),
]

for num, title, items in roles:
    doc.add_heading(f"{num} {title}", level=2)
    for item in items:
        p = doc.add_paragraph(item, style='List Bullet')

doc.add_page_break()

# ====== H3: BEVOEGDHEIDSMATRIX ======
doc.add_heading("3. Bevoegdheidsmatrix", level=1)
doc.add_paragraph(
    "De bevoegdheidsmatrix definieert wie bevoegd is voor welke beslissing binnen het MoC-proces, "
    "inclusief escalatiebij het bereiken van drempelwaarden."
)

decisions = [
    ("MoC-waardigheids­toets", "MoC-coördinator", "Classificeert of een wijziging MoC-waardig is", "Directie bij twijfel"),
    ("Risiconiveau­bepaling", "MoC-team (consensus)", "Bepaalt Laag/Gemiddeld/Hoog/Kritiek", "Directie bij Hoog/Kritiek"),
    ("Go/No-Go besluit (Laag)", "MoC-coördinator", "Enkelvoudige goedkeuring", "—"),
    ("Go/No-Go besluit (Gemiddeld)", "MoC-coördinator + betrokken teamleider", "Dubbele goedkeuring", "Directie"),
    ("Go/No-Go besluit (Hoog)", "Directie", "Formele directiegoedkeuring vereist", "—"),
    ("Go/No-Go besluit (Kritiek)", "Directie + externe deskundige", "Goedkeuring met extern advies", "—"),
    ("Ingebruikname (PSSR)", "Maintenance Manager + MoC-coördinator", "PSSR afronding vereist", "Directie bij afwijkingen"),
    ("Spoed-MoC goedkeuring", "MoC-coördinator + Shift Supervisor", "Mondeling + schriftelijk binnen 48u", "Directie achteraf"),
    ("Afsluiting MoC", "MoC-coördinator", "Alle acties afgerond, evaluatie compleet", "Directie bij escalatie"),
]

bm = doc.add_table(rows=len(decisions)+1, cols=4)
add_table_borders(bm)
header_row(bm, 0, ["Beslissing", "Bevoegde(n)", "Voorwaarde", "Escalatie"])
for i, (b, bevoegd, vw, esc) in enumerate(decisions):
    set_cell(bm.rows[i+1].cells[0], b, bold=True, font_size=8)
    set_cell(bm.rows[i+1].cells[1], bevoegd, font_size=8)
    set_cell(bm.rows[i+1].cells[2], vw, font_size=8)
    set_cell(bm.rows[i+1].cells[3], esc, font_size=8)

doc.add_page_break()

# ====== H4: RASCI MATRIX ======
doc.add_heading("4. RASCI Matrix", level=1)
doc.add_paragraph(
    "De RASCI-matrix hieronder toont de verantwoordelijkheden voor negen MoC-fasen versus acht rollen. "
    "Kleurcodering: R = Responsible (donkerblauw), A = Accountable (rood), S = Supportive (groen), "
    "C = Consulted (geel), I = Informed (grijs)."
)

RASCI_COLORS = {
    'R': ("003366", WHITE),
    'A': ("DC2626", WHITE),
    'S': ("10B981", WHITE),
    'C': ("F59E0B", RGBColor(0x1F, 0x29, 0x37)),
    'I': ("6B7280", WHITE),
}

roles_short = ["Directie", "MoC-coörd.\n/HSE Mgr", "Operations", "Maint. &\nReliability", "HSE", "Aanvrager", "Op. Mgmt /\nShift Superv.", "Ext.\nDeskundige"]
phases = [
    "1. Initiatie & aanvraag",
    "2. MoC-waardigheidstoets",
    "3. Risicoclassificatie",
    "4. Veiligheidsstudie",
    "5. Go/No-Go besluit",
    "6. Implementatie",
    "7. PSSR / Ingebruikname",
    "8. Evaluatie & afsluiting",
    "9. Archivering",
]

# RASCI data: 9 phases × 8 roles
rasci_data = [
    # Directie, MoC-coord, Ops, Maint, HSE, Aanvrager, OpMgmt, Ext
    ["I", "C", "I", "I", "I", "R", "I", "—"],       # Initiatie
    ["I", "R/A", "C", "C", "C", "I", "C", "—"],      # Waardigheidstoets
    ["I", "R", "S", "S", "S", "C", "C", "C"],         # Risicoclassificatie
    ["C", "R", "S", "S", "S", "C", "C", "S"],         # Veiligheidsstudie
    ["A", "R", "C", "C", "C", "I", "I", "C"],         # Go/No-Go
    ["I", "R", "S", "S", "C", "A", "S", "—"],         # Implementatie
    ["I", "R", "C", "R", "S", "A", "I", "C"],         # PSSR
    ["I", "R", "C", "C", "C", "S", "C", "—"],         # Evaluatie
    ["I", "R/A", "I", "I", "I", "I", "I", "I"],       # Archivering
]

rasci_tbl = doc.add_table(rows=len(phases)+1, cols=len(roles_short)+1)
add_table_borders(rasci_tbl)
rasci_tbl.alignment = WD_TABLE_ALIGNMENT.CENTER

# Header
set_cell(rasci_tbl.cell(0, 0), "MoC-fase", bold=True, font_size=7, color=WHITE, bg="003366", alignment=WD_ALIGN_PARAGRAPH.CENTER)
for j, rs in enumerate(roles_short):
    set_cell(rasci_tbl.cell(0, j+1), rs, bold=True, font_size=7, color=WHITE, bg="003366", alignment=WD_ALIGN_PARAGRAPH.CENTER)

for i, phase in enumerate(phases):
    set_cell(rasci_tbl.cell(i+1, 0), phase, bold=True, font_size=7, color=PRIMARY)
    for j, val in enumerate(rasci_data[i]):
        if val == "—":
            set_cell(rasci_tbl.cell(i+1, j+1), "—", font_size=7, alignment=WD_ALIGN_PARAGRAPH.CENTER, bg="F3F4F6")
        elif "/" in val:
            # Dual role: use first letter color
            parts = val.split("/")
            bg_c, fg_c = RASCI_COLORS[parts[0]]
            set_cell(rasci_tbl.cell(i+1, j+1), val, bold=True, font_size=7, color=fg_c, bg=bg_c, alignment=WD_ALIGN_PARAGRAPH.CENTER)
        elif val in RASCI_COLORS:
            bg_c, fg_c = RASCI_COLORS[val]
            set_cell(rasci_tbl.cell(i+1, j+1), val, bold=True, font_size=7, color=fg_c, bg=bg_c, alignment=WD_ALIGN_PARAGRAPH.CENTER)

# Legend
doc.add_paragraph()
leg = doc.add_table(rows=2, cols=5)
add_table_borders(leg)
for j, (code, (bg_c, fg_c)) in enumerate(RASCI_COLORS.items()):
    labels = {'R': 'Responsible', 'A': 'Accountable', 'S': 'Supportive', 'C': 'Consulted', 'I': 'Informed'}
    set_cell(leg.cell(0, j), code, bold=True, font_size=8, color=fg_c, bg=bg_c, alignment=WD_ALIGN_PARAGRAPH.CENTER)
    set_cell(leg.cell(1, j), labels[code], font_size=7, alignment=WD_ALIGN_PARAGRAPH.CENTER)

doc.add_page_break()

# ====== H5: COMPETENTIE-EISEN ======
doc.add_heading("5. Competentie-eisen", level=1)
doc.add_paragraph(
    "Onderstaande tabel definieert de minimum competentie-eisen per rol. Voor een volledig overzicht van "
    "competentiematrix en trainingsplan wordt verwezen naar VBS Element 1, Doc 4 (VBS01_04) [4]."
)

comp_data = [
    ("Directie", "HBO/WO niveau + VCA-VOL", "Bewust", "Jaarlijks"),
    ("MoC-coördinator / HSE Manager", "HBO Veiligheidskunde / HSE + MoC-certificering", "Expert", "2-jaarlijks"),
    ("MoC-teamlid Operations", "MBO/HBO Procestechniek + VCA Basis", "Gevorderd", "2-jaarlijks"),
    ("MoC-teamlid Maintenance", "MBO/HBO Werktuigbouwkunde + VCA Basis", "Gevorderd", "2-jaarlijks"),
    ("MoC-teamlid HSE", "HBO Veiligheidskunde + HAZOP-leiderschap", "Expert", "Jaarlijks"),
    ("Aanvrager / Initiator", "VCA Basis + MoC-bewustzijnstraining", "Basis", "3-jaarlijks"),
    ("Op. Management / Shift Supervisors", "MBO + VCA-VOL + MoC-proceduretraining", "Gevorderd", "2-jaarlijks"),
    ("Externe Deskundige", "Relevante HBO/WO + vakcertificering", "Expert", "Projectmatig"),
]

ct = doc.add_table(rows=len(comp_data)+1, cols=4)
add_table_borders(ct)
header_row(ct, 0, ["Rol", "Minimum opleiding", "Vaatwoordigheidsniveau", "Herhaling"])
for i, (rol, opl, niv, herh) in enumerate(comp_data):
    set_cell(ct.rows[i+1].cells[0], rol, bold=True, font_size=8)
    set_cell(ct.rows[i+1].cells[1], opl, font_size=8)
    set_cell(ct.rows[i+1].cells[2], niv, font_size=8, alignment=WD_ALIGN_PARAGRAPH.CENTER)
    set_cell(ct.rows[i+1].cells[3], herh, font_size=8, alignment=WD_ALIGN_PARAGRAPH.CENTER)

doc.add_page_break()

# ====== H6: ESCALATIEPROTOCOL ======
doc.add_heading("6. Escalatieprotocol", level=1)
doc.add_paragraph(
    "Het escalatieprotocol waarborgt dat knelpunten en geschillen tijdig op het juiste niveau worden opgelost."
)

esc_levels = [
    ("Niveau 1", "Operationeel", "MoC-coördinator",
     "Verschil van inzicht binnen MoC-team; onduidelijkheid over classificatie",
     "3 werkdagen", "MoC-coördinator documenteert positie en neemt beslissing"),
    ("Niveau 2", "Tactisch", "Directie (Operations Director)",
     "Bevoegdheidsoverschrijding;Hoog/Kritiek goedkeuring; budgetimpact >€25.000",
     "2 werkdagen", "Directie neemt bindend besluit; MoC-coördinator implementeert"),
    ("Niveau 3", "Strategisch", "Algemene Directie (CEO)",
     "Belangrijke veiligheidsrisico's; externe melding; mediabelang; stopzettingsverzoek",
     "1 werkdag", "CEO beslist; eventuele externe melding aan toezichthouder"),
]

et = doc.add_table(rows=len(esc_levels)+1, cols=5)
add_table_borders(et)
header_row(et, 0, ["Niveau", "Type", "Escalatie­ontvanger", "Trigger", "Termijn"])
for i, (niv, typ, ontv, trigger, term, actie) in enumerate(esc_levels):
    set_cell(et.rows[i+1].cells[0], niv, bold=True, font_size=8, color=PRIMARY)
    set_cell(et.rows[i+1].cells[1], typ, font_size=8)
    set_cell(et.rows[i+1].cells[2], ontv, font_size=8)
    set_cell(et.rows[i+1].cells[3], trigger, font_size=8)
    set_cell(et.rows[i+1].cells[4], term, font_size=8, alignment=WD_ALIGN_PARAGRAPH.CENTER)

doc.add_paragraph()
doc.add_paragraph("Alle escalaties worden gedocumenteerd in het MoC-register met datum, reden, besluit en ondertekening.")

doc.add_page_break()

# ====== H7: AFWEZIGHEID & VERVANGING ======
doc.add_heading("7. Afwezigheid & Vervanging", level=1)
doc.add_paragraph(
    "Dit hoofdstuk beschrijft de vervangingsregeling bij afwezigheid van sleutelfunctionarissen."
)

doc.add_heading("7.1 Vervanging MoC-coördinator", level=2)
doc.add_paragraph(
    "Bij afwezigheid van de MoC-coördinator neemt de plaatsvervangend HSE Manager de rol over. "
    "Deze vervanger dient te voldoen aan dezelfde competentie-eisen als de primaire coördinator (§5). "
    "De Directie wordt schriftelijk geïnformeerd bij vervanging langer dan 5 werkdagen."
)

doc.add_heading("7.2 Vervanging MoC-teamleden", level=2)
doc.add_paragraph(
    "Elk MoC-teamlid draagt een aangewezen vervanger met minimaal hetzelfde competentieniveau. "
    "De vervanger wordt bij inschakeling geïnformeerd over lopende MoC's via het MoC-register. "
    "Vervangingen worden vastgelegd in het MoC-dossier."
)

doc.add_heading("7.3 Goedkeuring bij vervanging", level=2)
doc.add_paragraph(
    "Vervanging van de MoC-coördinator vereist formele goedkeuring door de Directie. "
    "Vervanging van teamleden wordt gemeld aan de MoC-coördinator en vastgelegd in het register. "
    "Voor Hoog en Kritiek wijzigingen geldt dat de Directie akkoord moet gaan met de vervangersamenstelling."
)

doc.add_heading("7.4 Documentatie", level=2)
doc.add_paragraph(
    "Alle vervangingen worden gedocumenteerd met: naam vervanger, datum, reden, duur, en goedkeuring. "
    "Deze gegevens worden opgenomen in het MoC-register en zijn beschikbaar voor audit."
)

doc.add_page_break()

# ====== BRONNENLIJST ======
doc.add_heading("Bronnenlijst", level=1)
sources = [
    "[1] JvG Consultancy — PM_VBS05_01_MoC_Beleid_Kaderdocument_v1.0.docx, §7 Beleidsverantwoordelijkheden",
    "[2] JvG Consultancy — PM_VBS05_02_MoC_Procedure_v1.0.docx",
    "[3] JvG Consultancy — PM_VBS05_05_MoC_Register_Dashboard_v1.0.docx",
    "[4] Phoenix Metals — VBS Element 1, Doc 4: Competentiematrix & Trainingsplan (VBS01_04)",
    "[5] Phoenix Metals — Risico-Inventarisatie & -Evaluatie (RI&E), versie actueel",
    "[6] JvG Consultancy — PM_VBS05_04_Formulierenpakket_v1.0.docx",
    "[7] Seveso III Richtlijn 2012/18/EU, artikel 12 — Management of Change",
    "[8] BRZO 1999 (Stb. 1999, 369), artikel 5 — Veiligheidsbeheerssysteem",
    "[9] ISO 45001:2018, artikel 8.1.3 — Management of Change",
    "[10] CCPS — Guidelines for the Management of Change (2019)",
]
for s in sources:
    p = doc.add_paragraph(s, style='List Bullet')
    p.paragraph_format.space_after = Pt(2)

doc.add_paragraph()

# ====== TIERVERIFY LOG ======
doc.add_heading("TierVerify Log", level=1)
vt2 = doc.add_table(rows=7, cols=4)
add_table_borders(vt2)
header_row(vt2, 0, ["Check", "Bron", "Status", "Opmerking"])
verify = [
    ("Roldefinities", "Doc 1 §7, Doc 2", "✓ Geverifieerd", "8 rollen compleet met bevoegdheden"),
    ("RASCI-toewijzing", "Doc 2 procedurefasen", "✓ Geverifieerd", "9 fasen × 8 rollen gedekt"),
    ("Bevoegdheidsmatrix", "Doc 1 §7.3, Doc 2 §4", "✓ Geverifieerd", "Alle beslissingen voorzien van bevoegde"),
    ("Competentie-eisen", "VBS01_04 referentie", "✓ Geverifieerd", "Koppeling met VBS Element 1 gelegd"),
    ("Escalatieprotocol", "Doc 2 §6", "✓ Geverifieerd", "3 niveaus met termijnen"),
    ("Vervangingsregeling", "Doc 2 §8.4", "✓ Geverifieerd", "Alle sleutelfuncties gedekt"),
]
for i, (c, b, s, o) in enumerate(verify):
    set_cell(vt2.rows[i+1].cells[0], c, bold=True, font_size=8)
    set_cell(vt2.rows[i+1].cells[1], b, font_size=8)
    set_cell(vt2.rows[i+1].cells[2], s, font_size=8, alignment=WD_ALIGN_PARAGRAPH.CENTER)
    set_cell(vt2.rows[i+1].cells[3], o, font_size=8)

# ====== HEADER/FOOTER ======
for section in doc.sections:
    section.different_first_page_header_footer = False
    # Header with logo
    header = section.header
    header.is_linked_to_previous = False
    hp = header.paragraphs[0]
    hp.alignment = WD_ALIGN_PARAGRAPH.LEFT
    if os.path.exists(LOGO):
        run = hp.add_run()
        run.add_picture(LOGO, width=Cm(2.0), height=Cm(1.8))

    # Footer
    footer = section.footer
    footer.is_linked_to_previous = False
    fp = footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = fp.add_run("JvG Consultancy | Safety • Governance • Advisory | © 2026")
    run.font.name = 'Calibri'
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x6B, 0x72, 0x80)

# Save
os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
doc.save(OUTPUT)
print(f"OK: {OUTPUT}")
print(f"Size: {os.path.getsize(OUTPUT)} bytes")
