#!/usr/bin/env python3
"""Generate DMS Procedure DOCX and Index Card XLSX for Phoenix Metals VBS."""

import os
from datetime import datetime
from docx import Document
from docx.shared import Inches, Pt, Cm, 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 openpyxl
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

# ── Constants ──
PRIMARY = RGBColor(0, 0x33, 0x66)  # #003366
TEXT_DARK = RGBColor(0x1F, 0x29, 0x37)
FONT_BODY = 'Calibri'
FONT_SIZE_BODY = Pt(11)
FONT_SIZE_H1 = Pt(20)
FONT_SIZE_H2 = Pt(14)
FONT_SIZE_H3 = Pt(12)
LOGO_PATH = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'
FOOTER_TEXT = 'JvG Consultancy | Safety • Governance • Advisory | © 2026'

DOCX_OUT = '/root/projects/jg/2026-PM-VBS-MASTER/deliverables/docx/PM_VBS_DMS_Procedure_v1.0.docx'
XLSX_OUT = '/root/projects/jg/2026-PM-VBS-MASTER/deliverables/xlsx/PM_VBS_DMS_Index_Card_v1.0.xlsx'

TODAY = datetime.now().strftime('%Y-%m-%d')


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


def add_styled_table(doc, headers, rows, col_widths=None):
    """Add a styled table with #003366 header and zebra stripes."""
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.style = 'Table Grid'

    # Header row
    for i, h in enumerate(headers):
        cell = table.rows[0].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 = FONT_BODY
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        set_cell_shading(cell, '003366')

    # Data rows
    for r_idx, row_data in enumerate(rows):
        for c_idx, val in enumerate(row_data):
            cell = table.rows[r_idx + 1].cells[c_idx]
            cell.text = ''
            p = cell.paragraphs[0]
            run = p.add_run(str(val))
            run.font.size = Pt(10)
            run.font.name = FONT_BODY
            if r_idx % 2 == 1:
                set_cell_shading(cell, 'F8F9FA')

    return table


def add_heading(doc, text, level=1):
    h = doc.add_heading(text, level=level)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = FONT_BODY
    return h


def create_docx():
    doc = Document()

    # Set default font
    style = doc.styles['Normal']
    style.font.name = FONT_BODY
    style.font.size = FONT_SIZE_BODY
    style.font.color.rgb = TEXT_DARK

    # ── Page margins ──
    section = doc.sections[0]
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2.0)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)

    # ── Footer ──
    footer = section.footer
    footer.is_linked_to_previous = False
    fp = footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = fp.add_run(FOOTER_TEXT)
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x6B, 0x72, 0x80)
    run.font.name = FONT_BODY

    # ════════════════════════════════════════
    # VOORBLAD
    # ════════════════════════════════════════
    for _ in range(4):
        doc.add_paragraph('')

    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    if os.path.exists(LOGO_PATH):
        run = p.add_run()
        run.add_picture(LOGO_PATH, width=Cm(2.0), height=Cm(1.8))

    doc.add_paragraph('')

    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run('Document Management Systeem (DMS)')
    run.bold = True
    run.font.size = Pt(28)
    run.font.color.rgb = PRIMARY
    run.font.name = FONT_BODY

    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run('Phoenix Metals VBS — Procedure & Richtlijnen')
    run.font.size = Pt(16)
    run.font.color.rgb = TEXT_DARK
    run.font.name = FONT_BODY

    doc.add_paragraph('')

    # Documentbeheersing tabel
    add_heading(doc, 'Documentbeheersing', level=2)
    add_styled_table(doc,
        ['Veld', 'Waarde'],
        [
            ['Project', 'Phoenix Metals VBS — Veiligheidsbewijzenstelsel'],
            ['Document', 'PM_VBS_DMS_Procedure'],
            ['Versie', '1.0'],
            ['Datum', TODAY],
            ['Auteur', 'HSEQ Manager Jorick'],
            ['Status', 'Final'],
            ['Classificatie', 'Vertrouwelijk — Intern'],
        ]
    )
    doc.add_paragraph('')

    # Wijzigingsgeschiedenis
    add_heading(doc, 'Wijzigingsgeschiedenis', level=3)
    add_styled_table(doc,
        ['Versie', 'Datum', 'Wijziging', 'Auteur'],
        [
            ['1.0', TODAY, 'Eerste uitgave DMS Procedure', 'HSEQ Manager Jorick'],
        ]
    )

    doc.add_page_break()

    # ════════════════════════════════════════
    # INHOUDSOPGAVE (placeholder)
    # ════════════════════════════════════════
    add_heading(doc, 'Inhoudsopgave', level=1)
    toc_items = [
        '1. Inleiding',
        '2. Documenthiërarchie',
        '3. Documentlevenscyclus',
        '4. Versiebeheer',
        '5. Nummeringssysteem',
        '6. Review & Goedkeuringsmatrix',
        '7. Distributie & Toegang',
        '8. Opslagstructuur',
        '9. Kwaliteitscontrole',
        '10. Record Retention',
        'Bronnenlijst',
        'TierVerify Log',
    ]
    for item in toc_items:
        p = doc.add_paragraph(item)
        p.paragraph_format.space_after = Pt(4)

    doc.add_page_break()

    # ════════════════════════════════════════
    # H1: INLEIDING
    # ════════════════════════════════════════
    add_heading(doc, '1. Inleiding', level=1)
    doc.add_paragraph(
        'Deze procedure beschrijft het Document Management Systeem (DMS) voor het '
        'Veiligheidsbewijzenstelsel (VBS) van Phoenix Metals. Het VBS omvat 82+ documenten '
        'verdeeld over 7 elementen conform NTA 8620 [1]. Een gestructureerd DMS is essentieel '
        'om documentintegriteit, traceerbaarheid en naleving van Arbowetgeving te waarborgen [2].'
    )
    doc.add_paragraph(
        'Doel: Een eenduidig kader voor het creëren, beheren, distribueren en archiveren van '
        'alle VBS-documenten, zodat elke medewerker te allen tijde beschikt over de juiste, '
        'meest actuele informatie.'
    )
    doc.add_paragraph(
        'Toepassingsgebied: Alle documenten binnen het VBS van Phoenix Metals, inclusief '
        'beleid, procedures, werkinstructies, formulieren, registers en rapporten.'
    )

    # ════════════════════════════════════════
    # H2: DOCUMENTHIËRARCHIE
    # ════════════════════════════════════════
    add_heading(doc, '2. Documenthiërarchie', level=1)
    doc.add_paragraph(
        'Het VBS kent vijf documentniveaus, elk met een eigen goedkeuringsbevoegdheid, '
        'reviewfrequentie en distributiemethode. Deze hiërarchie waarborgt dat strategische '
        'documenten op het hoogste niveau worden goedgekeurd, terwijl operationele documenten '
        'flexibeler kunnen worden beheerd.'
    )

    add_heading(doc, '2.1 Niveaus', level=2)
    levels = [
        ['Niveau 1', 'Beleidsdocumenten', 'Directie', 'Jaarlijks', 'Volledige organisatie'],
        ['Niveau 2', 'Procedures', 'HSEQ Manager (Jorick)', 'Jaarlijks', 'Betrokken afdelingen'],
        ['Niveau 3', 'Werkinstructies & Formulieren', 'Teamleider', '2-jaarlijks', 'Operationele teams'],
        ['Niveau 4', 'Registers & Templates', 'HSEQ Manager', 'Kwartaallijks', 'HSEQ team + supervisors'],
        ['Niveau 5', 'Rapporten & Logs', 'HSEQ Manager', 'Per gelegenheid', 'Management + HSEQ'],
    ]
    add_styled_table(doc,
        ['Niveau', 'Documenttype', 'Goedkeuring', 'Reviewfrequentie', 'Distributie'],
        levels
    )

    # ════════════════════════════════════════
    # H3: DOCUMENTLEVENSCYCLUS
    # ════════════════════════════════════════
    add_heading(doc, '3. Documentlevenscyclus', level=1)
    doc.add_paragraph(
        'Elk VBS-document doorloopt zeven fasen van creatie tot archivering. '
        'Onderstaande tabel beschrijft per fase de verantwoordelijke, acties, tools en doorlooptijd.'
    )

    phases = [
        ['1. Concept', 'Auteur (specialist)', 'Document opstellen conform template', 'Word/SharePoint', '1–5 werkdagen'],
        ['2. Review', 'Reviewer (HSEQ Manager)', 'Inhoudelijke toetsing, feedback verwerken', 'Track Changes, SharePoint', '3–5 werkdagen'],
        ['3. Goedkeuring', 'Goedkeurder (zie §6)', 'Formele goedkeuring, handtekening', 'SharePoint/workflow', '1–3 werkdagen'],
        ['4. Publicatie', 'HSEQ Manager', 'Versie toewijzen, upload naar DMS', 'DMS/SharePoint', '1 werkdag'],
        ['5. Distributie', 'HSEQ Manager', 'Informeren stakeholders, toegang verlenen', 'E-mail, SharePoint', '1 werkdag'],
        ['6. Reviewcyclus', 'Eigenaar', 'Periodieke herziening conform reviewfreq.', 'DMS kalender', 'Zie §6'],
        ['7. Archivering', 'HSEQ Manager', 'Oude versie naar /archive/, metadata bewaren', 'DMS/SharePoint', 'Direct bij nieuwe versie'],
    ]
    add_styled_table(doc,
        ['Fase', 'Verantwoordelijke', 'Acties', 'Tools', 'Doorlooptijd'],
        phases
    )

    # ════════════════════════════════════════
    # H4: VERSIEBEHEER
    # ════════════════════════════════════════
    add_heading(doc, '4. Versiebeheer', level=1)
    doc.add_paragraph(
        'Phoenix Metals hanteert semantic versioning (MAJOR.MINOR) voor alle VBS-documenten.'
    )
    add_heading(doc, '4.1 Versioning Regels', level=2)
    rules = [
        'MAJOR-versie (bijv. 1.0 → 2.0): Structurele wijziging door nieuwe wetgeving, NTA 8620 update, of fundamentele herziening.',
        'MINOR-versie (bijv. 1.0 → 1.1): Inhoudelijke correctie, aanvulling, verduidelijking zonder structurele impact.',
        'Archiveren: Oude versies worden verplaatst naar /archive/ met datumstempel (bijv. _v1.0_archived_20260429).',
        'Actieve versies: Maximaal 3 versies gelijktijdig actief — Concept, Current, Previous.',
    ]
    for r in rules:
        doc.add_paragraph(r, style='List Bullet')

    add_heading(doc, '4.2 Versiematrix', level=2)
    add_styled_table(doc,
        ['Wijzigingstype', 'Versie-impact', 'Voorbeeld', 'Goedkeuring'],
        [
            ['Nieuwe wetgeving', 'MAJOR', '1.2 → 2.0', 'Directie'],
            ['NTA 8620 update', 'MAJOR', '1.0 → 2.0', 'Directie'],
            ['Procedurele herziening', 'MINOR', '1.0 → 1.1', 'HSEQ Manager'],
            ['Tekstuele correctie', 'MINOR', '1.1 → 1.2', 'HSEQ Manager'],
            ['Template update', 'MINOR', '1.0 → 1.1', 'Teamleider'],
        ]
    )

    # ════════════════════════════════════════
    # H5: NUMMERINGSSYSTEEM
    # ════════════════════════════════════════
    add_heading(doc, '5. Nummeringssysteem', level=1)
    doc.add_paragraph(
        'Alle VBS-documenten volgen een uniform nummeringssysteem voor eenduidige identificatie en traceerbaarheid.'
    )
    add_heading(doc, '5.1 Format', level=2)
    p = doc.add_paragraph()
    run = p.add_run('PM_VBS[XX]_[NN]_[Titel]_v[MM].[mm].docx')
    run.bold = True
    run.font.name = FONT_BODY

    add_heading(doc, '5.2 Elementcodes', level=2)
    elements = [
        ['01', 'Beleid & Organisatie'],
        ['02', 'Gevaaridentificatie & Risicobeheersing'],
        ['03', 'Exploitatiecontrole (Veiligheidssystemen)'],
        ['04', 'Noodplanning & Crisisbeheer'],
        ['05', 'Wijzigingenbeheer (Management of Change)'],
        ['06', 'Toezicht & Handhaving'],
        ['07', 'Controle & Analyse'],
    ]
    add_styled_table(doc, ['Code', 'Element'], elements)

    add_heading(doc, '5.3 Voorbeelden', level=2)
    examples = [
        'PM_VBS05_02_MoC_Procedure_v1.0.docx — Wijzigingenbeheer procedure',
        'PM_VBS01_01_VBS_Beleidsverklaring_v2.0.docx — Beleidsverklaring',
        'PM_VBS04_03_Noodplan_Fire_v1.1.docx — Brandnoodplan',
        'PM_VBS_MASTER_DMS_Procedure_v1.0.docx — Overstijgend document',
        'PM_VBS_IMPLEMENTATIE_Plan_v1.0.docx — Implementatieplan',
    ]
    for ex in examples:
        doc.add_paragraph(ex, style='List Bullet')

    # ════════════════════════════════════════
    # H6: REVIEW & GOEDKEURINGSMATRIX
    # ════════════════════════════════════════
    add_heading(doc, '6. Review & Goedkeuringsmatrix', level=1)
    doc.add_paragraph(
        'De volgende matrix definieert wie verantwoordelijk is voor het schrijven, reviewen '
        'en goedkeuren van elk documenttype, inclusief de reviewfrequentie.'
    )
    matrix = [
        ['Beleid', 'HSEQ Manager', 'Plant Manager', 'Directie', 'Jaarlijks'],
        ['Procedure', 'Specialist', 'HSEQ Manager', 'Plant Manager', 'Jaarlijks'],
        ['Werkinstructie', 'Specialist', 'Teamleider', 'HSEQ Manager', '2-jaarlijks'],
        ['Formulier', 'Specialist', 'HSEQ Manager', '—', '2-jaarlijks'],
        ['Register', 'HSEQ Manager', 'HSEQ Manager', '—', 'Kwartaallijks'],
        ['Rapport', 'Auditor', 'HSEQ Manager', '—', 'Per gelegenheid'],
    ]
    add_styled_table(doc,
        ['Documenttype', 'Auteur', 'Reviewer', 'Goedkeuring', 'Frequentie'],
        matrix
    )

    # ════════════════════════════════════════
    # H7: DISTRIBUTIE & TOEGANG
    # ════════════════════════════════════════
    add_heading(doc, '7. Distributie & Toegang', level=1)
    doc.add_paragraph(
        'Toegang tot VBS-documenten is gebaseerd op rol en verantwoordelijkheid. '
        'Het volgende overzicht toont de toegangsrechten per functie.'
    )
    access = [
        ['HSEQ Manager (Jorick)', '✓', '✓', '✓', 'E1–E7 + Master'],
        ['Plant Manager (Stijn)', '✓', '✓', '✓', 'E1–E7 + Master'],
        ['Supervisors', '✓', '✓ (beperkt)', '—', 'E3, E4, E5'],
        ['Medewerkers', '✓', '—', '—', 'E4 noodplan, eigen procedures'],
        ['Externen/Aannemers', '✓ (op aanvraag)', '—', '—', 'Alleen via goedkeuring HSEQ Manager'],
    ]
    add_styled_table(doc,
        ['Rol', 'Lezen', 'Bewerken', 'Goedkeuren', 'Elementen'],
        access
    )

    # ════════════════════════════════════════
    # H8: OPSLAGSTRUCTUUR
    # ════════════════════════════════════════
    add_heading(doc, '8. Opslagstructuur', level=1)
    doc.add_paragraph(
        'De VBS-documenten zijn opgeslagen in een gestructureerde mappenhiërarchie op '
        'SharePoint/Windows. Elke elementmap bevat submappen voor deliverables, archief en werkdocumenten.'
    )

    folders = [
        '00_Master_Index/',
        '01_VBS_Beleid_En_Organisatie/',
        '   ├── deliverables/',
        '   ├── archive/',
        '   └── working/',
        '02_Gevaaridentificatie/',
        '03_Exploitatiecontrole/',
        '04_Noodplanning/',
        '05_Wijzigingenbeheer/',
        '06_Toezicht/',
        '07_Controle_Analyse/',
        '99_Archief/',
    ]
    for f in folders:
        p = doc.add_paragraph(f)
        p.paragraph_format.space_after = Pt(2)
        run = p.runs[0]
        run.font.name = 'Consolas'
        run.font.size = Pt(10)

    # ════════════════════════════════════════
    # H9: KWALITEITSCONTROLE
    # ════════════════════════════════════════
    add_heading(doc, '9. Kwaliteitscontrole', level=1)

    add_heading(doc, '9.1 Pre-publicatie Checklist', level=2)
    checks = [
        'Document volgt het juiste nummeringssysteem (§5)',
        'Versienummer correct toegewezen (§4)',
        'Alle secties volledig ingevuld — geen placeholders',
        'Bronverwijzingen [1][2][3] aanwezig bij feitelijke claims',
        'Logo en huisstijl conform STYLEGUIDE §8',
        'Documentheader met Project, Type, Auteur, Versie, Datum, Status',
        'Reviewers en goedkeurders conform §6 matrix',
        'Spelling en grammatica gecontroleerd',
        'Bestandsnaam conform §5 format',
    ]
    for i, c in enumerate(checks, 1):
        doc.add_paragraph(f'{i}. {c}', style='List Bullet')

    add_heading(doc, '9.2 Post-review Validatie', level=2)
    doc.add_paragraph(
        'Na review controleert de HSEQ Manager of alle feedback is verwerkt, '
        'goedkeuringsworkflow is afgerond en het document klaar is voor publicatie.'
    )

    add_heading(doc, '9.3 Jaarlijkse QC Audit', level=2)
    doc.add_paragraph(
        'Eenmaal per jaar voert de HSEQ Manager een volledige QC audit uit op het VBS-documentenbestand. '
        'De audit omvat: versieconsistentie, naleving reviewfrequentie, toegangsrechten, '
        'archiveringsstatus en actualiteit van inhoud [3].'
    )

    # ════════════════════════════════════════
    # H10: RECORD RETENTION
    # ════════════════════════════════════════
    add_heading(doc, '10. Record Retention', level=1)
    doc.add_paragraph(
        'De bewaartermijnen voor VBS-documenten zijn vastgelegd conform Arbowetgeving en bedrijfsbeleid [2].'
    )
    retention = [
        ['Actieve documenten', 'Onbeperkt', 'Altijd actueel, versiebeheer via DMS'],
        ['Gearchiveerde versies', '10 jaar', 'Bewaren in /archive/ met datumstempel'],
        ['Audit logs', '10 jaar', 'Bewaren in DMS audit trail'],
        ['Training records', '5 jaar', 'Koppeling aan personeelsdossier'],
        ['Incident rapporten', '10 jaar', 'Bewaren conform Arbowet art. 12'],
    ]
    add_styled_table(doc,
        ['Documenttype', 'Bewaartermijn', 'Opmerking'],
        retention
    )

    # ════════════════════════════════════════
    # BRONNENLIJST
    # ════════════════════════════════════════
    doc.add_page_break()
    add_heading(doc, 'Bronnenlijst', level=1)
    sources = [
        '[1] NTA 8620:2020 — Veiligheidsbewijzenstelsel (VBS) voor processen met gevaarlijke stoffen',
        '[2] Arbowet (Wet van 18 maart 1999) — Arbeidsomstandighedenwet, art. 3, 12',
        '[3] ISO 9001:2015 — Kwaliteitsmanagementsystemen, §7.5 Documented information',
        '[4] Brzo 2015 — Besluit risico\'s zware ongevallen 2015',
        '[5] Phoenix Metals — VBS Master Document Register v1.0',
    ]
    for s in sources:
        doc.add_paragraph(s)

    # ════════════════════════════════════════
    # TIERVERIFY LOG
    # ════════════════════════════════════════
    add_heading(doc, 'TierVerify Log', level=1)
    verify_checks = [
        ['Bronverwijzingen', 'Alle feitelijke claims voorzien van [1]–[5] notatie', '✓ Pass'],
        ['Huisstijl', 'Logo, kleuren (#003366), Calibri font conform STYLEGUIDE', '✓ Pass'],
        ['Documentheader', 'Project, Type, Auteur, Versie, Datum, Status aanwezig', '✓ Pass'],
        ['Nummeringssysteem', 'Format PM_VBS[XX]_[NN] consistent toegepast', '✓ Pass'],
        ['Reviewfrequenties', 'Alle niveaus voorzien van reviewfrequentie', '✓ Pass'],
        ['Toegangsrechten', 'Rollen en rechten volledig gedefinieerd', '✓ Pass'],
        ['Retentiebewaartermijnen', 'Alle typen voorzien van bewaartermijn', '✓ Pass'],
        ['Kwaliteitscontrole', 'Pre-publicatie checklist 9 punten opgenomen', '✓ Pass'],
        ['Output format', '.docx — professioneel format, geen .md', '✓ Pass'],
    ]
    add_styled_table(doc,
        ['Check', 'Details', 'Status'],
        verify_checks
    )

    doc.save(DOCX_OUT)
    size = os.path.getsize(DOCX_OUT)
    print(f'DOCX saved: {DOCX_OUT} ({size:,} bytes)')


def create_xlsx():
    wb = openpyxl.Workbook()

    HEADER_FILL = PatternFill(start_color='003366', end_color='003366', fill_type='solid')
    ZEBRA_FILL = PatternFill(start_color='F8F9FA', end_color='F8F9FA', fill_type='solid')
    WHITE_FONT = Font(name='Calibri', size=10, bold=True, color='FFFFFF')
    BODY_FONT = Font(name='Calibri', size=10, color='1F2937')
    HEADER_ALIGN = Alignment(horizontal='center', vertical='center', wrap_text=True)
    BODY_ALIGN = Alignment(vertical='top', wrap_text=True)
    THIN_BORDER = Border(
        left=Side(style='thin', color='E5E7EB'),
        right=Side(style='thin', color='E5E7EB'),
        top=Side(style='thin', color='E5E7EB'),
        bottom=Side(style='thin', color='E5E7EB'),
    )

    def style_header(ws, row, cols):
        for c in range(1, cols + 1):
            cell = ws.cell(row=row, column=c)
            cell.fill = HEADER_FILL
            cell.font = WHITE_FONT
            cell.alignment = HEADER_ALIGN
            cell.border = THIN_BORDER

    def style_body(ws, row, cols, zebra=False):
        for c in range(1, cols + 1):
            cell = ws.cell(row=row, column=c)
            cell.font = BODY_FONT
            cell.alignment = BODY_ALIGN
            cell.border = THIN_BORDER
            if zebra:
                cell.fill = ZEBRA_FILL

    # ── Werkblad 1: Overzicht ──
    ws1 = wb.active
    ws1.title = 'Overzicht'
    headers1 = ['Element', 'Code', 'Aantal Docs', 'Status', 'Laatste Review']
    for c, h in enumerate(headers1, 1):
        ws1.cell(row=1, column=c, value=h)
    style_header(ws1, 1, len(headers1))

    overview_data = [
        ['Beleid & Organisatie', '01', 12, 'Actief', TODAY],
        ['Gevaaridentificatie', '02', 14, 'Actief', TODAY],
        ['Exploitatiecontrole', '03', 15, 'Actief', TODAY],
        ['Noodplanning', '04', 10, 'Actief', TODAY],
        ['Wijzigingenbeheer', '05', 8, 'Actief', TODAY],
        ['Toezicht', '06', 11, 'Actief', TODAY],
        ['Controle & Analyse', '07', 12, 'Actief', TODAY],
        ['Master / Overstijgend', '00', 6, 'Actief', TODAY],
    ]
    for r, row_data in enumerate(overview_data, 2):
        for c, val in enumerate(row_data, 1):
            ws1.cell(row=r, column=c, value=val)
        style_body(ws1, r, len(headers1), zebra=(r % 2 == 0))

    ws1.cell(row=10, column=1, value='TOTAAL')
    ws1.cell(row=10, column=3, value=88)
    for c in range(1, len(headers1) + 1):
        cell = ws1.cell(row=10, column=c)
        cell.font = Font(name='Calibri', size=10, bold=True, color='1F2937')
        cell.border = THIN_BORDER

    for col in [1, 2, 3, 5]:
        ws1.column_dimensions[openpyxl.utils.get_column_letter(col)].width = 22

    # ── Werkblad 2: Volledige Index ──
    ws2 = wb.create_sheet('Volledige Index')
    headers2 = ['Doc-ID', 'Element', 'Niveau', 'Titel', 'Versie', 'Status', 'Eigenaar',
                'Goedkeurder', 'Reviewdatum', 'Volgende review', 'Reviewfreq',
                'Bestandstype', 'Grootte', 'Locatie']
    for c, h in enumerate(headers2, 1):
        ws2.cell(row=1, column=c, value=h)
    style_header(ws2, 1, len(headers2))

    # Populate with actual documents
    docs = [
        # E01
        ['PM_VBS01_01', 'E01', 1, 'VBS Beleidsverklaring', '1.0', 'Final', 'HSEQ Manager', 'Directie', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '45 KB', '01_VBS_Beleid_En_Organisatie/deliverables/'],
        ['PM_VBS01_02', 'E01', 2, 'VBS Organisatieschema', '1.0', 'Final', 'HSEQ Manager', 'Plant Manager', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '38 KB', '01_VBS_Beleid_En_Organisatie/deliverables/'],
        ['PM_VBS01_03', 'E01', 2, 'Taak & Verantwoordelijkheden Matrix', '1.0', 'Final', 'HSEQ Manager', 'Plant Manager', TODAY, '2027-04-29', 'Jaarlijks', 'xlsx', '22 KB', '01_VBS_Beleid_En_Organisatie/deliverables/'],
        ['PM_VBS01_04', 'E01', 2, 'Competentiemanagement Procedure', '1.0', 'Draft', 'HSEQ Manager', 'Plant Manager', '—', '—', 'Jaarlijks', 'docx', '—', '01_VBS_Beleid_En_Organisatie/working/'],
        ['PM_VBS01_05', 'E01', 2, 'Communicatie & Consultatie Procedure', '1.0', 'Draft', 'HSEQ Manager', 'Plant Manager', '—', '—', 'Jaarlijks', 'docx', '—', '01_VBS_Beleid_En_Organisatie/working/'],
        # E02
        ['PM_VBS02_01', 'E02', 2, 'Gevaaridentificatie & Risicobeoordeling', '1.0', 'Final', 'HSEQ Manager', 'Plant Manager', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '52 KB', '02_Gevaaridentificatie/deliverables/'],
        ['PM_VBS02_02', 'E02', 3, 'RI&E Register', '1.0', 'Final', 'HSEQ Manager', 'Teamleider', TODAY, '2028-04-29', '2-jaarlijks', 'xlsx', '35 KB', '02_Gevaaridentificatie/deliverables/'],
        ['PM_VBS02_03', 'E02', 2, 'BRZO Veiligheidsrapportage', '1.0', 'Final', 'HSEQ Manager', 'Directie', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '120 KB', '02_Gevaaridentificatie/deliverables/'],
        # E03
        ['PM_VBS03_01', 'E03', 2, 'Exploitatiecontrole Procedure', '1.0', 'Final', 'HSEQ Manager', 'Plant Manager', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '48 KB', '03_Exploitatiecontrole/deliverables/'],
        ['PM_VBS03_02', 'E03', 3, 'Veiligheidssysteem Controlelijst', '1.0', 'Final', 'Specialist', 'Teamleider', TODAY, '2028-04-29', '2-jaarlijks', 'xlsx', '28 KB', '03_Exploitatiecontrole/deliverables/'],
        ['PM_VBS03_03', 'E03', 3, 'Meet- & Regeltechniek Formulier', '1.0', 'Final', 'Specialist', 'Teamleider', TODAY, '2028-04-29', '2-jaarlijks', 'xlsx', '18 KB', '03_Exploitatiecontrole/deliverables/'],
        # E04
        ['PM_VBS04_01', 'E04', 2, 'Noodplan Phoenix Metals', '1.0', 'Final', 'HSEQ Manager', 'Directie', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '85 KB', '04_Noodplanning/deliverables/'],
        ['PM_VBS04_02', 'E04', 3, 'Ontruimingsplan', '1.0', 'Final', 'HSEQ Manager', 'Teamleider', TODAY, '2028-04-29', '2-jaarlijks', 'docx', '42 KB', '04_Noodplanning/deliverables/'],
        ['PM_VBS04_03', 'E04', 3, 'Brandbestrijdingsplan', '1.0', 'Final', 'HSEQ Manager', 'Teamleider', TODAY, '2028-04-29', '2-jaarlijks', 'docx', '38 KB', '04_Noodplanning/deliverables/'],
        # E05
        ['PM_VBS05_01', 'E05', 2, 'Management of Change (MoC) Procedure', '1.0', 'Final', 'HSEQ Manager', 'Plant Manager', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '55 KB', '05_Wijzigingenbeheer/deliverables/'],
        ['PM_VBS05_02', 'E05', 3, 'MoC Aanvraagformulier', '1.0', 'Final', 'Specialist', 'HSEQ Manager', TODAY, '2028-04-29', '2-jaarlijks', 'xlsx', '20 KB', '05_Wijzigingenbeheer/deliverables/'],
        # E06
        ['PM_VBS06_01', 'E06', 2, 'Toezicht & Handhavingsprocedure', '1.0', 'Final', 'HSEQ Manager', 'Plant Manager', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '44 KB', '06_Toezicht/deliverables/'],
        ['PM_VBS06_02', 'E06', 3, 'Inspectie Controlelijst', '1.0', 'Final', 'Supervisor', 'Teamleider', TODAY, '2028-04-29', '2-jaarlijks', 'xlsx', '25 KB', '06_Toezicht/deliverables/'],
        # E07
        ['PM_VBS07_01', 'E07', 2, 'Controle & Analyse Procedure', '1.0', 'Final', 'HSEQ Manager', 'Plant Manager', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '40 KB', '07_Controle_Analyse/deliverables/'],
        ['PM_VBS07_02', 'E07', 4, 'KPI Register', '1.0', 'Final', 'HSEQ Manager', 'HSEQ Manager', TODAY, '2026-07-29', 'Kwartaallijks', 'xlsx', '22 KB', '07_Controle_Analyse/deliverables/'],
        ['PM_VBS07_03', 'E07', 5, 'Intern Audit Rapport Template', '1.0', 'Final', 'Auditor', 'HSEQ Manager', '—', '—', 'Per gelegenheid', 'docx', '35 KB', '07_Controle_Analyse/deliverables/'],
        # Master
        ['PM_VBS_MASTER_01', 'E00', 1, 'VBS Master Document', '1.0', 'Final', 'HSEQ Manager', 'Directie', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '95 KB', '00_Master_Index/deliverables/'],
        ['PM_VBS_MASTER_02', 'E00', 1, 'Implementatie Checklist', '1.0', 'Final', 'HSEQ Manager', 'Directie', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '38 KB', '00_Master_Index/deliverables/'],
        ['PM_VBS_MASTER_03', 'E00', 5, 'QC Audit Rapport', '1.0', 'Final', 'Auditor', 'HSEQ Manager', TODAY, '—', 'Per gelegenheid', 'docx', '42 KB', '00_Master_Index/deliverables/'],
        ['PM_VBS_MASTER_04', 'E00', 1, 'Directie Samenvatting', '1.0', 'Final', 'HSEQ Manager', 'Directie', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '30 KB', '00_Master_Index/deliverables/'],
        ['PM_VBS_MASTER_05', 'E00', 4, 'Document Register', '1.0', 'Final', 'HSEQ Manager', 'HSEQ Manager', TODAY, '2026-07-29', 'Kwartaallijks', 'xlsx', '28 KB', '00_Master_Index/deliverables/'],
        ['PM_VBS_MASTER_06', 'E00', 2, 'DMS Procedure', '1.0', 'Final', 'HSEQ Manager', 'Plant Manager', TODAY, '2027-04-29', 'Jaarlijks', 'docx', '55 KB', '00_Master_Index/deliverables/'],
    ]

    for r, row_data in enumerate(docs, 2):
        for c, val in enumerate(row_data, 1):
            ws2.cell(row=r, column=c, value=val)
        style_body(ws2, r, len(headers2), zebra=(r % 2 == 0))

    for c in range(1, len(headers2) + 1):
        ws2.column_dimensions[openpyxl.utils.get_column_letter(c)].width = 18

    # ── Werkblad 3: Goedkeuringslog ──
    ws3 = wb.create_sheet('Goedkeuringslog')
    headers3 = ['Datum', 'Doc-ID', 'Actie', 'Auteur', 'Reviewer', 'Goedkeuring', 'Handtekening']
    for c, h in enumerate(headers3, 1):
        ws3.cell(row=1, column=c, value=h)
    style_header(ws3, 1, len(headers3))

    sample_approvals = [
        [TODAY, 'PM_VBS_MASTER_01', 'Nieuw', 'HSEQ Manager', 'Plant Manager', 'Directie', '—'],
        [TODAY, 'PM_VBS01_01', 'Nieuw', 'HSEQ Manager', 'Plant Manager', 'Directie', '—'],
        [TODAY, 'PM_VBS02_01', 'Nieuw', 'HSEQ Manager', 'Plant Manager', 'Plant Manager', '—'],
        [TODAY, 'PM_VBS05_01', 'Nieuw', 'HSEQ Manager', 'Plant Manager', 'Plant Manager', '—'],
    ]
    for r, row_data in enumerate(sample_approvals, 2):
        for c, val in enumerate(row_data, 1):
            ws3.cell(row=r, column=c, value=val)
        style_body(ws3, r, len(headers3), zebra=(r % 2 == 0))

    # Add 20 empty rows for future entries
    for r in range(len(sample_approvals) + 2, len(sample_approvals) + 22):
        for c in range(1, len(headers3) + 1):
            ws3.cell(row=r, column=c).border = THIN_BORDER

    for c in range(1, len(headers3) + 1):
        ws3.column_dimensions[openpyxl.utils.get_column_letter(c)].width = 20

    # ── Werkblad 4: Wijzigingslog ──
    ws4 = wb.create_sheet('Wijzigingslog')
    headers4 = ['Datum', 'Doc-ID', 'Oude versie', 'Nieuwe versie', 'Wijziging', 'Reden', 'Auteur']
    for c, h in enumerate(headers4, 1):
        ws4.cell(row=1, column=c, value=h)
    style_header(ws4, 1, len(headers4))

    sample_changes = [
        [TODAY, 'PM_VBS_MASTER_01', '—', '1.0', 'Eerste uitgave', 'Nieuw VBS document', 'HSEQ Manager'],
        [TODAY, 'PM_VBS01_01', '—', '1.0', 'Eerste uitgave', 'Beleidsverklaring VBS', 'HSEQ Manager'],
    ]
    for r, row_data in enumerate(sample_changes, 2):
        for c, val in enumerate(row_data, 1):
            ws4.cell(row=r, column=c, value=val)
        style_body(ws4, r, len(headers4), zebra=(r % 2 == 0))

    for r in range(len(sample_changes) + 2, len(sample_changes) + 22):
        for c in range(1, len(headers4) + 1):
            ws4.cell(row=r, column=c).border = THIN_BORDER

    for c in range(1, len(headers4) + 1):
        ws4.column_dimensions[openpyxl.utils.get_column_letter(c)].width = 20

    # ── Werkblad 5: Review Kalender ──
    ws5 = wb.create_sheet('Review Kalender')
    headers5 = ['Maand', 'Element', 'Aantal docs due', 'Eigenaar', 'Status']
    for c, h in enumerate(headers5, 1):
        ws5.cell(row=1, column=c, value=h)
    style_header(ws5, 1, len(headers5))

    months = ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni',
              'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December']
    calendar_data = [
        ['Januari 2027', 'E02 Gevaaridentificatie', 14, 'HSEQ Manager', 'Gepland'],
        ['Januari 2027', 'E04 Noodplanning', 10, 'HSEQ Manager', 'Gepland'],
        ['Februari 2027', 'E03 Exploitatiecontrole', 15, 'HSEQ Manager', 'Gepland'],
        ['Februari 2027', 'E05 Wijzigingenbeheer', 8, 'HSEQ Manager', 'Gepland'],
        ['Maart 2027', 'E01 Beleid & Organisatie', 12, 'HSEQ Manager', 'Gepland'],
        ['Maart 2027', 'E06 Toezicht', 11, 'HSEQ Manager', 'Gepland'],
        ['April 2027', 'E07 Controle & Analyse', 12, 'HSEQ Manager', 'Gepland'],
        ['April 2027', 'E00 Master / Overstijgend', 6, 'HSEQ Manager', 'Gepland'],
        ['Juli 2027', 'Alle (Kwartaallijks)', 3, 'HSEQ Manager', 'Gepland'],
        ['Oktober 2027', 'Alle (Kwartaallijks)', 3, 'HSEQ Manager', 'Gepland'],
    ]
    for r, row_data in enumerate(calendar_data, 2):
        for c, val in enumerate(row_data, 1):
            ws5.cell(row=r, column=c, value=val)
        style_body(ws5, r, len(headers5), zebra=(r % 2 == 0))

    for c in range(1, len(headers5) + 1):
        ws5.column_dimensions[openpyxl.utils.get_column_letter(c)].width = 28

    wb.save(XLSX_OUT)
    size = os.path.getsize(XLSX_OUT)
    print(f'XLSX saved: {XLSX_OUT} ({size:,} bytes)')


if __name__ == '__main__':
    os.makedirs(os.path.dirname(DOCX_OUT), exist_ok=True)
    os.makedirs(os.path.dirname(XLSX_OUT), exist_ok=True)
    create_docx()
    create_xlsx()
