#!/usr/bin/env python3
"""
Generate: Handleiding Stavaza Portefeuille Update (DOCX)
Version: 1.0 — Augustus 2026
Organisation: JvG Consultancy
"""

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

# ──────────────────────────────────────────────
# Colour & Font Constants
# ──────────────────────────────────────────────
NAVY = RGBColor(0x00, 0x33, 0x66)
BODY = RGBColor(0x1F, 0x29, 0x37)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
GREY_LIGHT = "F3F4F6"
NAVY_HEX = "003366"
BODY_HEX = "1F2937"

FONT_NAME = "Calibri"

OUTPUT_PATH = "/root/projects/jg/2026-stavaza-portefeuille-template/deliverables/stavaza_handleiding_v1.docx"

# ──────────────────────────────────────────────
# Helpers
# ──────────────────────────────────────────────

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


def set_cell_margins(cell, top=80, bottom=80, left=120, right=120):
    """Set cell margins in twips (1/20 pt)."""
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    margins = parse_xml(
        f'<w:tcMar {nsdecls("w")}>'
        f'  <w:top w:w="{top}" w:type="dxa"/>'
        f'  <w:bottom w:w="{bottom}" w:type="dxa"/>'
        f'  <w:left w:w="{left}" w:type="dxa"/>'
        f'  <w:right w:w="{right}" w:type="dxa"/>'
        f'</w:tcMar>'
    )
    tcPr.append(margins)


def add_page_number(paragraph):
    """Add a PAGE field code to a paragraph."""
    run = paragraph.add_run()
    fldChar1 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
    run._r.append(fldChar1)
    instrText = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve"> PAGE </w:instrText>')
    run._r.append(instrText)
    fldChar2 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
    run._r.append(fldChar2)


def style_run(run, size=11, bold=False, color=BODY, italic=False):
    """Apply consistent font styling to a run."""
    run.font.name = FONT_NAME
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.italic = italic
    run.font.color.rgb = color
    # Ensure East Asian font mapping too
    rPr = run._element.get_or_add_rPr()
    rFonts = rPr.find(qn('w:rFonts'))
    if rFonts is None:
        rFonts = parse_xml(f'<w:rFonts {nsdecls("w")} w:ascii="{FONT_NAME}" w:hAnsi="{FONT_NAME}"/>')
        rPr.insert(0, rFonts)
    else:
        rFonts.set(qn('w:ascii'), FONT_NAME)
        rFonts.set(qn('w:hAnsi'), FONT_NAME)


def add_styled_paragraph(doc, text, size=11, bold=False, color=BODY, italic=False,
                         space_after=6, space_before=0, alignment=None):
    """Add a paragraph with consistent styling."""
    p = doc.add_paragraph()
    if alignment is not None:
        p.alignment = alignment
    p.paragraph_format.space_after = Pt(space_after)
    p.paragraph_format.space_before = Pt(space_before)
    run = p.add_run(text)
    style_run(run, size=size, bold=bold, color=color, italic=italic)
    return p


def add_h1(doc, text):
    """Heading 1 — Navy, bold, 18pt, with bottom border."""
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(24)
    p.paragraph_format.space_after = Pt(10)
    p.paragraph_format.keep_with_next = True
    run = p.add_run(text)
    style_run(run, size=18, bold=True, color=NAVY)
    # Bottom border
    pPr = p._p.get_or_add_pPr()
    pBdr = parse_xml(
        f'<w:pBdr {nsdecls("w")}>'
        f'  <w:bottom w:val="single" w:sz="6" w:space="4" w:color="{NAVY_HEX}"/>'
        f'</w:pBdr>'
    )
    pPr.append(pBdr)
    return p


def add_h2(doc, text):
    """Heading 2 — Navy, bold, 14pt."""
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(16)
    p.paragraph_format.space_after = Pt(6)
    p.paragraph_format.keep_with_next = True
    run = p.add_run(text)
    style_run(run, size=14, bold=True, color=NAVY)
    return p


def add_h3(doc, text):
    """Heading 3 — Body colour, bold, 12pt."""
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(10)
    p.paragraph_format.space_after = Pt(4)
    p.paragraph_format.keep_with_next = True
    run = p.add_run(text)
    style_run(run, size=12, bold=True, color=BODY)
    return p


def add_bullet(doc, text, level=0, bold_prefix=None):
    """Add a bullet point with optional bold prefix."""
    p = doc.add_paragraph(style='List Bullet')
    p.paragraph_format.left_indent = Cm(1.0 + level * 0.6)
    p.paragraph_format.space_after = Pt(3)
    if bold_prefix:
        r1 = p.add_run(bold_prefix)
        style_run(r1, size=11, bold=True)
        r2 = p.add_run(text)
        style_run(r2, size=11)
    else:
        run = p.add_run(text)
        style_run(run, size=11)
    return p


def add_step_block(doc, step_num, step_title, content_paragraphs):
    """Add a numbered step with title and body content."""
    # Step heading
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(14)
    p.paragraph_format.space_after = Pt(4)
    p.paragraph_format.keep_with_next = True
    r1 = p.add_run(f"Stap {step_num}: ")
    style_run(r1, size=13, bold=True, color=NAVY)
    r2 = p.add_run(step_title)
    style_run(r2, size=13, bold=True, color=NAVY)
    # Content
    for text, kwargs in content_paragraphs:
        if kwargs.get('bullet'):
            add_bullet(doc, text, bold_prefix=kwargs.get('bold_prefix'))
        else:
            add_styled_paragraph(doc, text, **{k: v for k, v in kwargs.items() if k != 'bullet'})


def add_spacer(doc, pts=6):
    """Add vertical spacing."""
    p = doc.add_paragraph()
    p.paragraph_format.space_after = Pt(pts)
    return p


# ──────────────────────────────────────────────
# Build Document
# ──────────────────────────────────────────────

doc = Document()

# --- Page Setup ---
for section in doc.sections:
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2.5)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)

# --- Base Style ---
style = doc.styles['Normal']
style.font.name = FONT_NAME
style.font.size = Pt(11)
style.font.color.rgb = BODY
style.paragraph_format.space_after = Pt(6)
style.paragraph_format.line_spacing = 1.15

# ══════════════════════════════════════════════
# TITLE PAGE
# ══════════════════════════════════════════════

# Top spacing for centering
for _ in range(6):
    add_spacer(doc, 12)

# Title
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.space_after = Pt(8)
run = p.add_run("Handleiding")
style_run(run, size=32, bold=True, color=NAVY)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.space_after = Pt(20)
run = p.add_run("Stavaza Portefeuille Update")
style_run(run, size=28, bold=True, color=NAVY)

# Divider
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.space_after = Pt(20)
run = p.add_run("━" * 30)
style_run(run, size=14, color=NAVY)

# Subtitle
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.space_after = Pt(6)
run = p.add_run("Versie 1.0 — Augustus 2026")
style_run(run, size=16, color=BODY)

# Organisation
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.space_after = Pt(40)
run = p.add_run("JvG Consultancy")
style_run(run, size=14, italic=True, color=BODY)

# Spacer
for _ in range(8):
    add_spacer(doc, 12)

# Bottom info
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Een gestructureerde aanpak voor portefeuille-updates\ntijdens teamvergaderingen")
style_run(run, size=12, italic=True, color=NAVY)

# Page break
doc.add_page_break()

# ══════════════════════════════════════════════
# INHOUDSOPGAVE
# ══════════════════════════════════════════════

add_h1(doc, "Inhoudsopgave")

toc_items = [
    ("1.", "Introductie", 3),
    ("2.", "Doel van het Formulier", 4),
    ("3.", "Voor Wie is Deze Handleiding?", 5),
    ("4.", "Hoe te Gebruiken — Stap voor Stap", 6),
    ("5.", "Veld-to-Veld Uitleg", 8),
    ("6.", "Tips & Best Practices", 10),
    ("7.", "Veelgemaakte Fouten", 11),
    ("8.", "Versiebeheer", 12),
]

for num, title, page in toc_items:
    p = doc.add_paragraph()
    p.paragraph_format.space_after = Pt(6)
    p.paragraph_format.tab_stops.add_tab_stop(Cm(15.5), alignment=2)  # right tab
    r1 = p.add_run(f"{num} ")
    style_run(r1, size=12, bold=True, color=NAVY)
    r2 = p.add_run(title)
    style_run(r2, size=12, color=BODY)
    r3 = p.add_run(f"\t{page}")
    style_run(r3, size=12, color=BODY)

doc.add_page_break()

# ══════════════════════════════════════════════
# 1. INTRODUCTIE
# ══════════════════════════════════════════════

add_h1(doc, "1. Introductie")

add_h3(doc, "Wat is een Stavaza?")
add_styled_paragraph(doc,
    "Een Stavaza — een afkorting van \"Stand van Zaken\" — is een gestructureerde rapportage "
    "die inzicht geeft in de voortgang van een portefeuille of project. Het stelt teamleden in staat "
    "om tijdens vergaderingen kort, bondig en effectief te communiceren over wat er speelt, wat goed "
    "gaat en waar aandacht voor nodig is. De Stavaza is geen uitgebreid verslag, maar een beknopt "
    "overzicht dat de basis vormt voor een productieve vergadering."
)

add_h3(doc, "Waarom is gestructureerde rapportage belangrijk?")
add_styled_paragraph(doc,
    "Gestructureerde rapportage zorgt ervoor dat iedereen in het team op dezelfde pagina is. "
    "Het voorkomt misverstanden, vermindert versnippering van informatie en zorgt dat vergaderingen "
    "efficiënt verlopen. Door vooraf een Stavaza in te vullen, weet elke deelnemer wat er besproken "
    "gaat worden en kan deze zich goed voorbereiden. Dit leidt tot betere beslissingen, snellere "
    "actie en een hogere kwaliteit van samenwerking."
)

add_h3(doc, "Best practices voor effectief vergaderen")
add_styled_paragraph(doc,
    "Deze handleiding sluit aan bij best practices voor effectief vergaderen zoals beschreven op "
    "bar-beton.nl/effectief-vergaderen. De volgende tips zijn daarbij richtinggevend:"
)

tips_intro = [
    ("Goede voorbereiding is essentieel (Tip #1) — ",
     "Het Stavaza-formulier moet uiterlijk 24 uur vóór de vergadering worden ingevuld en ingediend, "
     "zodat alle deelnemers zich kunnen voorbereiden."),
    ("Maximaal 1,5 uur vergaderen (Tip #6) — ",
     "Door de gestructureerde opzet van de Stavaza blijven vergaderingen beknopt en gefocust, "
     "wat helpt om binnen de aanbevolen tijd te blijven."),
    ("Eén actiepunt = één eigenaar (Tip #9) — ",
     "Elke actie in het formulier heeft precies één verantwoordelijke. Dit voorkomt verwarring "
     "over wie wat oppakt."),
    ("Verzamel feedback (Tip #21) — ",
     "De Stavaza is ook een instrument om feedback te verzamelen. Aandachtspunten en kritieke "
     "punten vormen input voor constructieve bespreking."),
]

for bold, text in tips_intro:
    add_bullet(doc, text, bold_prefix=bold)

doc.add_page_break()

# ══════════════════════════════════════════════
# 2. DOEL VAN HET FORMULIER
# ══════════════════════════════════════════════

add_h1(doc, "2. Doel van het Formulier")

add_styled_paragraph(doc,
    "Het Stavaza Portefeuille Update-formulier heeft als primaire doel om op een gestandaardiseerde "
    "manier portefeuille-updates te verzamelen en te presenteren. Het formulier vervult de volgende functies:"
)

add_h3(doc, "Gestandaardiseerde rapportage")
add_styled_paragraph(doc,
    "Alle teamleden gebruiken hetzelfde format, waardoor vergelijking tussen portefeuilles eenvoudig "
    "is en niemand voor verrassingen komt te staan. Eenduidige velden en een duidelijke statuscodering "
    "(Groen/Geel/Rood) maken het mogelijk om in één oogopslag de stand van zaken te overzien."
)

add_h3(doc, "Efficiëntere vergaderingen")
add_styled_paragraph(doc,
    "Doordat het formulier vooraf wordt ingevuld, hoeft tijdens de vergadering niet meer dan de "
    "kernpunten besproken te worden. Dit bespaart tijd en zorgt dat de vergadering binnen de "
    "aanbevolen 1,5 uur blijft (bron: bar-beton.nl)."
)

add_h3(doc, "Duidelijke actiepunten en beslispunten")
add_styled_paragraph(doc,
    "Het formulier dwingt de portefeuillehouder om expliciet te formuleren welke actie of beslissing "
    "van de vergadering wordt gevraagd. Dit voorkomt dat actiepunten verloren gaan of vaag blijven."
)

add_h3(doc, "Teamoverzicht")
add_styled_paragraph(doc,
    "Met 10 teamleden die elk hun eigen portefeuille presenteren, zorgt het formulier voor een "
    "gelijkwaardige en overzichtelijke presentatie van alle portefeuilles."
)

doc.add_page_break()

# ══════════════════════════════════════════════
# 3. VOOR WIE IS DEZE HANDLEIDING?
# ══════════════════════════════════════════════

add_h1(doc, "3. Voor Wie is Deze Handleiding?")

add_styled_paragraph(doc,
    "Deze handleiding is geschreven voor iedereen die betrokken is bij de Stavaza-portefeuilleupdate "
    "binnen de teamvergadering. Dat betreft de volgende rollen:"
)

add_h3(doc, "Portefeuillehouders (alle 10 teamleden)")
add_styled_paragraph(doc,
    "Elk teamlid dat een portefeuille beheert — zoals Membership, Fundraising, PR, Events, enzovoort — "
    "gebruikt het formulier om de stand van zaken van de eigen portefeuille structureel vast te leggen "
    "en te presenteren. Deze handleiding legt stap voor stap uit hoe het formulier correct wordt ingevuld."
)

add_h3(doc, "De voorzitter van de vergadering")
add_styled_paragraph(doc,
    "De voorzitter gebruikt de ingediende formulieren om de vergadering voor te bereiden, de agenda "
    "te bepalen en eventuele kritieke punten (status Rood) vooraf te bespreken met de betreffende "
    "portefeuillehouder."
)

add_h3(doc, "De notulist")
add_styled_paragraph(doc,
    "De notulist verzamelt alle ingediende formulieren, gebruikt ze als basis voor de vergadernotulen "
    "en zorgt dat actiepunten met eigenaren en deadlines correct worden geregistreerd."
)

doc.add_page_break()

# ══════════════════════════════════════════════
# 4. HOE TE GEBRUIKEN — STAP VOOR STAP
# ══════════════════════════════════════════════

add_h1(doc, "4. Hoe te Gebruiken — Stap voor Stap")

add_styled_paragraph(doc,
    "Het correct invullen van het Stavaza-formulier bestaat uit zes stappen. Volg deze stappen "
    "telkens opnieuw voor elke vergadering.",
    space_after=10
)

# --- Stap 1 ---
add_step_block(doc, 1, "Header-gegevens invullen", [
    ("Vul de bovenste sectie van het formulier volledig in. Deze gegevens identificeren het document "
     "en zorgen voor een juiste archivering.", {}),
    ("De volgende velden zijn verplicht:", {'bullet': True, 'bold_prefix': 'Portefeuille naam — '}),
    ("De naam van je portefeuille (bijv. \"Membership\", \"Fundraising\", \"PR\").", {'bullet': True}),
    ("Jouw naam als verantwoordelijke voor deze portefeuille.", {'bullet': True, 'bold_prefix': 'Portefeuillehouder — '}),
    ("De datum van de aankomende vergadering.", {'bullet': True, 'bold_prefix': 'Datum vergadering — '}),
    ("De datum waarop je het formulier invult.", {'bullet': True, 'bold_prefix': 'Datum ingevuld — '}),
])

# --- Stap 2 ---
add_step_block(doc, 2, "Onderwerpen toevoegen", [
    ("Voeg voor elk onderwerp of elke activiteit binnen je portefeuille één rij toe aan het formulier. "
     "Wees specifiek in de omschrijving zodat andere teamleden direct begrijpen waar het over gaat.", {}),
    ("Gebruik duidelijke, herkenbare namen voor onderwerpen. Vermijd algemene termen zoals "
     "\"diverse\" of \"overig\".", {'bullet': True}),
])

# --- Stap 3 ---
add_step_block(doc, 3, "Status bepalen", [
    ("Bepaal voor elk onderwerp de status. De status is een objectieve beoordeling van de voortgang, "
     "geen wens. Kies één van de volgende:", {}),
    ("Op schema, geen problemen. Alles loopt zoals gepland.", {'bullet': True, 'bold_prefix': 'Groen — '}),
    ("Aandacht nodig. Er is een risico op vertraging; ingrijpen kan nodig zijn.", {'bullet': True, 'bold_prefix': 'Geel — '}),
    ("Kritiek. Er is sprake van een blokkade of urgent probleem dat directe aandacht vereist.", {'bullet': True, 'bold_prefix': 'Rood — '}),
])

# --- Stap 4 ---
add_step_block(doc, 4, "Velden invullen", [
    ("Vul de drie inhoudelijke velden per onderwerp in:", {}),
    ("Successen en positieve ontwikkelingen. Wat loopt goed? Benoem concrete resultaten.",
     {'bullet': True, 'bold_prefix': '"Wat gaat goed" — '}),
    ("Punten die de aandacht verdienen, maar nog niet kritiek zijn. Beschrijf het risico of "
     "het aandachtspunt kort en duidelijk.",
     {'bullet': True, 'bold_prefix': '"Aandacht nodig" — '}),
    ("Blokkades en urgente risico's. Wees expliciet over wat het probleem is en welke impact het heeft "
     "op de portefeuille of het team.",
     {'bullet': True, 'bold_prefix': '"Kritieke punten" — '}),
])

# --- Stap 5 ---
add_step_block(doc, 5, "Actieformulering", [
    ("Formuleer per onderwerp duidelijk welke actie of beslissing je van de vergadering vraagt:", {}),
    ("Wees expliciet over wat je vraagt. Bijv. \"Goedkeuring budget €500\" of "
     "\"Beslissing over nieuwe leverancier\".",
     {'bullet': True, 'bold_prefix': '"Actie/Beslissing gevraagd" — '}),
    ("Wijs precies één persoon aan die de actie uitvoert. Vermijd "
     "\"het team\" of \"iedereen\".",
     {'bullet': True, 'bold_prefix': '"Actie-eigenaar" — '}),
    ("Geef een realistische datum in het formaat dd-mm-jjjj.", {'bullet': True, 'bold_prefix': '"Deadline" — '}),
])

# --- Stap 6 ---
add_step_block(doc, 6, "Indienen", [
    ("Diender je ingevulde formulier tijdig in:", {}),
    ("Uiterlijk 24 uur vóór de vergadering.", {'bullet': True, 'bold_prefix': 'Deadline — '}),
    ("Digitaal (via e-mail of gedeelde drive) naar de voorzitter en de notulist.",
     {'bullet': True, 'bold_prefix': 'Aan wie — '}),
    ("Zo kunnen alle teamleden zich voorbereiden en verloopt de vergadering efficiënt.",
     {'bullet': True, 'bold_prefix': 'Waarom — '}),
])

doc.add_page_break()

# ══════════════════════════════════════════════
# 5. VELD-TO-VELD UIITLEG
# ══════════════════════════════════════════════

add_h1(doc, "5. Veld-to-Veld Uitleg")

add_styled_paragraph(doc,
    "De onderstaande tabel geeft een gedetailleerde uitleg van alle negen kolommen in het "
    "Stavaza-formulier, inclusief een voorbeeld per kolom.",
    space_after=12
)

# Build the field-to-field table
field_data = [
    ("Kolom", "Naam", "Uitleg", "Voorbeeld"),
    ("A", "Nr.",
     "Volgnummer van het item binnen de portefeuille. Handig voor verwijzing tijdens de vergadering.",
     "1, 2, 3"),
    ("B", "Onderwerp/Activiteit",
     "Korte, beschrijvende titel van het item. Eén rij per onderwerp of activiteit.",
     "\"Nieuwe ledenwerving Q3\""),
    ("C", "Status",
     "Objectieve beoordeling: Groen (op schema), Geel (aandacht nodig), Rood (kritiek/blokkade).",
     "\"Geel\""),
    ("D", "Wat gaat goed",
     "Successen en positieve ontwikkelingen met betrekking tot dit onderwerp.",
     "\"20 nieuwe aanmeldingen ontvangen\""),
    ("E", "Aandacht nodig",
     "Punten die aandacht verdienen maar nog niet kritiek zijn. Risico's die kunnen escaleren.",
     "\"Onboarding nog niet gepland\""),
    ("F", "Kritieke punten",
     "Blokkades, urgente risico's en problemen die directe aandacht vereisen.",
     "\"Budget voor welkomstpakket nog niet goedgekeurd\""),
    ("G", "Actie/Beslissing gevraagd",
     "Expliciete formulering van wat je vraagt: een goedkeuring, beslissing, of actie.",
     "\"Goedkeuring budget €500\""),
    ("H", "Actie-eigenaar",
     "De persoon die de actie uitvoert. Eén eigenaar per actiepunt — geen teams of groepen.",
     "\"J. de Vries\""),
    ("I", "Deadline",
     "Realistische datum waarop de actie voltooid moet zijn. Formaat: dd-mm-jjjj.",
     "\"15-09-2026\""),
]

table = doc.add_table(rows=len(field_data), cols=4)
table.alignment = WD_TABLE_ALIGNMENT.CENTER
table.autofit = False

# Column widths
col_widths = [Cm(1.5), Cm(4.0), Cm(6.5), Cm(4.5)]
for row in table.rows:
    for idx, cell in enumerate(row.cells):
        cell.width = col_widths[idx]

# Populate
for row_idx, (col_a, col_b, col_c, col_d) in enumerate(field_data):
    row = table.rows[row_idx]
    cells = row.cells

    is_header = (row_idx == 0)

    for cell_idx, value in enumerate([col_a, col_b, col_c, col_d]):
        cell = cells[cell_idx]
        cell.text = ""
        p = cell.paragraphs[0]
        p.paragraph_format.space_after = Pt(0)
        p.paragraph_format.space_before = Pt(0)
        run = p.add_run(value)
        if is_header:
            style_run(run, size=11, bold=True, color=WHITE)
            set_cell_bg(cell, NAVY_HEX)
        else:
            style_run(run, size=10, bold=(cell_idx < 2), color=BODY)
            # Alternate row shading
            if row_idx % 2 == 0:
                set_cell_bg(cell, GREY_LIGHT)

        set_cell_margins(cell)

# Borders for the table
tbl = table._tbl
tblPr = tbl.tblPr
tblBorders = parse_xml(
    f'<w:tblBorders {nsdecls("w")}>'
    f'  <w:top w:val="single" w:sz="4" w:color="{NAVY_HEX}"/>'
    f'  <w:left w:val="single" w:sz="4" w:color="{NAVY_HEX}"/>'
    f'  <w:bottom w:val="single" w:sz="4" w:color="{NAVY_HEX}"/>'
    f'  <w:right w:val="single" w:sz="4" w:color="{NAVY_HEX}"/>'
    f'  <w:insideH w:val="single" w:sz="2" w:color="CCCCCC"/>'
    f'  <w:insideV w:val="single" w:sz="2" w:color="CCCCCC"/>'
    f'</w:tblBorders>'
)
tblPr.append(tblBorders)

add_spacer(doc, 16)

# Status legend
add_h3(doc, "Status Legenda")

status_data = [
    ("Status", "Betekenis", "Wanneer te gebruiken"),
    ("Groen", "Op schema", "Alles gaat zoals gepland. Geen problemen of risico's."),
    ("Geel", "Aandacht nodig", "Er is een risico op vertraging. Ingrijpen kan nodig zijn om problemen te voorkomen."),
    ("Rood", "Kritiek", "Er is sprake van een blokkade of urgent probleem. Directe aandacht of beslissing vereist."),
]

status_table = doc.add_table(rows=len(status_data), cols=3)
status_table.alignment = WD_TABLE_ALIGNMENT.CENTER

status_col_widths = [Cm(3.0), Cm(4.0), Cm(9.5)]
for row in status_table.rows:
    for idx, cell in enumerate(row.cells):
        cell.width = status_col_widths[idx]

for row_idx, (a, b, c) in enumerate(status_data):
    row = status_table.rows[row_idx]
    for cell_idx, value in enumerate([a, b, c]):
        cell = row.cells[cell_idx]
        cell.text = ""
        p = cell.paragraphs[0]
        run = p.add_run(value)
        if row_idx == 0:
            style_run(run, size=11, bold=True, color=WHITE)
            set_cell_bg(cell, NAVY_HEX)
        else:
            style_run(run, size=10, bold=(cell_idx == 0), color=BODY)
        set_cell_margins(cell)

doc.add_page_break()

# ══════════════════════════════════════════════
# 6. TIPS & BEST PRACTICES
# ══════════════════════════════════════════════

add_h1(doc, "6. Tips & Best Practices")

tips = [
    ("Wees beknopt",
     "Houd maximaal 2-3 zinnen per veld. Het formulier is een update, geen uitgebreid rapport. "
     "Lange teksten worden niet gelezen en vertragen de vergadering."),
    ("Status is een objectieve beoordeling",
     "De status (Groen/Geel/Rood) moet de werkelijke situatie weerspiegelen, niet een wens. "
     "Wees eerlijk — een Rood-status leidt tot snellere actie, wat positief is."),
    ("Formuleer actiepunten SMART",
     "Specifiek, Meetbaar, Acceptabel, Realistisch, Tijdgebonden. Een goed actiepunt answer "
     "de vraag: wie doet wat, wanneer, en hoe weten we dat het klaar is?"),
    ("Eén eigenaar per actiepunt",
     "Wijs altijd precies één persoon aan als eigenaar. Niet een team, niet \"iedereen\". "
     "Dit is een best practice van bar-beton.nl/effectief-vergaderen (Tip #9) en voorkomt "
     "dat actiepunten tussen wal en schip belanden."),
    ("Bereid goed voor",
     "Goede voorbereiding is de sleutel tot effectief vergaderen (Tip #1, bar-beton.nl). "
     "Vul het formulier rustig in, neem de tijd om na te denken over status en actiepunten, "
     "en verzamel benodigde informatie vooraf."),
    ("Vermijd verrassingen",
     "Bespreek kritieke punten (status Rood) vóór de vergadering met de voorzitter. "
     "Dit geeft de voorzitter de kans om het probleem te kaderen en voorkomt dat de "
     "vergadering vastloopt op onverwachte crises."),
]

for title, body in tips:
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(8)
    p.paragraph_format.space_after = Pt(3)
    r1 = p.add_run(f"{title}  ")
    style_run(r1, size=12, bold=True, color=NAVY)

    p2 = doc.add_paragraph()
    p2.paragraph_format.left_indent = Cm(0.5)
    p2.paragraph_format.space_after = Pt(6)
    r2 = p2.add_run(body)
    style_run(r2, size=11, color=BODY)

doc.add_page_break()

# ══════════════════════════════════════════════
# 7. VEELGEMAAKTE FOUTEN
# ══════════════════════════════════════════════

add_h1(doc, "7. Veelgemaakte Fouten")

add_styled_paragraph(doc,
    "De volgende fouten komen regelmatig voor bij het invullen van het Stavaza-formulier. "
    "Houd ze in gedachten om de kwaliteit van je rapportage te verhogen.",
    space_after=10
)

mistakes = [
    ("Te veel detail",
     "Het formulier is een update, geen rapport. Houd het beknopt: 2-3 zinnen per veld "
     "is voldoende. Gedetailleerde rapportage kan in een bijlage worden opgenomen."),
    ("Vaag blijven",
     "\"Gaat wel\" of \"loopt op rolletjes\" zegt niets. Wees specifiek over wat er "
     "aan de hand is, zodat andere teamleden de situatie kunnen inschatten."),
    ("Geen actie-eigenaar toewijzen",
     "Een actiepunt zonder eigenaar is een actiepunt dat niet uitgevoerd wordt. Wijs altijd "
     "precies één persoon aan als verantwoordelijke."),
    ("Te laat indienen",
     "Als het formulier niet 24 uur voor de vergadering is ingediend, kunnen andere "
     "teamleden zich niet voorbereiden. Dit vermindert de effectiviteit van de vergadering "
     "en leidt tot frustratie."),
]

for title, body in mistakes:
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(6)
    p.paragraph_format.space_after = Pt(2)
    r1 = p.add_run(f"✗  {title}")
    style_run(r1, size=12, bold=True, color=RGBColor(0xCC, 0x00, 0x00))

    p2 = doc.add_paragraph()
    p2.paragraph_format.left_indent = Cm(0.8)
    p2.paragraph_format.space_after = Pt(8)
    r2 = p2.add_run(body)
    style_run(r2, size=11, color=BODY)

doc.add_page_break()

# ══════════════════════════════════════════════
# 8. VERSIEBEHEER
# ══════════════════════════════════════════════

add_h1(doc, "8. Versiebeheer")

add_styled_paragraph(doc,
    "Deze handleiding wordt onderhouden door JvG Consultancy. Onderstaand overzicht toont "
    "de releasegeschiedenis en toekomstige ontwikkelingen.",
    space_after=12
)

add_h3(doc, "Releasegeschiedenis")

version_data = [
    ("Versie", "Datum", "Beschrijving"),
    ("1.0", "Augustus 2026", "Initiële release van de Stavaza Portefeuille Update handleiding."),
]

vtable = doc.add_table(rows=len(version_data), cols=3)
vtable.alignment = WD_TABLE_ALIGNMENT.CENTER
vcol_widths = [Cm(2.5), Cm(4.0), Cm(10.0)]

for row in vtable.rows:
    for idx, cell in enumerate(row.cells):
        cell.width = vcol_widths[idx]

for row_idx, (a, b, c) in enumerate(version_data):
    row = vtable.rows[row_idx]
    for cell_idx, value in enumerate([a, b, c]):
        cell = row.cells[cell_idx]
        cell.text = ""
        p = cell.paragraphs[0]
        run = p.add_run(value)
        if row_idx == 0:
            style_run(run, size=11, bold=True, color=WHITE)
            set_cell_bg(cell, NAVY_HEX)
        else:
            style_run(run, size=10, color=BODY)
        set_cell_margins(cell)

add_spacer(doc, 16)

add_h3(doc, "Toekomstige ontwikkelingen")

add_bullet(doc, "Dropdown-menu's voor status en portefeuille-namen ter bevordering van consistentie.")
add_bullet(doc, "Geautomatiseerde kleurcodering op basis van de geselecteerde status.")
add_bullet(doc, "Geïntegreerde actiepunt-tracker voor opvolging tussen vergaderingen.")
add_bullet(doc, "Digitale invulmogelijkheid via gedeeld platform (bijv. Microsoft Teams of Google Workspace).")

add_spacer(doc, 24)

# Closing line
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("━" * 20)
style_run(run, size=12, color=NAVY)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Vragen of opmerkingen over deze handleiding?\nNeem contact op met JvG Consultancy.")
style_run(run, size=11, italic=True, color=BODY)

# ══════════════════════════════════════════════
# FOOTER (all sections)
# ══════════════════════════════════════════════

for section in doc.sections:
    footer = section.footer
    footer.is_linked_to_previous = False

    # Clear existing footer paragraphs
    for p in footer.paragraphs:
        p.clear()

    fp = footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER

    # Tab stops: center + right
    fp.paragraph_format.tab_stops.add_tab_stop(Cm(8), alignment=1)  # center
    fp.paragraph_format.tab_stops.add_tab_stop(Cm(16), alignment=2)  # right

    r1 = fp.add_run("JvG Consultancy — Stavaza Handleiding v1.0")
    style_run(r1, size=9, color=NAVY)
    r2 = fp.add_run("\tPagina ")
    style_run(r2, size=9, color=BODY)
    add_page_number(fp)

# ══════════════════════════════════════════════
# SAVE
# ══════════════════════════════════════════════

os.makedirs(os.path.dirname(OUTPUT_PATH), exist_ok=True)
doc.save(OUTPUT_PATH)
print(f"✓ DOCX saved: {OUTPUT_PATH}")
print(f"  Size: {os.path.getsize(OUTPUT_PATH):,} bytes")