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

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

doc = Document()

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

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

# Primary color
PRIMARY = RGBColor(0x00, 0x33, 0x66)
BORDER_COLOR = "E5E7EB"

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

def add_header_row(table, headers, shade="003366"):
    row = table.rows[0]
    for i, h in enumerate(headers):
        cell = row.cells[i]
        cell.text = ""
        p = cell.paragraphs[0]
        run = p.add_run(h)
        run.bold = True
        run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
        run.font.size = Pt(10)
        run.font.name = 'Calibri'
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        set_cell_shading(cell, shade)

def add_table_row(table, values, shade=None):
    row = table.add_row()
    for i, v in enumerate(values):
        cell = row.cells[i]
        cell.text = ""
        p = cell.paragraphs[0]
        run = p.add_run(str(v))
        run.font.size = Pt(9)
        run.font.name = 'Calibri'
        if shade:
            set_cell_shading(cell, shade)
    return row

def set_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="E5E7EB"/>'
        '  <w:left w:val="single" w:sz="4" w:space="0" w:color="E5E7EB"/>'
        '  <w:bottom w:val="single" w:sz="4" w:space="0" w:color="E5E7EB"/>'
        '  <w:right w:val="single" w:sz="4" w:space="0" w:color="E5E7EB"/>'
        '  <w:insideH w:val="single" w:sz="4" w:space="0" w:color="E5E7EB"/>'
        '  <w:insideV w:val="single" w:sz="4" w:space="0" w:color="E5E7EB"/>'
        '</w:tblBorders>'
    )
    tblPr.append(borders)

def add_footer(section):
    footer = section.footer
    footer.is_linked_to_previous = False
    p = footer.paragraphs[0]
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("JvG Consultancy | Safety • Governance • Advisory | © 2026")
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
    run.font.name = 'Calibri'

# ============================================================
# PAGE 1: VOORBLAD
# ============================================================
section = doc.sections[0]
add_footer(section)

# Add logo
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
run = p.add_run()
run.add_picture("/root/projects/jg/assets/branding/jvg-logo-white-medium.png", width=Cm(2.0), height=Cm(1.8))

doc.add_paragraph()
doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("HAZOP Studieopzet")
run.bold = True
run.font.size = Pt(24)
run.font.color.rgb = PRIMARY
run.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("VBS Element 2 — Identificatie en Evaluatie van Gevaren\nDocument #7")
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(0x1F, 0x29, 0x37)
run.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Phoenix Metals — Vanadiumproductie-installatie IJmuiden")
run.font.size = Pt(12)
run.font.color.rgb = PRIMARY
run.font.name = 'Calibri'

doc.add_paragraph()
doc.add_paragraph()

# Document metadata table
table = doc.add_table(rows=6, cols=2)
table.alignment = WD_TABLE_ALIGNMENT.CENTER
meta = [
    ("Project", "2026-PM-VBS-Element2"),
    ("Type", "HAZOP Studieopzet"),
    ("Auteur", "HQ_14 Risk Manager"),
    ("Versie", "1.0"),
    ("Datum", "2026-04-29"),
    ("Status", "Final"),
]
for i, (k, v) in enumerate(meta):
    table.rows[i].cells[0].text = k
    table.rows[i].cells[1].text = v
    for c in range(2):
        for p in table.rows[i].cells[c].paragraphs:
            for r in p.runs:
                r.font.size = Pt(10)
                r.font.name = 'Calibri'
            if c == 0:
                for r in p.runs:
                    r.bold = True
set_table_borders(table)

doc.add_page_break()

# ============================================================
# 2. DOCUMENTBEHEERSING
# ============================================================
doc.add_heading("1. Documentbeheersing", level=1)

doc.add_heading("1.1 Versiebeheer", level=2)
t = doc.add_table(rows=2, cols=4)
add_header_row(t, ["Versie", "Datum", "Auteur", "Wijziging"])
add_table_row(t, ["0.1", "2026-04-28", "HQ_14", "Concept studieopzet"])
add_table_row(t, ["1.0", "2026-04-29", "HQ_14", "Final — klaar voor HAZOP-sessies"])
set_table_borders(t)

doc.add_heading("1.2 Distributielijst", level=2)
t = doc.add_table(rows=6, cols=3)
add_header_row(t, ["Naam", "Functie", "Exemplaar"])
for row in [
    ("Jorick van Gemert", "Directeur", "1"),
    ("HAZOP Chairman", "Voorzitter", "2"),
    ("Process Engineer", "Procesingenieur", "3"),
    ("Operations Representative", "Operatievertegenwoordiger", "4"),
    ("HSEQ Specialist", "HSEQ-adviseur", "5"),
]:
    add_table_row(t, row)
set_table_borders(t)

doc.add_heading("1.3 Autorisatie", level=2)
t = doc.add_table(rows=4, cols=3)
add_header_row(t, ["Rol", "Naam", "Datum/Handtekening"])
add_table_row(t, ["Opgesteld", "HQ_14 Risk Manager", "2026-04-29"])
add_table_row(t, ["Gecontroleerd", "HSEQ Specialist", ""])
add_table_row(t, ["Goedgekeurd", "Jorick van Gemert", ""])
set_table_borders(t)

doc.add_page_break()

# ============================================================
# 3. DOEL & SCOPE
# ============================================================
doc.add_heading("2. Doel & Scope", level=1)

doc.add_heading("2.1 Doel", level=2)
doc.add_paragraph(
    "Dit document definieert de studieopzet voor een HAZOP-studie (Hazard and Operability Study) "
    "voor de Phoenix Metals vanadiumproductie-installatie te IJmuiden. De HAZOP-studie is een "
    "systematische, gestructureerde methode voor het identificeren van gevaren en bedieningsproblemen "
    "in procesinstallaties, conform IEC 61882:2016 [1]."
)
doc.add_paragraph(
    "Het doel is het verkrijgen van een volledig overzicht van potentiële deviaties in de "
    "kritieke procesonderdelen, met bijbehorende oorzaken, consequenties en aanbevelingen voor "
    "preventieve en beschermende maatregelen."
)

doc.add_heading("2.2 Scope", level=2)
doc.add_paragraph("De scope omvat de volgende kritieke procesonderdelen van de vanadiumproductie-installatie:")
for item in [
    "Uitloging reactor (reactie van staalslakken met zwavelzuur)",
    "Zuivering via solvent extractie (scheiding van vanadium uit zure oplossing)",
    "Neerslag/kristallisatie (vanadiumneerslag door pH-adjustie)",
    "Drogen en calcinatie oven (thermisch drogen → V₂O₅ poeder)",
    "Verpakking en verlading (big-bag vullen met V₂O₅)",
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_paragraph(
    "Buiten scope vallen: ontvangst/opslag grondstoffen (big bags/silos), roosterovent, "
    "utiliteitsystemen (stoom, koelwater, perslucht) en externe transportroutes."
)

doc.add_heading("2.3 Referentiekader", level=2)
doc.add_paragraph(
    "De HAZOP-studie wordt uitgevoerd conform IEC 61882:2016 [1], in het kader van de BRZO 2015 [2] "
    "en NTA 8620 [3] vereisten voor risicobeheersing van Seveso-inrichtingen. "
    "Faktuele procesdata zijn ontleend aan het Meta-Dossier v1.0 [4]."
)

doc.add_page_break()

# ============================================================
# 4. WETTELIJK KADER
# ============================================================
doc.add_heading("3. Wettelijk Kader", level=1)

t = doc.add_table(rows=5, cols=3)
add_header_row(t, ["Wetgeving / Norm", "Relevantie", "Toepassing"])
data = [
    ("BRZO 2015 Art. 5-6 [2]", "Primaire kader Seveso-inrichting", "Verplichte gevarenidentificatie en risicobeoordeling"),
    ("Seveso III (2012/18/EU)", "Europese richtlijn", "Art. 10-12: SMS en risicoanalyse"),
    ("NTA 8620 [3]", "Nederlandse toetsingsrichtlijn", "Specifieke eis HAZOP voor complexe procesonderdelen"),
    ("IEC 61882:2016 [1]", "Internationale norm", "Methodiek en terminologie voor HAZOP-studies"),
]
for d in data:
    add_table_row(t, d)
set_table_borders(t)

doc.add_page_break()

# ============================================================
# 5. HAZOP METHODIEK
# ============================================================
doc.add_heading("4. HAZOP Methodiek", level=1)

doc.add_heading("4.1 Wat is HAZOP", level=2)
doc.add_paragraph(
    "HAZOP (Hazard and Operability Study) is een systematische, multidisciplinaire methode "
    "waarbij een ontwerpteam potentiële gevaren en bedieningsproblemen identificeert door "
    "procesdeviaties systematisch te onderzoeken. De methode maakt gebruik van Guide Words "
    "gecombineerd met procesparameters om deviaties te genereren [1]."
)

doc.add_heading("4.2 Guide Words", level=2)
t = doc.add_table(rows=12, cols=2)
add_header_row(t, ["Guide Word", "Betekenis"])
gws = [
    ("NO / NOT", "De intentie wordt niet uitgevoerd"),
    ("MORE", "Hoeveelheid is groter dan ontwerpwaarde"),
    ("LESS", "Hoeveelheid is kleiner dan ontwerpwaarde"),
    ("AS WELL AS", "Extra activiteit naast de intentie"),
    ("PART OF", "Slechts deel van de intentie wordt uitgevoerd"),
    ("REVERSE", "De intentie wordt omgekeerd"),
    ("OTHER THAN", "Andere activiteit dan de intentie"),
    ("EARLY", "Actie vindt vroeger plaats dan bedoeld"),
    ("LATE", "Actie vindt later plaats dan bedoeld"),
    ("BEFORE", "Actie voor de juiste volgorde"),
    ("AFTER", "Actie na de juiste volgorde"),
]
for gw in gws:
    add_table_row(t, gw)
set_table_borders(t)

doc.add_heading("4.3 Parameters", level=2)
doc.add_paragraph(
    "De volgende procesparameters worden in de studie toegepast: flow (debiet), temperatuur, "
    "druk, niveau, samenstelling (concentratie, zuurgraad), fase (vloeibaar/vast/gas), "
    "reactiesnelheid, pH, en tijdsduur."
)

doc.add_heading("4.4 Deviatie en Beoordeling", level=2)
doc.add_paragraph(
    "Een deviatie wordt gevormd door de combinatie Guide Word + Parameter. "
    "Voorbeeld: NO + flow = geen doorstroming. Per deviatie wordt beoordeeld:"
)
for item in [
    "Oorzaak — Welke fout of gebeurtenis leidt tot de deviatie?",
    "Consequentie — Wat is het effect op proces, personen, milieu?",
    "Bestaande barrières — Welke maatregelen zijn al aanwezig?",
    "Risicoclassificatie — Severity (S) × Likelihood (L) op 1-5 schaal",
    "Aanbeveling — Welke aanvullende maatregelen zijn nodig?",
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_page_break()

# ============================================================
# 6. STUDIEAFBAKENING — NODES
# ============================================================
doc.add_heading("5. Studieafbakening — Knooppunten (Nodes)", level=1)

doc.add_paragraph(
    "Op basis van het Meta-Dossier [4] §3 zijn de volgende knooppunten geselecteerd voor HAZOP-analyse:"
)

t = doc.add_table(rows=6, cols=4)
add_header_row(t, ["Node", "Processtap", "Omschrijving", "Reden selectie"])
nodes = [
    ("N-01", "Uitloging reactor", "Reactor: H₂SO₄ + slakken → vanadium in oplossing (50-90°C)", "Exotherme reactie, corrosief milieu, toxisch product"),
    ("N-02", "Zuivering (solvent extractie)", "Scheiding van V uit zuur extract via ionenuitwisseling", "Chemische blootstelling, kritieke procesbeheersing"),
    ("N-03", "Neerslag/Kristallisatie", "Vanadiumneerslag door pH-adjustie (NaOH)", "pH-kritiek, productkwaliteit, exotherme neutralisatie"),
    ("N-04", "Drogen/Calcinatie oven", "Thermisch drogen → V₂O₅ poeder (>400°C)", "Stofexplosierisico, carcinogeen (Carc. 1B), hoge temperatuur"),
    ("N-05", "Verpakking/Verlading", "Big-bag vullen met V₂O₅ poeder", "Stofvorming, carcinogeen, ergonomische belasting"),
]
for n in nodes:
    add_table_row(t, n)
set_table_borders(t)

doc.add_page_break()

# ============================================================
# 7. GUIDE WORDS × PARAMETERS MATRIX
# ============================================================
doc.add_heading("6. Guide Words × Parameters Matrix", level=1)

# --- N-01 VOLLEDIG ---
doc.add_heading("6.1 Node N-01 — Uitloging Reactor", level=2)
doc.add_paragraph("Volledige uitwerking van deviaties voor de uitloging reactor [4].")

t = doc.add_table(rows=1, cols=7)
add_header_row(t, ["Deviatie", "Parameter", "Guide Word", "Oorzaak", "Consequentie", "Bestaande barrière", "S×L"])

n01_dev = [
    ("Geen doorstroming", "Flow", "NO", "Pompfalen, klep gesloten, verstopping leiding", "Oververhitting reactor, drukopbouw, ongecontroleerde reactie", "Temperatuuralarm (high-high), drukventiel (PSV)", "4×3=12"),
    ("Te hoog debiet", "Flow", "MORE", "Regelklep defect, HV-fout", "Overbelasting filtratie, overloop reactor", "Flow indicator (FI), automatische klep", "3×2=6"),
    ("Te laag debiet", "Flow", "LESS", "Deeltjesverstopping, pompdegradatie", "Onvolledige uitloging, lage opbrengst", "Flow alarm (FAL)", "2×3=6"),
    ("Tegenstroom", "Flow", "REVERSE", "Backflow bij drukverschil", "Contaminatie upstream, corrosie", "Check valve (NCV)", "3×2=6"),
    ("Temperatuur te hoog", "Temperatuur", "MORE", "Koelwaterfalen, exotherme runaway", "Drukopbouw, reactorbeschadiging, V₂O₅ emissie", "TIC (temperatuurregeling), koelwater backup", "4×3=12"),
    ("Temperatuur te laag", "Temperatuur", "LESS", "Stoomfalen, isolatiedefect", "Onvolledige reactie, lage opbrengst", "TAL (temperatuur alarm low)", "2×2=4"),
    ("Druk te hoog", "Druk", "MORE", "Verstopping downstream, gasvorming", "Lekkage, reactorruptuur", "PSV (pressure safety valve), PAH", "4×2=8"),
    ("Druk te laag", "Druk", "LESS", "Lekkage, klep te ver open", "Vacuüm, implosie risico", "PAL (druk alarm low)", "2×2=4"),
    ("Niveau te hoog", "Niveau", "MORE", "Regelfout, klep stuck closed", "Overloop, chemische morsing", "LAH (level alarm high), overflow", "3×2=6"),
    ("Niveau te laag", "Niveau", "LESS", "Uitval voeding, lekkage", "Droogkoken reactor, oververhitting", "LAL (level alarm low)", "4×2=8"),
    ("Te veel H₂SO₄", "Samenstelling", "MORE", "Doseringfout, MV-fout", "Te agressieve uitloging, corrosie, oververhitting", "pH-meter, dosering interlock", "3×2=6"),
    ("Te weinig H₂SO₄", "Samenstelling", "LESS", "Doseringfout, lege voorraad", "Onvolledige uitloging, productkwaliteit", "pH-alarm", "2×3=6"),
    ("Verkeerde stof", "Samenstelling", "OTHER", "Kruiscontaminatie, verkeerde tank", "Onbekende reactie, mogelijk explosief", "Kleurcodering, lock-out", "4×1=4"),
]
for d in n01_dev:
    add_table_row(t, d)
set_table_borders(t)

# --- N-02 t/m N-05: 3-5 deviaties per node ---
nodes_examples = {
    "6.2 Node N-02 — Zuivering (Solvent Extractie)": [
        ("Geen doorstroming", "Flow", "NO", "Pompfalen extractie kolom", "Stagnatie, V verlies in raffinaat", "Flow switch (FSH/L)", "3×2=6"),
        ("Temperatuur te hoog", "Temperatuur", "MORE", "Koeling defect", "Degradataie solvent, verminderde selectiviteit", "TIC, koelwater alarm", "3×2=6"),
        ("Verkeerde pH", "Samenstelling", "OTHER", "NaOH-doseringfout", "Onjuiste scheiding, V in afvalstroom", "pH-analyser + alarm", "3×3=9"),
        ("Te veel solvent", "Samenstelling", "MORE", "Regelklep defect", "Overbelasting separator, afvalvermeerdering", "Level indicator kolom", "2×2=4"),
    ],
    "6.3 Node N-03 — Neerslag/Kristallisatie": [
        ("pH te hoog", "pH", "MORE", "NaOH-overdosering", "Neerslag lost op, productverlies", "pH-regeling + alarm", "3×2=6"),
        ("pH te laag", "pH", "LESS", "NaOH-dosering uitval", "Geen neerslag, V blijft in oplossing", "pH-alarm low", "3×3=9"),
        ("Temperatuur te laag", "Temperatuur", "LESS", "Verwarmingsfalen", "Onvolledige kristallisatie, fijne deeltjes", "TIC, stoom backup", "2×2=4"),
        ("Niveau te hoog", "Niveau", "MORE", "Afvoer verstopt", "Overloop kristallisator", "LAH, overflow pipe", "3×2=6"),
        ("Verkeerde stof toegevoegd", "Samenstelling", "OTHER", "Kruiscontaminatie opslag", "Onbekend neerslagproduct, reactierisico", "Labeling, lock-out", "4×1=4"),
    ],
    "6.4 Node N-04 — Drogen/Calcinatie Oven": [
        ("Temperatuur te hoog", "Temperatuur", "MORE", "Brandersysteem defect, TC-fout", "Smelt V₂O₅, ovenbeschadiging, emissie", "TAH, branderauto-stop", "4×2=8"),
        ("Temperatuur te laag", "Temperatuur", "LESS", "Branderausval, gastekort", "Onvolledige calcinatie, vochtig product", "TAL, burner status", "2×2=4"),
        ("Stofwolk vorming", "Samenstelling", "MORE", "Ontbrekende afzuiging, filterdefect", "V₂O₅ stofexplosie, inhalatie carcinogeen", "Afzuiging, HEPA-filter, ATEX", "5×2=10"),
        ("Verkeerde feed", "Samenstelling", "OTHER", "Verkeerde big-bak aangesloten", "Onbekende reactie bij hoge temperatuur", "Labeling, procedure", "4×1=4"),
    ],
    "6.5 Node N-05 — Verpakking/Verlading": [
        ("Stofemissie hoog", "Samenstelling", "MORE", "Afzuiging defect, geen BIG-BAG seal", "V₂O₅ inhalatie (Carc. 1B), milieu-emissie", "LEV, stofafzuiging, PPM-meter", "5×2=10"),
        ("Geen flow (verstopping)", "Flow", "NO", "Poederklinker, vocht in product", "Stilstand, handmatig ingrijpen = blootstelling", "Vibratie-ondersteuning", "3×3=9"),
        ("Te zware belading", "Niveau", "MORE", "Weegsysteem defect", "BIG-BAG ruptuur, stofwolk, ergonomisch risico", "Weegsysteem + interlock", "4×2=8"),
        ("Verkeerd product", "Samenstelling", "OTHER", "Verkeerde silo aangesloten", "Klantklacht, mogelijke reactie bij eindgebruiker", "Labeling, barcode check", "3×1=3"),
    ],
}

for heading, devs in nodes_examples.items():
    doc.add_heading(heading, level=2)
    t = doc.add_table(rows=1, cols=7)
    add_header_row(t, ["Deviatie", "Parameter", "Guide Word", "Oorzaak", "Consequentie", "Bestaande barrière", "S×L"])
    for d in devs:
        add_table_row(t, d)
    set_table_borders(t)

doc.add_page_break()

# ============================================================
# 8. HAZOP WORKSHEET TEMPLATE
# ============================================================
doc.add_heading("7. HAZOP Worksheet Template", level=1)
doc.add_paragraph(
    "Het onderstaande template wordt gebruikt tijdens de daadwerkelijke HAZOP-sessies. "
    "Per deviatie wordt één werkblad ingevuld."
)

t = doc.add_table(rows=13, cols=2)
add_header_row(t, ["Veld", "Invulling"])
template = [
    ("Node", "[N-XX]"),
    ("Guide Word", "[NO / MORE / LESS / ...]"),
    ("Parameter", "[Flow / Temperatuur / Druk / ...]"),
    ("Deviatie", "[Beschrijving deviatie]"),
    ("Oorzaken", "[Mogelijke oorzaken]"),
    ("Consequenties", "[Effect op proces/personen/milieu]"),
    ("Bestaande barrières", "[Reeds aanwezige maatregelen]"),
    ("Severity (S)", "[1-5]"),
    ("Likelihood (L)", "[1-5]"),
    ("Risk Rank", "[S × L]"),
    ("Aanbevelingen", "[Aanbevolen acties]"),
    ("Actiehouder", "[Naam / Functie]"),
]
for i, (k, v) in enumerate(template):
    row = t.rows[i+1]  # +1 because header is row 0
    row.cells[0].text = k
    row.cells[1].text = v
    for c in range(2):
        for p in row.cells[c].paragraphs:
            for r in p.runs:
                r.font.size = Pt(9)
                r.font.name = 'Calibri'
        if c == 0:
            for p in row.cells[c].paragraphs:
                for r in p.runs:
                    r.bold = True
set_table_borders(t)

doc.add_page_break()

# ============================================================
# 9. TEAM SAMENSTELLING
# ============================================================
doc.add_heading("8. Team Samenstelling", level=1)

t = doc.add_table(rows=7, cols=3)
add_header_row(t, ["Rol", "Vereiste kwalificatie", "Verantwoordelijkheid"])
team = [
    ("HAZOP Chairman", "Gecertificeerd HAZOP-leider (IEC 61882)", "Leidt sessies, bewaakt methodiek, waarborgt volledigheid"),
    ("HAZOP Secretary", "Ervaring met technisch notuleren", "Documenteert deviaties, oorzaken, consequenties, aanbevelingen"),
    ("Process Engineer", "Kennis van vanadiumproces en installatie", "Voorziet technische details, P&ID interpretatie"),
    ("Operations Representative", "Ervaring met dagelijkse bedrijfsvoering", "Praktijkkijk, bedieningsprocedures"),
    ("HSEQ Specialist", "Kennis BRZO/Seveso, risicomethodieken", "Risicoclassificatie, wetgevingskader"),
    ("Instrumentatie/Control Engineer", "Kennis SIS, alarm management, interlocks", "Beoordeling automatische barrières en interlocks"),
]
for row in team:
    add_table_row(t, row)
set_table_borders(t)

doc.add_page_break()

# ============================================================
# 10. PLANNING
# ============================================================
doc.add_heading("9. Planning", level=1)

t = doc.add_table(rows=5, cols=3)
add_header_row(t, ["Fase", "Doorlooptijd", "Activiteiten"])
planning = [
    ("Voorbereiding", "1 week", "Documentatie bestuderen, P&ID's verzamelen, knooppunten definitief vaststellen, team instrueren"),
    ("HAZOP-sessies", "3-5 dagen", "Per node ~0,5-1 dag: N-01 (1 dag), N-02 (0,5 dag), N-03 (0,5 dag), N-04 (1 dag), N-05 (0,5-1 dag)"),
    ("Rapportage", "1 week na laatste sessie", "HAZOP-rapport opstellen, deviaties register, aanbevelingen matrix"),
    ("Follow-up", "Maandelijks", "Tracken aanbevelingen tot alle acties gesloten, statusrapportage aan MT"),
]
for p in planning:
    add_table_row(t, p)
set_table_borders(t)

doc.add_page_break()

# ============================================================
# 11. DOCUMENTATIE VEREISTEN
# ============================================================
doc.add_heading("10. Documentatie Vereisten", level=1)
doc.add_paragraph("De volgende documenten zijn vereist voorafgaand aan en tijdens de HAZOP-sessies:")

t = doc.add_table(rows=8, cols=3)
add_header_row(t, ["Document", "Type", "Status"])
docs_list = [
    ("P&ID's (Process & Instrumentation Diagrams)", "Technisch", "Beschikbaar in research/"),
    ("PFD's (Process Flow Diagrams)", "Technisch", "Beschikbaar in research/"),
    ("Process descriptions (procesbeschrijvingen)", "Technisch", "Meta-Dossier §3 [4]"),
    ("Gevarenregister (VBS Element 2, Doc #2)", "Veiligheid", "Beschikbaar"),
    ("FMECA (VBS Element 2, Doc #4)", "Veiligheid", "Beschikbaar"),
    ("Bestaande procedures (PE-reeks)", "Operationeel", "Deels beschikbaar"),
    ("MSDS / SDB's (V₂O₅, H₂SO₄, NaOH)", "Veiligheid", "Beschikbaar (Meta-Dossier §2 [4])"),
]
for d in docs_list:
    add_table_row(t, d)
set_table_borders(t)

doc.add_page_break()

# ============================================================
# 12. BRONNENLIJST
# ============================================================
doc.add_heading("11. Bronnenlijst", level=1)

sources = [
    ("[1]", "IEC 61882:2016 — Hazard and operability studies (HAZOP studies) — Application guide"),
    ("[2]", "BRZO 2015 (Besluit risico's zware ongevallen 2015) — Art. 5, 6, 7, 10"),
    ("[3]", "NTA 8620 — Veiligheidsrapportage Seveso-inrichtingen"),
    ("[4]", "Meta-Dossier v1.0 — VBS Element 2 Phoenix Metals (2026-04-29)"),
]
for ref, desc in sources:
    p = doc.add_paragraph()
    run = p.add_run(ref + " ")
    run.bold = True
    run.font.size = Pt(11)
    run.font.name = 'Calibri'
    run2 = p.add_run(desc)
    run2.font.size = Pt(11)
    run2.font.name = 'Calibri'

doc.add_page_break()

# ============================================================
# 13. TIERVERIFY LOG
# ============================================================
doc.add_heading("12. TierVerify Log", level=1)

t = doc.add_table(rows=8, cols=4)
add_header_row(t, ["Check", "Bron", "Status", "Opmerking"])
verify = [
    ("Procesdata correctheid", "Meta-Dossier v1.0 [4]", "✅ Pass", "Alle procesdata ontleend aan §2-§3"),
    ("Wetgevingsreferenties", "IEC 61882, BRZO 2015, NTA 8620", "✅ Pass", "Referenties geverifieerd"),
    ("Stofeigenschappen V₂O₅", "Meta-Dossier §2.2 [4], MSDS", "✅ Pass", "Carc. 1B, Acute Tox. 2 bevestigd"),
    ("Node-afbakening", "Meta-Dossier §3 [4]", "✅ Pass", "5 nodes geselecteerd op basis van risicoprofiel"),
    ("HAZOP methodiek", "IEC 61882:2016 [1]", "✅ Pass", "Guide words en parameters conform norm"),
    ("Risicomatrix 5×5", "NTA 8620 [3]", "✅ Pass", "Severity × Likelihood schaal 1-5"),
    ("Documentcompliance", "MASTER_STYLEGUIDE", "✅ Pass", "Header, branding, bronverwijzingen conform"),
]
for v in verify:
    add_table_row(t, v)
set_table_borders(t)

# ============================================================
# SAVE
# ============================================================
out_dir = "/root/projects/jg/2026-PM-VBS-Element2/deliverables/docx"
os.makedirs(out_dir, exist_ok=True)
out_path = os.path.join(out_dir, "PM_VBS02_07_HAZOP_Studieopzet_v1.0.docx")
doc.save(out_path)
print(f"✅ Saved: {out_path}")
