#!/usr/bin/env python3
"""
Generate Document 2 (Functieprofielen Veiligheidsverantwoordelijkheden) and
Document 3 (Organigram Veiligheidsstructuur) for Phoenix Metals VBS Element 1.
"""

from docx import Document
from docx.shared import Cm, Inches, Pt, Emu, RGBColor
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

# ── Constants ──
PRIMARY = RGBColor(0x00, 0x33, 0x66)
TEXT_COLOR = RGBColor(0x1F, 0x29, 0x37)
BORDER_COLOR = "E5E7EB"
FONT = "Calibri"
LOGO_PATH = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
OUT_DIR = "/root/projects/jg/2026-PM-VBS-Element1/deliverables"
DATE = "28 april 2026"
AUTHOR = "JvG Consultancy — Kas (Director of Operations)"

ROLES = [
    {
        "id": 1, "title": "Managing Director", "name": "Stijn van Zelst",
        "level": "Directie",
        "responsibilities": [
            "Eindverantwoordelijkheid voor het Preventiebeleid Zware Ongevallen (PBZO) en het Veiligheidsbeheersysteem (VBS) [1][3]",
            "Goedkeuring en toewijzing van financiële, materiële en menselijke middelen voor veiligheidsmaatregelen [1]",
            "Jaarlijkse review van het PBZO en de veiligheidsprestaties, inclusief vaststelling van verbeterdoelstellingen [1][4]",
            "Signaleren en beoordelen van Management of Change (MoC) met strategisch veiligheidsimpact [4]",
            "Vertegenwoordiging van Phoenix Metals B.V. richtoverheid, toezichthouders en externe stakeholders in veiligheidszaken [3]"
        ],
        "bevoegdheden": [
            "Stillleggen van installaties of operaties bij onacceptabel veiligheidsrisico",
            "Goed- of afkeuring van investeringsvoorstellen voor veiligheidsinfrastructuur",
            "Benoeming en ontslag van veiligheidsfuncties (HSE Manager, HSE Supervisor)",
            "Goedkeuring van het noodplan en escalatie naar externe hulpdiensten"
        ],
        "rapportage_aan": "Raad van Commissarissen / Aandeelhouders",
        "rapportage_van": "Operations Manager, HSE Manager",
        "competenties": [
            "HBO/WO niveau met managementervaring in procesindustrie",
            "Kennis van Arbowet art. 3 (zorgplicht werkgever) en Seveso III-richtlijn [1][3]",
            "ISO 45001 bewustzijnstraining [4]",
            "Leiderschapscertificering (bijv. NEBOSH National Diploma of vergelijkbaar)"
        ],
        "kpis": [
            "TRIR < 2,0 (Total Recordable Incident Rate)",
            "100% afgeronde jaarlijkse PBZO-review",
            "VBS-implementatiegraad ≥ 4 van 7 elementen in jaar 1",
            "Budget uitvoering veiligheidsinvesteringen ≥ 95%"
        ]
    },
    {
        "id": 2, "title": "Operations Manager", "name": "(vacant)",
        "level": "MT",
        "responsibilities": [
            "Operationele uitvoering van het PBZO en VBS-kader op de werkvloer [1]",
            "Sturing van dagelijkse veiligheidsoperaties: PtW-systeem, TRA-toezicht, toolbox meetings [2]",
            "Begeleiding van Maintenance Manager en Field Operators bij veilig werk",
            "Escalatie van veiligheidsincidenten naar Managing Director conform meldprotocol [1]",
            "Coördinatie van gezamenlijke operaties met onderaannemers en uitzendkrachten [2]"
        ],
        "bevoegdheden": [
            "Afgifte en intrekking van werkvergunningen (Permit to Work)",
            "Stopwerkbevel bij onveilige situaties",
            "Inplannen van preventief onderhoud met veiligheidsrelevantie",
            "Goedkeuring van TRA's voor niet-standaardwerkzaamheden"
        ],
        "rapportage_aan": "Managing Director",
        "rapportage_van": "Maintenance Manager, Field Operators",
        "competenties": [
            "HBO Werktuigbouwkunde of Procestechnologie",
            "VCA-VOL certificering",
            "Ervaren in procesveiligheid en leidinggeven in (petro)chemische omgeving",
            "Kennis van LOTO, PtW, TRA-systematiek"
        ],
        "kpis": [
            "100% TRA-uitvoering bij niet-standaardwerk",
            "< 4 uur gemiddelde responstijd bij veiligheidsmeldingen",
            "≥ 95% voltooiing veiligheidstrainingen door operationeel personeel",
            "Aantal veiligheidsobservaties ≥ 2 per week"
        ]
    },
    {
        "id": 3, "title": "HSE Manager", "name": "(vacant)",
        "level": "MT / Staf",
        "responsibilities": [
            "Methodische ondersteuning van het VBS: RI&E, incidentanalyse, auditcoördinatie [2][4]",
            "Beheer van het veiligheidsmanagementsysteem (documentatie, procedures, registraties) [4]",
            "Uitvoeren en coördineren van interne veiligheidsaudits conform ISO 45001 [4]",
            "Adviseur van directie en MT op het gebied van procesveiligheid en Arbowetgeving [3]",
            "Coördinatie met externe partijen: Omgevingsdienst, DCMR, brandweer, arbodienst [3]"
        ],
        "bevoegdheden": [
            "Onafhankelijk veiligheidsaudits uitvoeren en bevindingen rapporteren",
            "Adviesbevoegdheid bij MoC-beoordelingen met veiligheidsimpact",
            "Toegang tot alle bedrijfslocaties voor veiligheidsinspecties",
            "Initiëren van_correctieveacties na incidenten of auditbevindingen"
        ],
        "rapportage_aan": "Managing Director (functioneel) / Operations Manager (operationeel)",
        "rapportage_van": "HSE Supervisor",
        "competenties": [
            "HVK (Hogere Veiligheidskundige) diploma of NEBOSH International Diploma",
            "ISO 45001 Lead Auditor certificaat",
            "Kennis van Seveso III, Brzo 2015, Arbowet/Besluit [1][2][3]",
            "Ervaren in incidentinvestigatie (bow-tie, TRIPOD, root cause analysis)"
        ],
        "kpis": [
            "≥ 4 interne audits per jaar uitgevoerd",
            "100% afgeronde_correctieveacties binnen gestelde termijn",
            "Near-miss rapportage +50% t.o.v. baseline jaar 1",
            "VBS-documentatie volledig en actueel (audit-ready)"
        ]
    },
    {
        "id": 4, "title": "Maintenance Manager", "name": "(vacant)",
        "level": "Lijnmanagement",
        "responsibilities": [
            "Veilig uitvoeren van onderhoudswerkzaamheden conform LOTO- en PtW-procedures [2]",
            "Beheer van preventief en_correctief onderhoud met veiligheidsrelevantie",
            "Begeleiding van E&I Technicians en externe aannemers bij onderhoudsactiviteiten",
            "Rapportage van onderhoudsgerelateerde veiligheidsbevindingen aan Operations Manager",
            "Waarborgen van keuringen en certificeringen van installaties en PBM's [2]"
        ],
        "bevoegdheden": [
            "Aanvragen van werkvergunningen voor onderhoudswerkzaamheden",
            "Goedkeuring van LOTO-procedures voor specifieke installaties",
            "Inplannen van stilstanden en onderhoudsramen",
            "Keuring van PBM's en veiligheidsuitrusting aftekenen"
        ],
        "rapportage_aan": "Operations Manager",
        "rapportage_van": "E&I Technicians",
        "competenties": [
            "MBO+/HBO Werktuigbouwkunde of Elektrotechniek",
            "VCA-VOL certificaat",
            "BHV-certificering",
            "Ervaren in onderhoud van procesinstallaties (pompen, leidingen, tanks)"
        ],
        "kpis": [
            "100% LOTO-compliance bij onderhoudswerkzaamheden",
            "Preventief onderhoud ≥ 90% volgens planning uitgevoerd",
            "Nul ongevallen tijdens onderhoudsactiviteiten",
            "Keuringsstatus alle PBM's en installaties actueel"
        ]
    },
    {
        "id": 5, "title": "HSE Supervisor", "name": "(vacant)",
        "level": "Uitvoering / Toezicht",
        "responsibilities": [
            "Dagelijks toezicht op naleving van veiligheidsregels en -procedures op de werkvloer [2]",
            "Ondersteuning bij TRA-uitvoering, toolbox meetings en veiligheidsinspecties",
            "Eerste reactie en registratie van incidenten, near-misses en onveilige situaties",
            "Begeleiding van nieuwe medewerkers en onderaannemers bij veiligheidsinstructie (inductie)",
            "Rapportage van veiligheidsobservaties en trends aan HSE Manager [4]"
        ],
        "bevoegdheden": [
            "Stopwerkbevel bij direct levensgevaarlijke situaties",
            "Uitvoeren van veiligheidsinspecties en werkplekbeoordelingen",
            "Incidenten en near-misses direct registreren in meldsysteem",
            "Deelnemen aan TRA-sessies als veiligheidsadviseur"
        ],
        "rapportage_aan": "HSE Manager",
        "rapportage_van": "(geen directe rapporten — ondersteunende rol)",
        "competenties": [
            "MBO niveau met VCA- basis certificaat",
            "BHV + AED certificaat",
            "Kennis van gevaarlijke stoffen (MSDS) en PBM-voorschriften",
            "Ervaren in procesindustrie of petrochemie"
        ],
        "kpis": [
            "≥ 5 veiligheidsobservaties per week",
            "100% inductie nieuwe medewerkers binnen eerste werkdag",
            "Niet-afgesloten_correctieveacties < 5 op elk moment",
            "Beschikbaarheidswerkvloer ≥ 90% van werktijd"
        ]
    },
    {
        "id": 6, "title": "Field Operator", "name": "(meerdere personen)",
        "level": "Uitvoering",
        "responsibilities": [
            "Veilig uitvoeren van productie- en procesoperaties conform SOP's en werkvergunningen [2]",
            "Actieve deelname aan TRA-sessies en toolbox meetings vóór aanvang werkzaamheden",
            "Onmiddellijk rapporteren van incidenten, near-misses en onveilige situaties [3]",
            "Correct gebruik en onderhoud van toegewezen persoonlijke beschermingsmiddelen (PBM's)",
            "Bewaking van procesparameters en tijdig signaleren van afwijkingen"
        ],
        "bevoegdheden": [
            "Stopzetten van eigen werkzaamheden bij onveilige situaties (stopwerkbevoegdheid)",
            "Aanvragen van TRA bij niet-standaardwerkzaamheden",
            "Melden van defecten en afwijkingen aan Operations Manager of Maintenance Manager",
            "Gebruiken van noodstop- en afsluitersystemen"
        ],
        "rapportage_aan": "Operations Manager",
        "rapportage_van": "(geen directe rapporten)",
        "competenties": [
            "MBO Procestechniek of vergelijkbaar",
            "VCA-basis certificaat",
            "BHV-certificering",
            "Kennis van gevaarlijke stoffen (MSDS) en procesveiligheid",
            "Bedrijfsinductie Phoenix Metals voltooid"
        ],
        "kpis": [
            "Nul eigen ongevallen met verzuim",
            "100% TRA-participatie bij toegewezen taken",
            "≥ 1 near-miss rapportage per maand per persoon",
            "100% voltooiing verplichte veiligheidstrainingen"
        ]
    },
    {
        "id": 7, "title": "E&I Technician", "name": "(meerdere personen)",
        "level": "Uitvoering / Specialistisch",
        "responsibilities": [
            "Veilig uitvoeren van elektrotechnische en instrumentatie-werkzaamheden conform LOTO-procedures [2]",
            "Keuring en onderhoud van elektrische installaties, ATEX-apparatuur en meetsystemen",
            "Rapportage van technische bevindingen en afwijkingen aan Maintenance Manager",
            "Ondersteuning bij VOP (Veiligheid Op Proefstelling) en statische elektriciteitscontroles",
            "Correct gebruik van gespecialiseerde PBM's (elektrisch geïsoleerd gereedschap, spanningsvrije werkwijze)"
        ],
        "bevoegdheden": [
            "Uitvoeren van LOTO-procedures op elektrische installaties",
            "Keuring van elektrische systemen en explosieveiligheidsmaatregelen",
            "Stopzetten van werkzaamheden bij onveilige elektrische situaties",
            "Aanvragen van werkvergunningen voor elektrische/instrumentatie werkzaamheden"
        ],
        "rapportage_aan": "Maintenance Manager",
        "rapportage_van": "(geen directe rapporten)",
        "competenties": [
            "MBO Elektrotechniek niveau 3/4",
            "VCA-basis certificaat",
            "ATEX-bewustzijnstraining (ex-veiligheid)",
            "BHV-certificering",
            "VOP-certificering (Veiligheid Op Proefstelling)"
        ],
        "kpis": [
            "100% LOTO-compliance bij alle E&I-werkzaamheden",
            "Niel elektrische incidenten",
            "Alle keuringen tijdig uitgevoerd (≥ 95%)",
            "100% voltooiing verplichte veiligheidstrainingen"
        ]
    },
    {
        "id": 8, "title": "Office Staff (Administration)", "name": "(meerdere personen)",
        "level": "Ondersteuning",
        "responsibilities": [
            "Administratieve ondersteuning van het veiligheidsmanagementsysteem (documentbeheer, registraties) [4]",
            "Beheer van veiligheidsdocumentatie: procedures, certificeringen, keuringsrapporten",
            "Ondersteuning bij organisatie van veiligheidstrainingen en -audits",
            "Rapportage van geobserveerde onveilige situaties in kantoorgebied",
            "Bewaking van toegangsprocedures voor bezoekers en onderaannemers"
        ],
        "bevoegdheden": [
            "Beheer van documentcontrolesystemen en versiebeheer",
            "Toegangsverlening voor bezoekers conform bezoekersreglement",
            "Melden van onveilige situaties in kantoorgebouw",
            "Deelname aan evacuatieoefeningen en BHV-inzet"
        ],
        "rapportage_aan": "Managing Director (administratief) / HSE Manager (veiligheid)",
        "rapportage_van": "(geen directe rapporten)",
        "competenties": [
            "MBO Administratie of vergelijkbaar",
            "BHV-certificering",
            "Bedrijfsinductie Phoenix Metals voltooid",
            "Basiskennis Arbowetgeving [3]"
        ],
        "kpis": [
            "Documentbeheer actueel: 100% versies actueel",
            "100% deelname aan evacuatieoefeningen",
            "Niel incidenten in kantoorgebied",
            "Trainingen administratief tijdig gepland en geregistreerd"
        ]
    },
]


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


def set_cell_text(cell, text, bold=False, size=11, color=None, alignment=None):
    """Set cell text with formatting."""
    cell.text = ""
    p = cell.paragraphs[0]
    if alignment:
        p.alignment = alignment
    run = p.add_run(text)
    run.font.name = FONT
    run.font.size = Pt(size)
    run.font.bold = bold
    if color:
        run.font.color.rgb = color
    p.paragraph_format.space_after = Pt(2)
    p.paragraph_format.space_before = Pt(2)


def set_table_borders(table):
    """Set professional table borders."""
    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="{}"/>'
        '  <w:left w:val="single" w:sz="4" w:space="0" w:color="{}"/>'
        '  <w:bottom w:val="single" w:sz="4" w:space="0" w:color="{}"/>'
        '  <w:right w:val="single" w:sz="4" w:space="0" w:color="{}"/>'
        '  <w:insideH w:val="single" w:sz="4" w:space="0" w:color="{}"/>'
        '  <w:insideV w:val="single" w:sz="4" w:space="0" w:color="{}"/>'
        '</w:tblBorders>'.format(*([BORDER_COLOR]*6))
    )
    tblPr.append(borders)


def add_cover(doc, title, subtitle):
    """Add branded cover page."""
    # Spacer
    for _ in range(4):
        doc.add_paragraph("")

    # Logo
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run()
    run.add_picture(LOGO_PATH, width=Cm(4.0), height=Cm(3.6))

    # Spacer
    doc.add_paragraph("")

    # Title
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(title)
    run.font.name = FONT
    run.font.size = Pt(24)
    run.font.bold = True
    run.font.color.rgb = PRIMARY

    # Subtitle
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(subtitle)
    run.font.name = FONT
    run.font.size = Pt(14)
    run.font.color.rgb = TEXT_COLOR

    doc.add_paragraph("")

    # Metadata table
    meta = [
        ("Project", "Phoenix Metals B.V. — Veiligheidsbeheersysteem (VBS) Element 1"),
        ("Type", title),
        ("Auteur", AUTHOR),
        ("Versie", "1.0"),
        ("Datum", DATE),
        ("Status", "Concept — Ter review door HSE Manager en Managing Director"),
    ]
    table = doc.add_table(rows=len(meta), cols=2, style="Table Grid")
    set_table_borders(table)
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    for i, (k, v) in enumerate(meta):
        set_cell_text(table.cell(i, 0), k, bold=True, color=PRIMARY)
        set_cell_text(table.cell(i, 1), v)
        set_cell_shading(table.cell(i, 0), "F0F4F8")

    # Page break
    doc.add_page_break()


def add_header_footer(doc, project_name):
    """Add header and footer to all sections."""
    for section in doc.sections:
        # Header
        header = section.header
        header.is_linked_to_previous = False
        hp = header.paragraphs[0] if header.paragraphs else header.add_paragraph()
        hp.alignment = WD_ALIGN_PARAGRAPH.LEFT
        run = hp.add_run(project_name)
        run.font.name = FONT
        run.font.size = Pt(9)
        run.font.color.rgb = PRIMARY
        # Logo in header right
        run2 = hp.add_run()
        run2.add_picture(LOGO_PATH, width=Cm(2.0), height=Cm(1.8))
        hp.paragraph_format.space_after = Pt(4)

        # Footer
        footer = section.footer
        footer.is_linked_to_previous = False
        fp = footer.paragraphs[0] if footer.paragraphs else footer.add_paragraph()
        fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = fp.add_run("JvG Consultancy | Safety • Governance • Advisory | © 2026")
        run.font.name = FONT
        run.font.size = Pt(8)
        run.font.color.rgb = TEXT_COLOR
        # Page number
        run2 = fp.add_run("  |  Pagina ")
        run2.font.name = FONT
        run2.font.size = Pt(8)
        run2.font.color.rgb = TEXT_COLOR
        fldChar1 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
        run3 = fp.add_run()
        run3._r.append(fldChar1)
        instrText = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve"> PAGE </w:instrText>')
        run4 = fp.add_run()
        run4._r.append(instrText)
        fldChar2 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
        run5 = fp.add_run()
        run5._r.append(fldChar2)


def add_heading_styled(doc, text, level=1):
    """Add heading with brand color."""
    h = doc.add_heading(text, level=level)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = FONT
    return h


def add_toc(doc):
    """Add table of contents."""
    p = doc.add_paragraph()
    run = p.add_run()
    fldChar_begin = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
    run._r.append(fldChar_begin)
    run2 = p.add_run()
    instrText = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve"> TOC \\o "1-3" \\h \\z \\u </w:instrText>')
    run2._r.append(instrText)
    run3 = p.add_run()
    fldChar_separate = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="separate"/>')
    run3._r.append(fldChar_separate)
    run4 = p.add_run("[Inhoudsopgave — bijwerken in Word: rechtermuisknop → Veld bijwerken]")
    run4.font.name = FONT
    run4.font.size = Pt(10)
    run4.font.color.rgb = RGBColor(0x99, 0x99, 0x99)
    run5 = p.add_run()
    fldChar_end = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
    run5._r.append(fldChar_end)
    doc.add_page_break()


def add_sources(doc):
    """Add bronverwijzingen section."""
    add_heading_styled(doc, "Bronverwijzingen", level=1)
    sources = [
        "[1] Seveso III-richtlijn (2012/18/EU), Bijlage III — Organisatie en personeel: toedeling taken en verantwoordelijkheden.",
        "[2] NTA 8620:2016 — Veiligheidsmanagementsysteem voor Seveso-inrichtingen (BRZO 2015).",
        "[3] Arbowet (Wet van 18 maart 1999) — Artikel 3 (algemene zorgplicht werkgever), Artikel 5 (RI&E).",
        "[4] ISO 45001:2018 — Clausule 5.3 (Organisatierollen, verantwoordelijkheden en bevoegdheden).",
        "[5] Besluit activiteiten leefomgeving (Bal) — Afdeling 4.2 Seveso-inrichtingen.",
        "[6] IPLO.nl — Publicaties Arbowetgeving en branche-RTWI's (Referentie Technologie Waterkeringen / Industrie).",
    ]
    for s in sources:
        p = doc.add_paragraph(s)
        p.paragraph_format.space_after = Pt(4)
        for run in p.runs:
            run.font.name = FONT
            run.font.size = Pt(10)


def add_tier_verify(doc, doc_title):
    """Add TierVerify log."""
    add_heading_styled(doc, "TierVerify — Verificatielog", level=1)
    p = doc.add_paragraph("Onderstaand overzicht dokumenteert de verificatiestappen die zijn uitgevoerd bij de samenstelling van dit document.")
    p.paragraph_format.space_after = Pt(6)
    for run in p.runs:
        run.font.name = FONT
        run.font.size = Pt(10)

    checks = [
        ("Bronverwijzingen", "Alle feitelijke claims voorzien van [1]–[6] referenties", "✅ Volledig"),
        ("Wettelijk kader", "Seveso III Bijlage III, Arbowet art. 3/5, ISO 45001:2018 cl. 5.3 gecheckt", "✅ Volledig"),
        ("Rollen & verantwoordelijkheden", "8 rollen gedefinieerd conform PBZO organigram", "✅ Volledig"),
        ("RACI-matrix", "15 veiligheidstaken × 8 rollen uitgewerkt", "✅ Volledig"),
        ("Documentheader", "Project, Type, Auteur, Versie, Datum, Status aanwezig op cover", "✅ Volledig"),
        ("Branding", "JvG logo, kleurenpalet #003366, Calibri lettertype, footer", "✅ Volledig"),
        ("Kwaliteitscontrole", "Feitelijk, beknopt, hyper-professioneel — geen AI-clichés", "✅ Volledig"),
    ]
    table = doc.add_table(rows=len(checks)+1, cols=3, style="Table Grid")
    set_table_borders(table)
    headers = ["Controlepunt", "Criteria", "Status"]
    for j, h in enumerate(headers):
        set_cell_text(table.cell(0, j), h, bold=True, color=RGBColor(0xFF,0xFF,0xFF))
        set_cell_shading(table.cell(0, j), "003366")
    for i, (cp, cr, st) in enumerate(checks, 1):
        set_cell_text(table.cell(i, 0), cp)
        set_cell_text(table.cell(i, 1), cr)
        set_cell_text(table.cell(i, 2), st)
        if i % 2 == 0:
            for j in range(3):
                set_cell_shading(table.cell(i, j), "F5F7FA")


# ═══════════════════════════════════════════════════════════
# DOCUMENT 2: Functieprofielen Veiligheidsverantwoordelijkheden
# ═══════════════════════════════════════════════════════════

def build_doc2():
    doc = Document()
    # Set default font
    style = doc.styles['Normal']
    font = style.font
    font.name = FONT
    font.size = Pt(11)
    font.color.rgb = TEXT_COLOR

    add_cover(doc, "Functieprofielen Veiligheidsverantwoordelijkheden",
              "Toedeling van taken, bevoegdheden en verantwoordelijkheden conform Bijlage III Seveso")

    add_toc(doc)

    # 1. Doel en toepassingsgebied
    add_heading_styled(doc, "1. Doel en toepassingsgebied", level=1)
    p = doc.add_paragraph(
        "Dit document beschrijft de veiligheidsverantwoordelijkheden, bevoegdheden, rapportagelijnen, competenties en prestatie-indicatoren voor elke functie binnen de veiligheidsorganisatie van Phoenix Metals B.V. [1][4]"
    )
    p2 = doc.add_paragraph(
        "De toedeling van taken en verantwoordelijkheden is conform Bijlage III van de Seveso III-richtlijn (2012/18/EU) en ISO 45001:2018 clausule 5.3, ondanks dat Phoenix Metals B.V. vrijwillig compliance toepast [1][4]."
    )
    p3 = doc.add_paragraph(
        "Toepassingsgebied: alle medewerkers, onderaannemers en uitzendkrachten werkzaam op de PlantOne-locatie te IJmuiden en het kantoor te Rotterdam."
    )
    for px in [p, p2, p3]:
        for run in px.runs:
            run.font.name = FONT
            run.font.size = Pt(11)

    # 2. Functieprofielen
    add_heading_styled(doc, "2. Functieprofielen", level=1)

    for role in ROLES:
        add_heading_styled(doc, f"2.{role['id']} {role['title']}", level=2)
        if role['name'] != "(vacant)" and role['name'] != "(meerdere personen)":
            p = doc.add_paragraph(f"Naam: {role['name']}")
            for run in p.runs:
                run.font.name = FONT
                run.font.bold = True

        # Create table with 6 rows: responsibilities, bevoegdheden, rapportage, competenties, KPI's
        sections_data = [
            ("Primaire veiligheidsverantwoordelijkheden", role['responsibilities']),
            ("Bevoegdheden", role['bevoegdheden']),
            ("Rapportagelijnen", None),
            ("Vereiste competenties / certificeringen", role['competenties']),
            ("KPI's", role['kpis']),
        ]

        for sec_title, sec_items in sections_data:
            add_heading_styled(doc, sec_title, level=3)

            if sec_title == "Rapportagelijnen":
                rt = doc.add_table(rows=2, cols=2, style="Table Grid")
                set_table_borders(rt)
                set_cell_text(rt.cell(0, 0), "Rapporteert aan", bold=True, color=PRIMARY)
                set_cell_shading(rt.cell(0, 0), "F0F4F8")
                set_cell_text(rt.cell(0, 1), role['rapportage_aan'])
                set_cell_text(rt.cell(1, 0), "Ontvangt rapporten van", bold=True, color=PRIMARY)
                set_cell_shading(rt.cell(1, 0), "F0F4F8")
                set_cell_text(rt.cell(1, 1), role['rapportage_van'])
                doc.add_paragraph("")
                continue

            for item in sec_items:
                p = doc.add_paragraph(item, style='List Bullet')
                for run in p.runs:
                    run.font.name = FONT
                    run.font.size = Pt(10)

        doc.add_page_break()

    # 3. RACI-matrix
    add_heading_styled(doc, "3. RACI-matrix — Dagelijkse veiligheidstaken", level=1)
    p = doc.add_paragraph(
        "Onderstaande matrix toont de toedeling van verantwoordelijkheden voor 15 dagelijkse veiligheidstaken. R = Responsible (uitvoerder), A = Accountable (eindverantwoordelijke), C = Consulted (gevraagd advies), I = Informed (geïnformeerd) [2][4]."
    )
    for run in p.runs:
        run.font.name = FONT
        run.font.size = Pt(10)

    tasks = [
        "RI&E uitvoeren",
        "TRA uitvoeren",
        "PtW afgeven",
        "LOTO toepassen",
        "Toolbox leiden",
        "Incident melden",
        "Incident onderzoeken",
        "MoC beoordelen",
        "Noodplan activeren",
        "Audit uitvoeren",
        "BNO-leiding nemen",
        "BHV inzet",
        "PBM keuring",
        "Training volgen",
        "Near-miss rapporteren",
    ]

    # RACI assignments: [MD, OM, HSE-M, MM, HSE-S, FO, E&I, OS]
    raci = [
        ["A","I","R","I","C","I","I","I"],  # RI&E
        ["I","A","C","C","R","R","R","I"],  # TRA
        ["I","A","C","R","C","R","R","I"],  # PtW
        ["I","A","C","A","C","R","R","I"],  # LOTO
        ["I","A","C","C","R","R","R","I"],  # Toolbox
        ["I","I","I","I","C","R","R","R"],  # Incident melden
        ["I","A","R","C","C","C","C","I"],  # Incident onderzoeken
        ["A","R","R","C","I","I","I","I"],  # MoC
        ["A","R","R","C","C","I","I","I"],  # Noodplan
        ["I","I","R","I","C","I","I","I"],  # Audit
        ["I","A","R","C","C","I","I","I"],  # BNO-leiding
        ["I","R","C","C","R","R","R","R"],  # BHV
        ["I","I","C","A","C","I","R","I"],  # PBM keuring
        ["I","A","C","C","C","R","R","R"],  # Training
        ["I","I","C","I","C","R","R","R"],  # Near-miss
    ]

    role_short = ["MD","OM","HSE-M","MM","HSE-S","FO","E&I","OS"]
    role_names_short = [
        "Managing Director",
        "Operations Manager",
        "HSE Manager",
        "Maintenance Manager",
        "HSE Supervisor",
        "Field Operator",
        "E&I Technician",
        "Office Staff"
    ]

    table = doc.add_table(rows=len(tasks)+1, cols=9, style="Table Grid")
    set_table_borders(table)
    # Header row
    set_cell_text(table.cell(0, 0), "Veiligheidstaak", bold=True, color=RGBColor(0xFF,0xFF,0xFF), size=9)
    set_cell_shading(table.cell(0, 0), "003366")
    for j, rs in enumerate(role_short):
        set_cell_text(table.cell(0, j+1), rs, bold=True, color=RGBColor(0xFF,0xFF,0xFF), size=8)
        set_cell_shading(table.cell(0, j+1), "003366")
        table.cell(0, j+1).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER

    for i, task in enumerate(tasks, 1):
        set_cell_text(table.cell(i, 0), task, size=9)
        if i % 2 == 0:
            set_cell_shading(table.cell(i, 0), "F5F7FA")
        for j, val in enumerate(raci[i-1]):
            set_cell_text(table.cell(i, j+1), val, size=9)
            table.cell(i, j+1).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
            if i % 2 == 0:
                set_cell_shading(table.cell(i, j+1), "F5F7FA")

    # Legend
    doc.add_paragraph("")
    p = doc.add_paragraph("Legenda: MD = Managing Director, OM = Operations Manager, HSE-M = HSE Manager, MM = Maintenance Manager, HSE-S = HSE Supervisor, FO = Field Operator, E&I = E&I Technician, OS = Office Staff")
    for run in p.runs:
        run.font.name = FONT
        run.font.size = Pt(8)
        run.font.italic = True

    p2 = doc.add_paragraph("R = Responsible (uitvoering), A = Accountable (eindverantwoordelijk), C = Consulted (advies), I = Informed (informed)")
    for run in p2.runs:
        run.font.name = FONT
        run.font.size = Pt(8)
        run.font.italic = True

    doc.add_page_break()

    # Sources and TierVerify
    add_sources(doc)
    doc.add_page_break()
    add_tier_verify(doc, "Functieprofielen Veiligheidsverantwoordelijkheden")

    add_header_footer(doc, "Phoenix Metals B.V. — VBS Element 1: Functieprofielen")

    # Document properties
    doc.core_properties.title = "PM VBS01-02 Functieprofielen Veiligheidsverantwoordelijkheden"
    doc.core_properties.author = AUTHOR
    doc.core_properties.keywords = "Seveso, VBS, functieprofielen, RACI, veiligheidsorganisatie, Phoenix Metals"

    outpath = os.path.join(OUT_DIR, "PM_VBS01_02_Functieprofielen_Veiligheid_v1.0.docx")
    doc.save(outpath)
    print(f"✅ Document 2 saved: {outpath}")


# ═══════════════════════════════════════════════════════════
# DOCUMENT 3: Organigram Veiligheidsstructuur
# ═══════════════════════════════════════════════════════════

def build_doc3():
    doc = Document()
    style = doc.styles['Normal']
    font = style.font
    font.name = FONT
    font.size = Pt(11)
    font.color.rgb = TEXT_COLOR

    add_cover(doc, "Organigram Veiligheidsstructuur",
              "Veiligheidsorganisatie, rapportagelijnen en escalatiepaden conform Bijlage III Seveso")

    add_toc(doc)

    # 1. Doel
    add_heading_styled(doc, "1. Doel", level=1)
    p = doc.add_paragraph(
        "Dit document geeft inzicht in de veiligheidsorganisatie van Phoenix Metals B.V., inclusief de hiërarchische structuur, rapportagelijnen en escalatiepaden. De structuur is opgezet conform Bijlage III van de Seveso III-richtlijn (2012/18/EU) die vereist dat taken, verantwoordelijkheden en bevoegdheden duidelijk zijn toegedeeld [1][4]."
    )
    for run in p.runs:
        run.font.name = FONT

    # 2. Veiligheidsorganigram
    add_heading_styled(doc, "2. Veiligheidsorganigram", level=1)
    p = doc.add_paragraph(
        "Het onderstaande organigram toont de hiërarchische veiligheidsstructuur van Phoenix Metals B.V. De verbindingen geven formele rapportagelijnen aan voor veiligheidszaken [1]."
    )
    for run in p.runs:
        run.font.name = FONT

    doc.add_paragraph("")

    # Build organigram using tables
    # Level 1: MD
    t1 = doc.add_table(rows=1, cols=1, style="Table Grid")
    set_table_borders(t1)
    t1.alignment = WD_TABLE_ALIGNMENT.CENTER
    c = t1.cell(0,0)
    set_cell_shading(c, "003366")
    p = c.paragraphs[0]
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("MANAGING DIRECTOR\nStijn van Zelst")
    run.font.name = FONT
    run.font.size = Pt(12)
    run.font.bold = True
    run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)

    # Connector line
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("│")
    run.font.size = Pt(14)
    run.font.color.rgb = PRIMARY

    # Level 2: OM + HSE-M
    t2 = doc.add_table(rows=1, cols=2, style="Table Grid")
    set_table_borders(t2)
    t2.alignment = WD_TABLE_ALIGNMENT.CENTER
    for j, (title, name) in enumerate([
        ("OPERATIONS MANAGER", "(vacant)"),
        ("HSE MANAGER", "(vacant)")
    ]):
        c = t2.cell(0, j)
        set_cell_shading(c, "1A5276")
        p = c.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run(f"{title}\n{name}")
        run.font.name = FONT
        run.font.size = Pt(10)
        run.font.bold = True
        run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)

    # Connector
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("┌──────────────┼──────────────┐")
    run.font.size = Pt(10)
    run.font.color.rgb = PRIMARY

    # Level 3: MM + HSE-S + FO
    t3 = doc.add_table(rows=1, cols=3, style="Table Grid")
    set_table_borders(t3)
    t3.alignment = WD_TABLE_ALIGNMENT.CENTER
    for j, (title, name) in enumerate([
        ("MAINTENANCE\nMANAGER", "(vacant)"),
        ("HSE\nSUPERVISOR", "(vacant)"),
        ("FIELD\nOPERATORS", "(meerdere)")
    ]):
        c = t3.cell(0, j)
        set_cell_shading(c, "2E86C1")
        p = c.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run(f"{title}\n{name}")
        run.font.name = FONT
        run.font.size = Pt(9)
        run.font.bold = True
        run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)

    # Connector
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("┌──────────┤          ├──────────┐")
    run.font.size = Pt(10)
    run.font.color.rgb = PRIMARY

    # Level 4: E&I + OS
    t4 = doc.add_table(rows=1, cols=2, style="Table Grid")
    set_table_borders(t4)
    t4.alignment = WD_TABLE_ALIGNMENT.CENTER
    for j, (title, name) in enumerate([
        ("E&I TECHNICIANS", "(meerdere)"),
        ("OFFICE STAFF\n(Administration)", "(meerdere)")
    ]):
        c = t4.cell(0, j)
        set_cell_shading(c, "85C1E9")
        p = c.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run(f"{title}\n{name}")
        run.font.name = FONT
        run.font.size = Pt(9)
        run.font.bold = True
        run.font.color.rgb = RGBColor(0x1F, 0x29, 0x37)

    doc.add_paragraph("")

    # Level descriptions
    add_heading_styled(doc, "2.1 Beschrijving per niveau", level=2)

    levels = [
        ("Niveau 1 — Directie (Managing Director)", 
         "Eindverantwoordelijk voor het veiligheidsbeleid. Keurt het PBZO goed, stelt middelen beschikbaar en fungeert als最高ste escalatiepunt binnen de organisatie. Rapporteert extern aan toezichthouders [1][3]."),
        ("Niveau 2 — Management (Operations Manager, HSE Manager)",
         "Operationele uitvoering van het veiligheidsbeleid. De Operations Manager stuurt de dagelijkse veiligheid op de werkvloer aan; de HSE Manager adviseert en bewaakt het VBS-kader [1][4]."),
        ("Niveau 3 — Toezicht & Uitvoering (Maintenance Manager, HSE Supervisor, Field Operators)",
         "De Maintenance Manager beheert onderhoudsveiligheid. De HSE Supervisor houdt toezicht op de werkvloer. Field Operators voeren werkzaamheden veilig uit en rapporteren afwijkingen [2]."),
        ("Niveau 4 — Specialistisch & Ondersteuning (E&I Technicians, Office Staff)",
         "E&I Technicians voeren specialistisch elektrotechnisch werk veilig uit. Office Staff ondersteunt administratief en bewaakt de kantoorscheiligheid. Beide groepen rapporteren via hun lijnmanager [4]."),
    ]
    for title, desc in levels:
        p = doc.add_paragraph()
        run = p.add_run(title + ": ")
        run.font.name = FONT
        run.font.bold = True
        run.font.color.rgb = PRIMARY
        run2 = p.add_run(desc)
        run2.font.name = FONT
        run2.font.size = Pt(10)
        p.paragraph_format.space_after = Pt(6)

    doc.add_page_break()

    # 3. Rapportagelijnen
    add_heading_styled(doc, "3. Rapportagelijnen", level=1)
    p = doc.add_paragraph(
        "Onderstaande tabel beschrijft de formele rapportagelijnen voor veiligheidszaken: wie rapporteert aan wie, over welke onderwerpen, en met welke frequentie [1][4]."
    )
    for run in p.runs:
        run.font.name = FONT

    rl_data = [
        ("Field Operator", "Operations Manager", "Dagelijkse veiligheidsobservaties, incidenten, near-misses", "Direct bij incident; wekelijks samenvattend"),
        ("E&I Technician", "Maintenance Manager", "Technische veiligheidsbevindingen, LOTO-status, keuringen", "Direct bij incident; wekelijks status"),
        ("HSE Supervisor", "HSE Manager", "Inspectieresultaten, observaties,_correctieveacties", "Dagelijks mondeling; wekelijks rapport"),
        ("Maintenance Manager", "Operations Manager", "Onderhoudsveiligheid, PBM-keuringen, stilstanden", "Wekelijks; direct bij incident"),
        ("HSE Manager", "Managing Director", "VBS-prestaties, auditresultaten, incidentanalyses, trends", "Maandelijks rapport; direct bij ernstig incident"),
        ("Operations Manager", "Managing Director", "Operationele veiligheidskPI's, TRA-statistieken, escalaties", "Wekelijks; direct bij ernstig incident"),
        ("Office Staff", "Managing Director / HSE Manager", "Kantoorscheiligheid, documentbeheer, bezoekersreglement", "Maandelijks; direct bij incident"),
    ]

    table = doc.add_table(rows=len(rl_data)+1, cols=4, style="Table Grid")
    set_table_borders(table)
    for j, h in enumerate(["Van (rol)", "Aan (rol)", "Onderwerp", "Frequentie"]):
        set_cell_text(table.cell(0, j), h, bold=True, color=RGBColor(0xFF,0xFF,0xFF), size=9)
        set_cell_shading(table.cell(0, j), "003366")
    for i, row_data in enumerate(rl_data, 1):
        for j, val in enumerate(row_data):
            set_cell_text(table.cell(i, j), val, size=9)
            if i % 2 == 0:
                set_cell_shading(table.cell(i, j), "F5F7FA")

    doc.add_page_break()

    # 4. Escalatiepad
    add_heading_styled(doc, "4. Escalatiepad", level=1)
    p = doc.add_paragraph(
        "Het escalatiepad definieert de route die veiligheidsincidenten en -kwesties doorlopen van werkvloer naar extern niveau. Elke stap heeft een duidelijke trigger en actie [1]."
    )
    for run in p.runs:
        run.font.name = FONT

    esc_data = [
        ("1", "Werkvloer\n(Field Operator / E&I)", "Onveilige situatie, near-miss, incident",
         "Direct stoppen werk, melden aan lijnmanager, TRA herzien", "Direct"),
        ("2", "HSE Supervisor", "Bevestigd incident, herhaalde near-miss",
         "Inspectie, registratie,_correctieadvies, escalatie naar HSE Manager", "< 1 uur"),
        ("3", "HSE Manager", "Incident met letsel, milieu-impact, of systeemfalen",
         "Onderzoek starten, corrective actions definiëren, melden aan MT", "< 4 uur"),
        ("4", "Operations Manager", "Ernstig incident, stillegging, meerdere betrokkenen",
         "Operationele maatregelen, communicatie, escalatie naar MD", "< 4 uur"),
        ("5", "Managing Director", "Zwaar ongeval, milieuramp, media-aandacht",
         "Bestuurlijke besluitvorming, externe melding, crisiscommunicatie", "Direct"),
        ("6", "Extern\n(Brandweer, Omgevingsdienst, DCMR, Arbeidsinspectie)", "Meldplichtig incident, MILIEU-incident",
         "Formele melding, samenwerking hulpdiensten, verslaglegging", "Conform wetgeving"),
    ]

    table = doc.add_table(rows=len(esc_data)+1, cols=5, style="Table Grid")
    set_table_borders(table)
    for j, h in enumerate(["Stap", "Niveau", "Trigger", "Actie", "Responstijd"]):
        set_cell_text(table.cell(0, j), h, bold=True, color=RGBColor(0xFF,0xFF,0xFF), size=9)
        set_cell_shading(table.cell(0, j), "003366")
    for i, row_data in enumerate(esc_data, 1):
        for j, val in enumerate(row_data):
            set_cell_text(table.cell(i, j), val, size=9)
            if i % 2 == 0:
                set_cell_shading(table.cell(i, j), "F5F7FA")

    doc.add_paragraph("")

    # 5. Contactgegevens structuur
    add_heading_styled(doc, "5. Contactgegevens structuur", level=1)
    p = doc.add_paragraph(
        "Onderstaande tabel beschrijft de bereikbaarheid en beschikbaarheid van elke veiligheidsrol. Concrete contactgegevens (telefoonnummers, e-mail) worden toegevoegd na invulling van vacatures."
    )
    for run in p.runs:
        run.font.name = FONT

    contact_data = [
        ("Managing Director", "Stijn van Zelst", "Kantoor + mobiel", "Kantooruren + bereikbaar buiten kantoortijd voor escalaties"),
        ("Operations Manager", "(vacant)", "Mobiel + walkietalkie", "Dagdienst (07:00–17:00); bereikbaar bij nood"),
        ("HSE Manager", "(vacant)", "Mobiel + e-mail", "Kantooruren; 24/7 bereikbaar bij incidenten"),
        ("Maintenance Manager", "(vacant)", "Mobiel + walkietalkie", "Dagdienst; oproepbaar voor calamiteitenonderhoud"),
        ("HSE Supervisor", "(vacant)", "Walkietalkie + mobiel", "Dagdienst aanwezig op PlantOne-werkvloer"),
        ("Field Operators", "(meerdere)", "Walkietalkie", "Ploegendienst (24/7 bezetting)"),
        ("E&I Technicians", "(meerdere)", "Walkietalkie + mobiel", "Dagdienst; oproepbaar"),
        ("Office Staff", "(meerdere)", "E-mail + vast toestel", "Kantooruren (08:30–17:00)"),
    ]

    table = doc.add_table(rows=len(contact_data)+1, cols=4, style="Table Grid")
    set_table_borders(table)
    for j, h in enumerate(["Functie", "Naam", "Bereikbaarheid", "Beschikbaarheid"]):
        set_cell_text(table.cell(0, j), h, bold=True, color=RGBColor(0xFF,0xFF,0xFF), size=9)
        set_cell_shading(table.cell(0, j), "003366")
    for i, row_data in enumerate(contact_data, 1):
        for j, val in enumerate(row_data):
            set_cell_text(table.cell(i, j), val, size=9)
            if i % 2 == 0:
                set_cell_shading(table.cell(i, j), "F5F7FA")

    doc.add_page_break()

    # Sources and TierVerify
    add_sources(doc)
    doc.add_page_break()
    add_tier_verify(doc, "Organigram Veiligheidsstructuur")

    add_header_footer(doc, "Phoenix Metals B.V. — VBS Element 1: Organigram Veiligheidsstructuur")

    doc.core_properties.title = "PM VBS01-03 Organigram Veiligheidsstructuur"
    doc.core_properties.author = AUTHOR
    doc.core_properties.keywords = "Seveso, VBS, organigram, veiligheidsstructuur, rapportagelijnen, Phoenix Metals"

    outpath = os.path.join(OUT_DIR, "PM_VBS01_03_Organigram_Veiligheid_v1.0.docx")
    doc.save(outpath)
    print(f"✅ Document 3 saved: {outpath}")


if __name__ == "__main__":
    build_doc2()
    build_doc3()
    print("✅ Beide documenten gegenereerd.")
