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

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

# --- Constants ---
PRIMARY = RGBColor(0x00, 0x33, 0x66)    # #003366
ACCENT = RGBColor(0xF5, 0x9E, 0x0B)     # #F59E0B
SECONDARY = RGBColor(0x00, 0xA8, 0x59)  # #00A859
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
ALT_ROW = RGBColor(0xE8, 0xF0, 0xFE)    # #E8F0FE

FONT = 'Calibri'
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
OUTPUT = os.path.join(BASE_DIR, 'projectaanpak-kabinetswissel-110AN_v1.0.docx')

doc = Document()

# --- Global style defaults ---
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)

# Helper functions
def set_cell_shading(cell, hex_color):
    """Set background color of a table cell."""
    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 with Lions branding: #003366 header, #E8F0FE alt rows."""
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    
    # 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 = WHITE
        run.font.name = FONT
        run.font.size = Pt(10)
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        set_cell_shading(cell, '003366')
    
    # Data rows
    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(10)
            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):
    """Heading with Lions primary 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_accent_line(doc):
    """Thin accent-colored horizontal rule."""
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run('━' * 60)
    run.font.color.rgb = ACCENT
    run.font.size = Pt(8)

# =========================================================================
# VOORBLAD
# =========================================================================
for _ in range(6):
    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

add_accent_line(doc)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('PROJECTAANPAK')
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.color.rgb = RGBColor(0x33, 0x33, 0x33)
run.font.name = FONT

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

details = [
    'Samen Verder Bouwen',
    'Zaterdag 15 augustus 2026',
    "Papa's Beach House, Haarlemmermeerse Bos, Hoofddorp",
    'Districtsgouverneur: Jorick van Gemert',
]
for d in details:
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(d)
    run.font.size = Pt(13)
    run.font.color.rgb = RGBColor(0x55, 0x55, 0x55)
    run.font.name = FONT

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Versie 1.0 — 18 april 2026')
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(0x99, 0x99, 0x99)
run.font.name = FONT

doc.add_page_break()

# =========================================================================
# 1. PROJECTDOELSTELLINGEN
# =========================================================================
add_heading_styled(doc, '1. Projectdoelstellingen', level=1)

p = doc.add_paragraph()
run = p.add_run('Doel: ')
run.bold = True
run.font.name = FONT
run = p.add_run(
    'Organiseren van een inhoudelijke en sfeervolle kabinetswissel op 15 augustus 2026 '
    'bij Papa\'s Beach House, waarmee het nieuwe kabinet onder leiding van DG Jorick van Gemert '
    'formeel van start gaat met het Lionsjaar 2026-2027.'
)

add_heading_styled(doc, 'SMART-doelstellingen', level=2)

objectives = [
    ('Datum & Locatie', 'Zaterdag 15 augustus 2026, Papa\'s Beach House, Hoofddorp — definitief geboekt voor uiterlijk 1 mei 2026'),
    ('Deelnemers', '40 genodigden (kabinet + gasten + organisatie) — 85% opkomst als KPI'),
    ('Inhoud', 'Drie pijlers geïntegreerd: Lions 75 jaar, Alzheimer NL, "Samen Verder Bouwen"'),
    ('Budget', 'Begroting vastgesteld voor 1 juni 2026 — max. €4.500 uit districtskas, rest via sponsoring'),
    ('Teamlid-staat', 'Organisatieteam compleet en functioneel per 15 mei 2026'),
    ('Evaluatie', 'Evaluatierapport opgeleverd binnen 2 weken na afloop'),
]

add_styled_table(doc,
    ['Doel', 'Omschrijving'],
    objectives,
    col_widths=[1.8, 4.7]
)

doc.add_paragraph('')

# =========================================================================
# 2. ORGANISATIESTRUCTUUR
# =========================================================================
add_heading_styled(doc, '2. Organisatiestructuur', level=1)

p = doc.add_paragraph(
    'De organisatie is opgedeeld in drie clusters, elk met een duidelijke verantwoordelijke '
    'uit het kabinet. De DG behoudt eindverantwoordelijkheid.'
)

org = [
    ('Projectleider', 'Jorick van Gemert', 'DG', 'Eindverantwoordelijkheid, programma, visie-presentatie'),
    ('Logistiek & Locatie', 'Robertjan Reininga', 'Conventie coördinator', 'Papa\'s Beach House, zaalindeling, catering, AV'),
    ('Communicatie', 'Anja Luijcx / Hans-Peter Visser', 'Lions Media', 'Uitnodigingen, programma, website, social media'),
    ('Financiën', 'Harrie Welmer', 'Penningmeester', 'Begroting, facturatie, sponsoring'),
    ('Programma-inhoud', 'Jonel Penders (GLT)', 'GLT coördinator', 'Werkvormen, interactieve sessies, teambuilding'),
    ('Alzheimer NL', 'Hans Luijcx (GST)', 'GST coördinator', 'Presentatie goed doel, samenwerking stichting'),
    ('Lions 75 Jaar', 'Pieter Haex', 'IPDG', 'Lustrum-presentatie, historie, LCIF'),
    ('Protocollair', 'Mark Wijngaarde', 'PDG / Tail Twister', 'Overdrachtssymboliek, ceremonieel'),
]

add_styled_table(doc,
    ['Rol', 'Verantwoordelijke', 'Functie', 'Taken'],
    org,
    col_widths=[1.4, 1.6, 1.5, 2.0]
)

doc.add_paragraph('')

# =========================================================================
# 3. TIJDLIJN & MILESTONES
# =========================================================================
add_heading_styled(doc, '3. Tijdlijn & Milestones', level=1)

timeline = [
    ('18 apr', 'Projectaanpak opgeleverd', 'Kas/Jorick', 'Groen'),
    ('25 apr', 'Offerte-aanvraag Papa\'s Beach House', 'Logistiek', 'Groen'),
    ('1 mei', 'Locatie definitief geboekt', 'Projectleider', 'Geel'),
    ('15 mei', 'Organisatieteam compleet + kick-off', 'Projectleider', 'Geel'),
    ('1 jun', 'Begroting definitief + sponsoring actie', 'Financiën', 'Geel'),
    ('15 jun', 'Uitnodigingen verstuurd', 'Communicatie', 'Rood'),
    ('1 jul', 'Formele overdracht DG (1 juli Lions)', 'DG', 'Rood'),
    ('15 jul', 'Definitief programma vastgesteld', 'Projectleider', 'Rood'),
    ('1 aug', 'Alle logistiek bevestigd', 'Logistiek', 'Rood'),
    ('8 aug', 'Final check + T-1 week briefing', 'Projectleider', 'Rood'),
    ('15 aug', 'KABINETSWISSEL', 'Alle', 'Blauw'),
    ('29 aug', 'Evaluatierapport opgeleverd', 'Projectleider', 'Blauw'),
]

add_styled_table(doc,
    ['Datum', 'Milestone', 'Verantwoordelijke', 'Status'],
    timeline,
    col_widths=[0.8, 2.5, 1.5, 0.7]
)

p = doc.add_paragraph()
run = p.add_run('Status: ')
run.bold = True
run = p.add_run('Groen = afgerond | Geel = in uitvoering | Rood = nog te starten | Blauw = na de dag')

# =========================================================================
# 4. BEGROTING (3 SCENARIO'S)
# =========================================================================
add_heading_styled(doc, '4. Begroting — Drie Scenario\'s', level=1)

p = doc.add_paragraph(
    'Onderstaande begroting is gebaseerd op de prijsindicaties van Papa\'s Beach House en '
    'geschatte kosten voor extra faciliteiten. Zie het afzonderlijke Financieel Plan voor details.'
)

budget = [
    ('Zaalhuur Key West (dagdeel)', '€ 750', '€ 1.000', '€ 1.500'),
    ('Catering p/p', '€ 28', '€ 50', '€ 75'),
    ('Catering totaal (40 p/p)', '€ 1.120', '€ 2.000', '€ 3.000'),
    ('AV-apparatuur (beamer, geluid)', '€ 200', '€ 350', '€ 500'),
    ('Naambadges + programma', '€ 80', '€ 120', '€ 150'),
    ('Aankleding (bloemen, spandoeken)', '€ 100', '€ 250', '€ 500'),
    ('Fotograaf', '€ 0', '€ 350', '€ 500'),
    ('Onverwacht (5%)', '€ 113', '€ 204', '€ 308'),
    ('', '', '', ''),
    ('TOTAAL', '€ 2.363', '€ 4.274', '€ 6.458'),
    ('Per persoon', '€ 59', '€ 107', '€ 161'),
]

add_styled_table(doc,
    ['Post', 'Budget', 'Midden', 'Premium'],
    budget,
    col_widths=[2.5, 1.2, 1.2, 1.2]
)

p = doc.add_paragraph()
run = p.add_run('Aanbeveling: ')
run.bold = True
run.font.color.rgb = SECONDARY
run = p.add_run(
    'Scenario "Midden" (€4.274) biedt de beste balans tussen kwaliteit en kosten. '
    'Uitgebreide lunch + BBQ borrel past bij de zomerse beach-setting en verwachtingen '
    'van een districtskabinetswissel.'
)

# =========================================================================
# 5. RISICOANALYSE
# =========================================================================
add_heading_styled(doc, '5. Risicoanalyse', level=1)

risks = [
    ('Locatie niet beschikbaar', 'Middel', 'Laag', 'Alternatief: Fletcher Hotel of Van der Valk Hoofddorp — offertes parallel aanvragen'),
    ('Opkomst < 85%', 'Middel', 'Middel', 'Persoonlijke uitnodiging DG, reminder T-2 weken, WhatsApp-groep kabinet'),
    ('Budget overschrijding', 'Laag', 'Middel', 'Sponsoring Lions Helpen, bijdrage per club, LCIF grant onderzoek'),
    ('Slecht weer (outdoor)', 'Middel', 'Laag', 'Back-up programma indoor (Key West zaal), beach-activiteit verplaatsbaar naar terras'),
    ('Ziekte/Afzegging spreker', 'Laag', 'Laag', 'Back-up presentaties voorbereid, GST/GLT coördinator als invaller'),
    ('AV-problemen', 'Laag', 'Middel', 'Eigen laptop + projector meenemen, test T-1 dag, HDMI-kabel backup'),
]

add_styled_table(doc,
    ['Risico', 'Waarschijnlijkheid', 'Impact', 'Mitigatie'],
    risks,
    col_widths=[1.5, 1.0, 0.8, 3.0]
)

# =========================================================================
# 6. COMMUNICATIEPLAN
# =========================================================================
add_heading_styled(doc, '6. Communicatieplan', level=1)

comms = [
    ('15 jun', 'Save-the-date', 'Alle genodigden', 'Email + WhatsApp', 'Communicatie'),
    ('1 jul', 'Officiële uitnodiging', 'Alle genodigden', 'Email (met PDF programma)', 'Communicatie'),
    ('1 aug', 'Programma + praktische info', 'Alle deelnemers', 'Email + LionsBase', 'Communicatie'),
    ('8 aug', 'Reminder + routebeschrijving', 'Alle deelnemers', 'WhatsApp + Email', 'Projectleider'),
    ('15 aug', 'Live updates', 'Deelnemers + afwezigen', 'WhatsApp groep', 'Communicatie'),
    ('22 aug', 'Bedankmail + foto\'s', 'Alle deelnemers + afwezigen', 'Email', 'Communicatie'),
    ('29 aug', 'Evaluatie + verslag', 'Kabinet + organisatie', 'Email + LionsBase', 'Projectleider'),
]

add_styled_table(doc,
    ['Datum', 'Actie', 'Doelgroep', 'Kanaal', 'Verantwoordelijke'],
    comms,
    col_widths=[0.7, 1.5, 1.3, 1.3, 1.2]
)

# =========================================================================
# 7. INHOUDELIJKE PIJLERS
# =========================================================================
add_heading_styled(doc, '7. Inhoudelijke Pijlers', level=1)

add_heading_styled(doc, '7.1 Lions 75 Jaar', level=2)
doc.add_paragraph(
    '2026-2027 markeert het 75-jarig jubileum van Lions in Nederland. Tijdens de kabinetswissel '
    'wordt dit lustrum centraal gevierd met een presentatie over de historie en impact van Lions Nederland, '
    'aangevuld met de landelijke campagne "Lions Vertellen" en de naamsbekendheid van LCIF. '
    'IPDG Pieter Haex verzorgt de lustrum-presentatie.'
)

add_heading_styled(doc, '7.2 Stichting Alzheimer Nederland', level=2)
doc.add_paragraph(
    'Het landelijke goede doel voor het lustrumjaar. GST-coördinator Hans Luijcx presenteert de '
    'plannen: €40.000 ophalen voor Voetbalherinneringen en Dementievriendelijke Ruimten. '
    'Per zone minimaal één project van elk. Uitnodiging aan een vertegenwoordiger van Alzheimer NL '
    'voor een korte bijdrage.'
)

add_heading_styled(doc, '7.3 Samen Verder Bouwen', level=2)
doc.add_paragraph(
    'Het districtsthema door DG Jorick van Gemert. Drie bouwniveaus: Clubs (Mission 1.5), '
    'Impact/Zichtbaarheid, en Organisatie/ICT. De visie-presentatie vormt het inhoudelijke hart '
    'van de kabinetswissel en geeft richting aan het komende Lionsjaar.'
)

# =========================================================================
# 8. VERVOLGSTAPPEN
# =========================================================================
add_heading_styled(doc, '8. Vervolgstappen — Beslissingen nodig', level=1)

p = doc.add_paragraph(
    'Onderstaande beslissingen vereisen alleen een "ja" van Jorick om door te gaan:'
)

steps = [
    ('1', 'Offerte aanvragen Papa\'s Beach House via MiceOperations — kan direct'),
    ('2', 'Organisatieteam informeren (Robertjan, Anja, Hans-Peter, Harrie) — na boeking locatie'),
    ('3', 'Spreker Alzheimer Nederland uitnodigen — na boeking locatie'),
    ('4', 'Scenario Midden als budgetrichtlijn hanteren — direct te bevestigen'),
    ('5', 'Uitnodigingenlijst definitief maken (40 personen) — voor 1 juni'),
    ('6', 'Fotograaf inhuren (ja/nee) — budget-afhankelijk'),
]

add_styled_table(doc,
    ['#', 'Actie', 'Opmerking'],
    steps,
    col_widths=[0.3, 3.5, 2.5]
)

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