#!/usr/bin/env python3
"""Draaiboek Kabinetswissel Lions District 110AN — v1.0
Output: draaiboek-kabinetswissel-110AN_v1.0.docx
Lions branding: #003366, #F59E0B, #00A859 | Calibri font
"""

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

PRIMARY = RGBColor(0x00, 0x33, 0x66)
ACCENT = RGBColor(0xF5, 0x9E, 0x0B)
SECONDARY = RGBColor(0x00, 0xA8, 0x59)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
FONT = 'Calibri'
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
OUTPUT = os.path.join(BASE_DIR, 'draaiboek-kabinetswissel-110AN_v1.0.docx')

doc = Document()

style = doc.styles['Normal']
style.font.name = FONT
style.font.size = Pt(11)
style.font.color.rgb = RGBColor(0x33, 0x33, 0x33)
style.paragraph_format.space_after = Pt(6)

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

def add_styled_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    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 = WHITE
        run.font.name = FONT
        run.font.size = Pt(9)
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        set_cell_shading(cell, '003366')
    for r_idx, row in enumerate(rows):
        for c_idx, val in enumerate(row):
            cell = table.rows[r_idx + 1].cells[c_idx]
            cell.text = ''
            p = cell.paragraphs[0]
            run = p.add_run(str(val))
            run.font.name = FONT
            run.font.size = Pt(9)
            if r_idx % 2 == 1:
                set_cell_shading(cell, 'E8F0FE')
    if col_widths:
        for i, w in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Inches(w)
    return table

def add_heading_styled(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

# =========================================================================
# VOORBLAD
# =========================================================================
for _ in range(5):
    doc.add_paragraph('')

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('LIONS CLUBS')
run.bold = True; run.font.size = Pt(28); run.font.color.rgb = PRIMARY; run.font.name = FONT

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('DISTRICT 110AN')
run.bold = True; run.font.size = Pt(20); run.font.color.rgb = SECONDARY; run.font.name = FONT

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('━' * 50)
run.font.color.rgb = ACCENT; run.font.size = Pt(8)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('DRAAIBOEK')
run.bold = True; run.font.size = Pt(24); run.font.color.rgb = PRIMARY; run.font.name = FONT

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Kabinetswissel 2026-2027')
run.font.size = Pt(18); run.font.name = FONT

for _ in range(2):
    doc.add_paragraph('')

for d in ["Zaterdag 15 augustus 2026", "Papa's Beach House, Haarlemmermeerse Bos, Hoofddorp",
          "Samen Verder Bouwen — Lions 75 Jaar — Alzheimer Nederland",
          'Versie 1.0 — 18 april 2026']:
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(d)
    run.font.size = Pt(12); run.font.color.rgb = RGBColor(0x55, 0x55, 0x55); run.font.name = FONT

doc.add_page_break()

# =========================================================================
# 1. OVERZICHTDAG
# =========================================================================
add_heading_styled(doc, '1. Overzichtdag — Zaterdag 15 augustus 2026', level=1)

doc.add_paragraph(
    'Onderstaand overzicht toont het volledige programma met kleurcodes per fase. '
    'Blauw = formeel/ceremonieel, Groen = inhoudelijk, Oranje = sociaal/actief, Geel = pauze/overgang.'
)

overzicht = [
    ('10:00-10:30', 'Ontvangst koffie/thee', 'Terras', 'Oranje', 'Robertjan'),
    ('10:30-11:00', 'Opening + overdrachtssymboliek', 'Key West', 'Blauw', 'Jorick / Mark'),
    ('11:00-11:30', 'Lions 75 Jaar presentatie', 'Key West', 'Groen', 'Pieter Haex'),
    ('11:30-12:00', 'Stichting Alzheimer Nederland', 'Key West', 'Groen', 'Hans Luijcx + gast'),
    ('12:00-12:30', 'Samen Verder Bouwen — visie DG', 'Key West', 'Groen', 'Jorick van Gemert'),
    ('12:30-13:30', 'Gezamenlijke lunch', 'Key West/Terras', 'Oranje', 'Robertjan'),
    ('13:30-15:00', 'Buitenactiviteit beach / teambuilding', 'Strand', 'Oranje', 'Jonel Penders'),
    ('15:00-15:30', 'Pauze', 'Terras', 'Geel', '—'),
    ('15:30-16:30', 'Interactieve sessie (world café)', 'Key West', 'Groen', 'Martijn Wokke'),
    ('16:30-18:00', 'Borrel op het strand — afsluiting', 'Strand', 'Oranje', 'Allen'),
]

add_styled_table(doc,
    ['Tijd', 'Activiteit', 'Locatie', 'Fase', 'Verantwoordelijke'],
    overzicht,
    col_widths=[0.9, 2.2, 1.0, 0.7, 1.5]
)

doc.add_page_break()

# =========================================================================
# 2. GEDETAILLEERD DRAAIBOEK
# =========================================================================
add_heading_styled(doc, '2. Gedetailleerd Draaiboek per Tijdblok', level=1)

# --- 10:00-10:30 ---
add_heading_styled(doc, '2.1 Ontvangst (10:00-10:30)', level=2)
blok1 = [
    ('09:30', 'Organisatieteam arriveert, zaal controle', 'Robertjan', 'Key West'),
    ('09:45', 'AV-setup: beamer, laptop, microfoon test', 'Robertjan', 'Key West'),
    ('09:50', 'Koffie/thee op terras gereed', 'Catering', 'Terras'),
    ('10:00', 'Deuren open, ontvangst genodigden', 'Communicatie', 'Terras'),
    ('10:00-10:30', 'Naambadjes uitdelen, informele netwerk', 'Communicatie', 'Terras'),
    ('10:25', 'Signalering: iedereen naar Key West', 'Anja/Hans-Peter', 'Terras'),
    ('10:30', 'DG betreedt zaal, start opening', 'Jorick', 'Key West'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke', 'Locatie'], blok1,
    col_widths=[0.8, 2.8, 1.3, 0.9])
doc.add_paragraph('Back-up: AV werkt niet → verhaal zonder beamer, print-outs aanwezig')

# --- 10:30-11:00 ---
add_heading_styled(doc, '2.2 Opening + Overdrachtssymboliek (10:30-11:00)', level=2)
blok2 = [
    ('10:30-10:35', 'Welkomstwoord DG Jorick van Gemert', 'Jorick', 'Key West'),
    ('10:35-10:45', 'Overdracht ambtsketen / symboliek', 'Mark Wijngaarde', 'Key West'),
    ('10:45-10:50', 'Woord IPDG Pieter Haex', 'Pieter', 'Key West'),
    ('10:50-11:00', 'Voorstellen kabinet (kort, per functie)', 'Jorick', 'Key West'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke', 'Locatie'], blok2,
    col_widths=[0.8, 2.8, 1.3, 0.9])
doc.add_paragraph('AV: Presentatie DG op scherm. Back-up: geprint script op tafel.')

# --- 11:00-11:30 ---
add_heading_styled(doc, '2.3 Lions 75 Jaar Presentatie (11:00-11:30)', level=2)
blok3 = [
    ('11:00-11:25', 'Presentatie: 75 jaar Lions NL — historie, impact, toekomst', 'Pieter Haex', 'Key West'),
    ('11:25-11:30', 'LCIF spotlight + lustrumplannen 2026-2027', 'Pieter Haex', 'Key West'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke', 'Locatie'], blok3,
    col_widths=[0.8, 2.8, 1.3, 0.9])

# --- 11:30-12:00 ---
add_heading_styled(doc, '2.4 Stichting Alzheimer Nederland (11:30-12:00)', level=2)
blok4 = [
    ('11:30-11:45', 'Presentatie: Alzheimer NL als goed doel — plannen district', 'Hans Luijcx', 'Key West'),
    ('11:45-12:00', 'Bijdrage gast spreker Alzheimer Nederland (indien beschikbaar)', 'Gast', 'Key West'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke', 'Locatie'], blok4,
    col_widths=[0.8, 2.8, 1.3, 0.9])

# --- 12:00-12:30 ---
add_heading_styled(doc, '2.5 Samen Verder Bouwen — Visie DG (12:00-12:30)', level=2)
blok5 = [
    ('12:00-12:25', 'Keynote: "Samen Verder Bouwen" — drie bouwniveaus, plannen 2026-2027', 'Jorick', 'Key West'),
    ('12:25-12:30', 'Schiphol-project Pier C aankondiging', 'Jorick', 'Key West'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke', 'Locatie'], blok5,
    col_widths=[0.8, 2.8, 1.3, 0.9])

# --- 12:30-13:30 ---
add_heading_styled(doc, '2.6 Gezamenlijke Lunch (12:30-13:30)', level=2)
blok6 = [
    ('12:30', 'Overgang naar lunchlocatie (Key West of terras)', 'Robertjan', 'Key West/Terras'),
    ('12:30-13:30', 'Uitgebreide lunch buffet — informele sfeer', 'Catering', 'Key West/Terras'),
    ('13:15', 'Signalering: 15 minuten tot buitenactiviteit', 'Communicatie', '—'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke', 'Locatie'], blok6,
    col_widths=[0.8, 2.8, 1.3, 0.9])
doc.add_paragraph('Back-up regen: lunch volledig indoor Key West.')

# --- 13:30-15:00 ---
add_heading_styled(doc, '2.7 Buitenactiviteit Beach / Teambuilding (13:30-15:00)', level=2)
blok7 = [
    ('13:30-13:45', 'Introductie werkvorm door GLT', 'Jonel Penders', 'Strand'),
    ('13:45-15:00', 'Activiteit: speeddates / teambuilding op het strand', 'Jonel + zonevz.', 'Strand'),
    ('14:45', 'Signalering: 15 minuten tot pauze', 'Communicatie', 'Strand'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke', 'Locatie'], blok7,
    col_widths=[0.8, 2.8, 1.3, 0.9])
doc.add_paragraph('Back-up regen: verplaats naar Key West — interactieve quiz of discussie in ronde opstelling.')

# --- 15:00-15:30 ---
add_heading_styled(doc, '2.8 Pauze (15:00-15:30)', level=2)
doc.add_paragraph('Koffie, thee, verse sap en snacks op het terras. Tijd voor informeel overleg en telefoontjes.')

# --- 15:30-16:30 ---
add_heading_styled(doc, '2.9 Interactieve Sessie — World Café (15:30-16:30)', level=2)
blok9 = [
    ('15:30-15:35', 'Uitleg world café formaat', 'Martijn Wokke', 'Key West'),
    ('15:35-16:20', 'Drie ronde tafels: (1) Clubs versterken, (2) Zichtbaarheid, (3) Organisatie/ICT', 'Tafelvoorzitters', 'Key West'),
    ('16:20-16:30', 'Plenair: per tafel top-3 inzichten delen', 'Martijn Wokke', 'Key West'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke', 'Locatie'], blok9,
    col_widths=[0.8, 2.8, 1.3, 0.9])

# --- 16:30-18:00 ---
add_heading_styled(doc, '2.10 Borrel op het Strand — Afsluiting (16:30-18:00)', level=2)
blok10 = [
    ('16:30', 'Overgang naar strand, BBQ borrel start', 'Catering', 'Strand'),
    ('16:30-17:30', 'Informele borrel, netwerken, foto\'s', 'Allen', 'Strand'),
    ('17:30-17:45', 'Korte afsluiting door DG + bedankje organisatie', 'Jorick', 'Strand'),
    ('17:45-18:00', 'Fotomoment kabinet + groepsfoto', 'Fotograaf', 'Strand'),
    ('18:00', 'Officiële afsluiting', 'Jorick', 'Strand'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke', 'Locatie'], blok10,
    col_widths=[0.8, 2.8, 1.3, 0.9])

doc.add_page_break()

# =========================================================================
# 3. LOGISTIEK & FACILITEITEN
# =========================================================================
add_heading_styled(doc, '3. Logistiek & Faciliteiten', level=1)

add_heading_styled(doc, '3.1 Zaalindeling Key West', level=2)
doc.add_paragraph(
    'Theater-opstelling voor het formele gedeelte (10:30-12:30). '
    'Ronde tafels (6 tafels x 6-7 personen) voor de world café sessie (15:30-16:30). '
    'Ombouw tijdens lunchpauze door cateringpersoneel + organisatieteam.'
)

add_heading_styled(doc, '3.2 Catering-tijdlijn', level=2)
catering_log = [
    ('09:00', 'Catering arriveert, opstelling buffet', 'Catering'),
    ('09:50', 'Koffie/Thee ontvangst gereed', 'Catering'),
    ('12:25', 'Buffet lunch opgebouwd', 'Catering'),
    ('12:30', 'Lunch start', 'Catering'),
    ('15:00', 'Pauze: sap, snacks, koffie', 'Catering'),
    ('16:30', 'BBQ borrel strand opgezet', 'Catering'),
    ('18:30', 'Catering afbouw + opruimen', 'Catering'),
]
add_styled_table(doc, ['Tijd', 'Actie', 'Verantwoordelijke'], catering_log,
    col_widths=[0.8, 3.0, 1.5])

add_heading_styled(doc, '3.3 Strand Setup', level=2)
doc.add_paragraph(
    'Beach area wordt ingericht met: lounge-set voor DG/IPDG, statafel voor dranken, '
    'BBQ-opstelling, statafels voor netwerken. Eventueel Lions-vlaggen en 75-jaar spandoek. '
    'Setup door organisatieteam vanaf 09:00, catering verzorgt dranken/BBQ.'
)

add_heading_styled(doc, '3.4 Parkeerinformatie', level=2)
doc.add_paragraph(
    "Papa's Beach House beschikt over gratis parkeerplaatsen. "
    "Het Haarlemmermeerse Bos is bereikbaar via N201 (afslag Hoofddorp/Zwaanshoek) "
    "of via de A4 (afslag 3 Hoofddorp). Routebeschrijving wordt meegestuurd met de uitnodiging."
)

# =========================================================================
# 4. COMMUNICATIE OP DE DAG
# =========================================================================
add_heading_styled(doc, '4. Communicatie op de Dag', level=1)

add_heading_styled(doc, '4.1 Emergency Contacts', level=2)
contacts = [
    ('Projectleider', 'Jorick van Gemert', '06-XXXXXXXX'),
    ('Logistiek', 'Robertjan Reininga', '06-30077898'),
    ('Communicatie', 'Anja Luijcx', '—'),
    ('Financiën', 'Harrie Welmer', '—'),
    ("Papa's Beach House", 'MiceOperations', 'via offerte'),
    ('Catering', 'TBA', '—'),
    ('Fotograaf', 'TBA', '—'),
]
add_styled_table(doc, ['Rol', 'Naam', 'Telefoon'], contacts, col_widths=[1.8, 2.0, 1.5])

add_heading_styled(doc, '4.2 Afzegging-protocol', level=2)
doc.add_paragraph(
    'Afzeggingen uiterlijk T-48 uur doorgeven aan Jorick (WhatsApp of telefoon). '
    'Catering kan tot T-24 uur in aantal worden aangepast (max. -5 personen). '
    'Na T-24 uur: volledige catering kosten verschuldigd.'
)

add_heading_styled(doc, '4.3 WhatsApp-groep', level=2)
doc.add_paragraph(
    'Tijdens de dag is er een actieve WhatsApp-groep voor het organisatieteam '
    '(Jorick, Robertjan, Anja, Harrie, Jonel, Mark). Deze groep wordt gebruikt voor '
    'coördinatie, tijdsignalen en noodsituaties.'
)

# =========================================================================
# 5. NA DE DAG
# =========================================================================
add_heading_styled(doc, '5. Na de Dag', level=1)

na_dag = [
    ('18 aug', 'Bedankmail sturen naar alle deelnemers + afwezigen met samenvatting + foto\'s', 'Communicatie'),
    ('22 aug', 'Facturen controleren en goedkeuren voor betaling', 'Harrie Welmer'),
    ('22 aug', 'Verslag kabinetswissel opstellen (1 A4)', 'Jorick / Hans-Peter'),
    ('29 aug', 'Evaluatieformulier versturen naar kabinet', 'Projectleider'),
    ('5 sep', 'Evaluatierapport opstellen + actielijst', 'Projectleider'),
    ('15 sep', 'Evaluatie bespreken in eerstvolgende kabinetsvergadering', 'Jorick'),
]
add_styled_table(doc, ['Datum', 'Actie', 'Verantwoordelijke'], na_dag,
    col_widths=[0.8, 3.5, 1.5])

doc.add_page_break()

# =========================================================================
# 6. CHECKLISTS
# =========================================================================
add_heading_styled(doc, '6. Checklists', level=1)

add_heading_styled(doc, '6.1 T-4 Weken (18 juli 2026)', level=2)
checklist_t4 = [
    'Definitief programma vastgesteld en gecommuniceerd',
    'Locatiebevestiging + catering-opgave (40 personen)',
    'Fotograaf bevestigd (of besluit: geen fotograaf)',
    'AV-apparatuur geregeld (eigen of gehuurd)',
    'Naambadges besteld',
    'Programmaboekjes ontwerp afgerond',
    'Gast spreker Alzheimer NL bevestigd (of alternatief)',
    'Presentaties DG, Pieter, Hans, Jonel, Martijn ontvangen',
    'World café materiaal geprepareerd (flipovers, markers)',
    'Sponsoring-bijdragen binnen',
]
for item in checklist_t4:
    doc.add_paragraph(f'☐  {item}')

add_heading_styled(doc, '6.2 T-2 Weken (1 augustus 2026)', level=2)
checklist_t2 = [
    'Uitnodigingen definitief verstuurd (inclusie laatste aanmeldingen)',
    'Catering definitief bevestigd (dieetwensen verzameld)',
    'Programmaboekjes gedrukt',
    'Routebeschrijving + parkeerinfo opgesteld',
    'WhatsApp-groep organisatieteam aangemaakt',
    'Presentaties op USB + laptop getest',
    'Aankleding besteld (bloemen, spandoeken)',
    'Back-up programma bij slecht weer definitief',
]
for item in checklist_t2:
    doc.add_paragraph(f'☐  {item}')

add_heading_styled(doc, '6.3 T-1 Week (8 augustus 2026)', level=2)
checklist_t1 = [
    'Definitief aantal deelnemers doorgegeven aan catering',
    'Reminder verstuurd naar alle deelnemers (WhatsApp + email)',
    'Laatste coordinatie-overleg organisatieteam',
    'Alle materialen ingepakt (naambadges, programma\'s, flipovers, markers)',
    'Laptop opgeladen + presentaties geladen + HDMI-kabel + adapter',
    'Emergency contactlijst geprint',
    'Draaiboek geprint (2x: voor projectleider + logistiek)',
    'Controle: weerbericht — back-up programma klaar indien regen',
]
for item in checklist_t1:
    doc.add_paragraph(f'☐  {item}')

add_heading_styled(doc, '6.4 Dag-self (15 augustus 2026)', level=2)
checklist_dag = [
    '08:30 — Vertrek naar locatie met alle materialen',
    '09:00 — Aankomst, overleg met catering/locatie',
    '09:15 — Zaalindeling controleren (theater → buffet → ronde tafels)',
    '09:30 — AV-setup en test (beamer, laptop, microfoon)',
    '09:45 — Koffie/thee ontvangst gereed',
    '09:50 — Naambadjes uitleggen op tafel bij ingang',
    '09:55 — Organisatieteam op positie — deuren open',
    '18:00 — Afronding + opruimen',
    '18:30 — Final check: geen materialen achtergelaten',
]
for item in checklist_dag:
    doc.add_paragraph(f'☐  {item}')

add_heading_styled(doc, '6.5 Na de Dag (16-29 augustus 2026)', level=2)
checklist_na = [
    'Zondag 16 aug: bedank-WhatsApp naar organisatieteam',
    'Maandag 18 aug: bedankmail + samenvatting + foto\'s naar alle deelnemers',
    'Facturen innen en controleren',
    'Verslag opstellen (max. 1 A4)',
    'Evaluatieformulier versturen',
    'Fotografie selectie voor Lions Media / website',
    'Les learned documenteren voor volgende kabinetswissel',
]
for item in checklist_na:
    doc.add_paragraph(f'☐  {item}')

# =========================================================================
# SAVE
# =========================================================================
try:
    doc.save(OUTPUT)
    print(f'OK: {OUTPUT}')
except Exception as e:
    print(f'FOUT: {e}')
