#!/usr/bin/env python3
"""Financieel Plan Kabinetswissel Lions District 110AN — v1.0
Output: financieel-plan-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, 'financieel-plan-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, accent_col=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(10)
        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(10)
            # Bold for total rows
            if val and str(val).startswith('TOTAAL') or (val and str(val).startswith('€') and r_idx >= len(rows) - 2):
                run.bold = True
            if accent_col is not None and c_idx == accent_col and r_idx % 2 == 1:
                set_cell_shading(cell, 'E8F0FE')
            elif 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(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

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('FINANCIEEL PLAN')
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(3):
    doc.add_paragraph('')

for d in ["Papa's Beach House, 15 augustus 2026", '40 genodigden — 3 scenario\'s', '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. LOCATIEKOSTEN
# =========================================================================
add_heading_styled(doc, '1. Locatiekosten — Papa\'s Beach House', level=1)

doc.add_paragraph(
    "Papa's Beach House is gelegen in het Haarlemmermeerse Bos, Hoofddorp. "
    "De Key West zaal biedt ruimte voor meetings tot 100 personen en events tot 120. "
    "Gecombineerd met terras en strand is er capaciteit tot 150 personen. "
    "Prijzen zijn indicatief en dienen bevestigd te worden via MiceOperations."
)

locatie = [
    ('Zaalhuur Key West (dagdeel, 10:00-18:00)', '€ 500', '€ 1.000', '€ 1.500'),
    ('Terras + beach toegang (inbegrepen)', '—', '—', '—'),
    ('Parkeerplaatsen (gratis)', '—', '—', '—'),
]

add_styled_table(doc, ['Post', 'Budget', 'Midden', 'Premium'], locatie, col_widths=[3.0, 1.2, 1.2, 1.2])

doc.add_paragraph('')

# =========================================================================
# 2. CATERING SCENARIO'S
# =========================================================================
add_heading_styled(doc, '2. Catering — Drie Scenario\'s (40 personen)', level=1)

add_heading_styled(doc, '2.1 Budget: Lunch Buffet + Koffie/Thee', level=2)
doc.add_paragraph(
    'Koffie/thee bij ontvangst, uitgebreid lunchbuffet (salades, broodjes, warme snacks), '
    'koffie/thee na de lunch. Geen alcoholische dranken.'
)
budget_items = [
    ('Koffie/Thee ontvangst (40 x €3,50)', '€ 140'),
    ('Lunch buffet (40 x €22)', '€ 880'),
    ('Koffie/Thee middag (40 x €3,50)', '€ 140'),
    ('Catering totaal', '€ 1.160'),
    ('Per persoon', '€ 29'),
]
add_styled_table(doc, ['Post', 'Bedrag'], budget_items, col_widths=[4.0, 1.5])

add_heading_styled(doc, '2.2 Midden: Uitgebreide Lunch + BBQ Borrel + Dranken', level=2)
doc.add_paragraph(
    'Koffie/thee bij ontvangst, uitgebreide lunch (warm/koud buffet), '
    'middagpauze met verse sap en snacks, BBQ borrel op het strand met 2 consumpties p/p.'
)
midden_items = [
    ('Koffie/Thee ontvangst (40 x €4)', '€ 160'),
    ('Uitgebreide lunch buffet (40 x €28)', '€ 1.120'),
    ('Middagpauze sap + snacks (40 x €5)', '€ 200'),
    ('BBQ borrel strand (40 x €18)', '€ 720'),
    ('Catering totaal', '€ 2.200'),
    ('Per persoon', '€ 55'),
]
add_styled_table(doc, ['Post', 'Bedrag'], midden_items, col_widths=[4.0, 1.5])

add_heading_styled(doc, '2.3 Premium: 3-Gangen Diner + Borrel + Aankleding', level=2)
doc.add_paragraph(
    'Koffie/thee ontvangst met prosecco, seated 3-gangen lunch (voorgerecht, hoofdgerecht naar keuze, dessert), '
    'wijn bij de lunch, uitgebreide borrel op het strand met hapjes, bijzondere tafelaankleding.'
)
premium_items = [
    ('Prosecco ontvangst (40 x €6)', '€ 240'),
    ('3-gangen lunch (40 x €37)', '€ 1.480'),
    ('Wijn bij lunch (40 x €8)', '€ 320'),
    ('Borrel strand + hapjes (40 x €22)', '€ 880'),
    ('Catering totaal', '€ 2.920'),
    ('Per persoon', '€ 73'),
]
add_styled_table(doc, ['Post', 'Bedrag'], premium_items, col_widths=[4.0, 1.5])

# =========================================================================
# 3. EXTRA'S
# =========================================================================
add_heading_styled(doc, '3. Extra\'s en Bijkomende Kosten', level=1)

extras = [
    ('AV-apparatuur (beamer, scherm, microfoon)', '€ 200', '€ 350', '€ 500'),
    ('Naambadges + lanyards (40 stuks)', '€ 80', '€ 120', '€ 150'),
    ('Programmaboekjes (40 stuks, full color)', '€ 60', '€ 100', '€ 150'),
    ('Aankleding: bloemen, spandoeken, Lions 75-jaar', '€ 100', '€ 250', '€ 500'),
    ('Fotograaf (3 uur)', '€ 0', '€ 350', '€ 500'),
    ('Draaiboek-print + hand-outs', '€ 20', '€ 40', '€ 60'),
    ('Onverwacht (5%)', '€ 23', '€ 61', '€ 93'),
    ('Extra\'s totaal', '€ 483', '€ 1.271', '€ 1.953'),
]

add_styled_table(doc, ['Post', 'Budget', 'Midden', 'Premium'], extras, col_widths=[3.0, 1.2, 1.2, 1.2])

doc.add_paragraph('')

# =========================================================================
# 4. TOTAALOVERZICHT
# =========================================================================
add_heading_styled(doc, '4. Totaaloverzicht — Vergelijkingstabel', level=1)

totaal = [
    ('Zaalhuur', '€ 500', '€ 1.000', '€ 1.500'),
    ('Catering', '€ 1.160', '€ 2.200', '€ 2.920'),
    ('Extra\'s', '€ 483', '€ 1.271', '€ 1.953'),
    ('Onverwacht (inbegrepen bij extra\'s)', '', '', ''),
    ('', '', '', ''),
    ('TOTAAL', '€ 2.143', '€ 4.471', '€ 6.373'),
    ('Per persoon', '€ 54', '€ 112', '€ 159'),
]

add_styled_table(doc, ['Post', 'Budget', 'Midden', 'Premium'], totaal, col_widths=[3.0, 1.2, 1.2, 1.2])

doc.add_paragraph('')

# =========================================================================
# 5. FINANCIERING
# =========================================================================
add_heading_styled(doc, '5. Financiering', level=1)

doc.add_paragraph(
    'De kabinetswissel wordt gefinancierd uit een combinatie van districtsmiddelen en sponsoring. '
    'Stichting Lions Helpen MD 110 (ANBI) fungeert als fondsenwervend vehikel.'
)

fin = [
    ('Districtskas — begroting kabinetswissel', '€ 2.500', 'Vast bedrag uit jaarbegroting'),
    ('Stichting Lions Helpen — sponsoring', '€ 1.500', 'Benadering Lions-vriendelijke bedrijven'),
    ('Bijdrage clubs (vrijwillig, €50/club)', '€ 500', '8-10 deelnemende clubs'),
    ('LCIF District Grant (aanvraag)', '€ 0-500', 'Community Impact Grant indien beschikbaar'),
    ('Totaal beschikbaar', '€ 4.500-5.000', ''),
]

add_styled_table(doc, ['Bron', 'Bedrag', 'Toelichting'], fin, col_widths=[2.8, 1.2, 2.5])

# =========================================================================
# 6. AANBEVELING
# =========================================================================
add_heading_styled(doc, '6. Aanbeveling', level=1)

p = doc.add_paragraph()
run = p.add_run('Aanbevolen scenario: MIDDEN (€4.471)')
run.bold = True
run.font.size = Pt(13)
run.font.color.rgb = SECONDARY

doc.add_paragraph(
    'Motivatie:'
)

reasons = [
    'De uitgebreide lunch + BBQ borrel past uitstekend bij de zomerse beach-setting van Papa\'s Beach House.',
    'Het programma (10:00-18:00) vereist zowel een stevige lunch als een informele afsluiting — het midden-scenario dekt beide.',
    'Met €4.471 blijft het binnen de beschikbare budgetten (districtskas + sponsoring).',
    'Per persoon €112 is passend voor een districtskabinetswissel — niet excessief maar professioneel.',
    'De BBQ borrel op het strand creëert de informele sfeer die past bij "Samen Verder Bouwen".',
    'Fotograaf inbegrepen voor verslaglegging en Lions Media-publicatie.',
]
for r in reasons:
    p = doc.add_paragraph(r, style='List Bullet')

doc.add_paragraph('')

p = doc.add_paragraph()
run = p.add_run('Risico-afdekking: ')
run.bold = True
run = p.add_run(
    'Bij onvoorziene kosten of tegenvallende sponsoring kan worden teruggevallen naar het Budget-scenario '
    '(€2.143) door de BBQ borrel te vervangen door een eenvoudige consumptieregeling en fotograaf/extra aankleding te schrappen.'
)

# =========================================================================
# 7. BETALINGSSCHEMA
# =========================================================================
add_heading_styled(doc, '7. Betalingsschema', level=1)

betaling = [
    ('Boeking locatie', '1 mei 2026', '€ 500', 'Aanbetaling 50% zaalhuur'),
    ('Definitieve catering-opgave', '1 juli 2026', '€ 0', 'Aantal personen definitief'),
    ('Catering restant', '15 aug 2026', '€ 2.200', 'Na afloop factuur'),
    ('Zaalhuur restant', '15 aug 2026', '€ 500', 'Na afloop factuur'),
    ('Extra\'s', 'aug 2026', '€ 1.271', 'Direct na afloop'),
]

add_styled_table(doc, ['Post', 'Datum', 'Bedrag', 'Opmerking'], betaling, col_widths=[2.0, 1.2, 1.0, 2.3])

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