#!/usr/bin/env python3
"""
Presentatie Kabinetswissel District 110AN — Samen Verder Bouwen
v1.0 | 18 april 2026
"""

import sys
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE

# ── Kleuren & Constanten ──
PRIMARY   = RGBColor(0x00, 0x33, 0x66)  # #003366
ACCENT    = RGBColor(0xF5, 0x9E, 0x0B)  # #F59E0B
SECONDARY = RGBColor(0x00, 0xA8, 0x59)  # #00A859
WHITE     = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_BG  = RGBColor(0xF0, 0xF4, 0xF8)
DARK_TEXT  = RGBColor(0x1E, 0x29, 0x3B)
FONT      = "Calibri"

SLIDE_W = Inches(13.333)
SLIDE_H = Inches(7.5)
HEADER_H = Inches(1.1)  # Header band height
MARGIN   = Inches(0.8)

prs = Presentation()
prs.slide_width  = SLIDE_W
prs.slide_height = SLIDE_H

# ── Helpers ──
def add_bg(slide, color):
    """Volledige achtergrondkleur."""
    bg = slide.background
    fill = bg.fill
    fill.solid()
    fill.fore_color.rgb = color

def add_rect(slide, left, top, width, height, color):
    shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, height)
    shape.fill.solid()
    shape.fill.fore_color.rgb = color
    shape.line.fill.background()
    return shape

def add_textbox(slide, left, top, width, height, text, font_size=18, bold=False, color=DARK_TEXT, align=PP_ALIGN.LEFT, font_name=FONT):
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame
    tf.word_wrap = True
    p = tf.paragraphs[0]
    p.text = text
    p.font.size = Pt(font_size)
    p.font.bold = bold
    p.font.color.rgb = color
    p.font.name = font_name
    p.alignment = align
    return txBox

def add_bullets(slide, left, top, width, height, items, font_size=16, color=DARK_TEXT, spacing=Pt(8)):
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame
    tf.word_wrap = True
    for i, item in enumerate(items):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        p.text = f"•  {item}"
        p.font.size = Pt(font_size)
        p.font.color.rgb = color
        p.font.name = FONT
        p.space_after = spacing
    return txBox

def add_gold_line(slide, left, top, width):
    """Gouden scheidingslijn."""
    shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, Pt(3))
    shape.fill.solid()
    shape.fill.fore_color.rgb = ACCENT
    shape.line.fill.background()

def add_header_band(slide):
    """Header band + gouden lijn voor content slides."""
    add_rect(slide, Inches(0), Inches(0), SLIDE_W, HEADER_H, PRIMARY)
    add_gold_line(slide, Inches(0), HEADER_H, SLIDE_W)

def make_content_slide(title_text, bullets, sub_bullets=None):
    """Standaard content slide: header + bullets."""
    slide = prs.slides.add_slide(prs.slide_layouts[6])  # blank
    add_bg(slide, WHITE)
    add_header_band(slide)
    # Title in header
    add_textbox(slide, MARGIN, Inches(0.15), SLIDE_W - 2*MARGIN, Inches(0.8),
                title_text, font_size=28, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
    # Bullets
    top = HEADER_H + Inches(0.4)
    add_bullets(slide, MARGIN, top, SLIDE_W - 2*MARGIN, Inches(5), bullets, font_size=18)
    return slide

def make_section_slide(section_title, subtitle=""):
    """Section divider: volledige achtergrondkleur + witte tekst."""
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_bg(slide, PRIMARY)
    # Gouden lijn midden
    add_gold_line(slide, Inches(3), Inches(3.3), Inches(7.333))
    # Titel
    add_textbox(slide, Inches(1), Inches(2.0), Inches(11.333), Inches(1.2),
                section_title, font_size=44, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
    if subtitle:
        add_textbox(slide, Inches(1), Inches(3.6), Inches(11.333), Inches(0.8),
                    subtitle, font_size=22, color=ACCENT, align=PP_ALIGN.CENTER)
    return slide


# ══════════════════════════════════════════════════════════════
# DEEL 1 — OPENING (Slides 1-4)
# ══════════════════════════════════════════════════════════════

# Slide 1 — Titelslide
slide = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(slide, PRIMARY)
add_gold_line(slide, Inches(2), Inches(2.5), Inches(9.333))
add_textbox(slide, Inches(1), Inches(1.0), Inches(11.333), Inches(1.5),
            "Kabinetswissel District 110AN", font_size=44, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(2.7), Inches(11.333), Inches(1.0),
            "Samen Verder Bouwen", font_size=32, bold=False, color=ACCENT, align=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(4.0), Inches(11.333), Inches(0.6),
            "Zaterdag 15 augustus 2026  •  Papa's Beach House, Haarlemmermeerse Bos, Hoofddorp",
            font_size=18, color=WHITE, align=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(4.7), Inches(11.333), Inches(0.6),
            "Districtsgouverneur: Jorick van Gemert",
            font_size=20, bold=True, color=WHITE, align=PP_ALIGN.CENTER)

# Slide 2 — Welkom
slide = make_content_slide("Welkom — Kabinet 2026-2027", [
    "Districtsgouverneur: Jorick van Gemert (branche Alkmaar Victorie)",
    "IPDG: Pieter Haex (LC Amsterdam 't IJ)",
    "1e VDG: Martijn Wokke (branche Alkmaar Victorie)",
    "2e VDG: Hans Luijcx (LC Almere Host)",
    "Secretaris: Hans-Peter Visser  •  Penningmeester: Harrie Welmer (LC Den Helder)",
    "GLT: Jonel Penders  •  GST: Hans Luijcx  •  GMT: Arthur Wigbout  •  GET: Arjan van Ommen",
])

# Slide 3 — Overdrachtsmoment
slide = make_content_slide("Overdrachtsmoment", [
    "Formeel is Jorick per 1 juli 2026 DG — vandaag is de inhoudelijke kick-off",
    "Dank aan Arjan van Ommen (GET) voor de overdracht en begeleiding",
    "Symboliek: overdracht ambtsketen / DG-pin",
    "Een moment van verbinding: oud en nieuw kabinet, samen naar de toekomst",
])

# Slide 4 — Programma overzicht
slide = make_content_slide("Programma Overzicht", [
    "10:00 – 10:30  Ontvangst met koffie",
    "10:30 – 11:00  Opening + Overdrachtssymboliek",
    "11:00 – 11:30  Lions 75 Jaar — IPDG Pieter Haex",
    "11:30 – 12:00  Stichting Alzheimer Nederland",
    "12:00 – 12:30  Samen Verder Bouwen — Visie DG",
    "12:30 – 13:30  Gezamenlijke lunch",
    "13:30 – 15:00  Buitenactiviteit / Teambuilding",
    "15:00 – 15:30  Pauze",
    "15:30 – 16:30  World Café — Interactieve sessie",
    "16:30 – 18:00  Borrel op het strand — Afsluiting",
])


# ══════════════════════════════════════════════════════════════
# DEEL 2 — LIONS 75 JAAR (Slides 5-9)
# ══════════════════════════════════════════════════════════════

make_section_slide("Lions 75 Jaar", "75 jaar Lions in Nederland — een mijlpaal")

# Slide 6 — Geschiedenis
slide = make_content_slide("75 Jaar Lions in Nederland — Key Milestones", [
    "1951: Eerste Lions Club in Nederland opgericht",
    "Jaren '50-'70: Groei naar landelijk netwerk van serviceclubs",
    "Jaren '80-'90: Uitbreiding jeugdprogramma's (Leo Clubs, jeugduitwisseling)",
    "2000-2020: Professionalisering, LCIF-impact, digitale transitie",
    "2021-2026: Focus op Mission 1.5, diversiteit, maatschappelijke relevantie",
    "2026: 75 jaar Lions Nederland — een jaar van trots en zichtbaarheid",
])

# Slide 7 — Viering 21 september
slide = make_content_slide("Lustrumviering — 21 September 2026", [
    "Landelijke viering van 75 jaar Lions in Nederland",
    "Speciale lustrumbijlage van het Lion Magazine",
    "Landelijke advertentie samen met Stichting Alzheimer Nederland",
    "Campagne 'Lions Vertellen': verhalen uit de clubs, podcasts, media",
    "Naamsbekendheid LCIF vergroten bij breed publiek",
])

# Slide 8 — Lions Vertellen
slide = make_content_slide("Lions Vertellen — Verhalen uit de Clubs", [
    "Vertel niet alleen wat we doen — laat zien wie we zijn",
    "Elke club heeft een verhaal: impact in de eigen gemeenschap",
    "Verhalen worden verzameld via podcasts, video's en het Lion Magazine",
    "Oproep aan alle clubs: deel jullie beste momenten",
    "Samen maken we zichtbaar wat Lions betekent voor Nederland",
])

# Slide 9 — Kabinet bijdrage
slide = make_content_slide("Hoe Draagt het Kabinet Bij?", [
    "Lions Media commissie (Anja Luijcx + Hans-Peter Visser) coördineert communicatie",
    "Lion Magazine 3x per jaar: fysiek + digitaal + lustrumbijlage",
    "IPDG Pieter Haex is het gezicht van het lustrum in District 110AN",
    "Elke zonevoorzitter stimuleert clubs om verhalen te delen",
    "Schiphol-testproject (Q1 2027) als unieke lustrum-activiteit",
])


# ══════════════════════════════════════════════════════════════
# DEEL 3 — STICHTING ALZHEIMER NEDERLAND (Slides 10-14)
# ══════════════════════════════════════════════════════════════

make_section_slide("Stichting Alzheimer Nederland", "Ons landelijke goede doel — lustrumjaar 2026-2027")

# Slide 11 — Waarom Alzheimer NL?
slide = make_content_slide("Ons Goede Doel — Waarom Alzheimer Nederland?", [
    "Lustrumjaar vraagt om een doel dat raakt aan de kern van onze samenleving",
    "Dementie is één van de grootste volksgezondheidsuitdagingen van deze tijd",
    "Aansluiting bij Lions International thema: Mental Health & Well-Being",
    "Lokale verbinding: Alzheimer raakt velen in onze eigen gemeenschappen",
    "Ruimte voor clubs: eigen invulling, geen verplichte landelijke actie",
])

# Slide 12 — Cijfers
slide = make_content_slide("Dementie in Nederland — De Feiten", [
    "Ongeveer 300.000 mensen in Nederland leven met dementie",
    "Jaarlijks krijgen circa 30.000 mensen de diagnose",
    "Dementie is de nummer 1 sterfteoorzaak bij vrouwen in Nederland",
    "Naar verwachting groeit het aantal naar 500.000 in 2040",
    "Elke Lionsclub kent iemand die direct of indirect wordt geraakt",
])

# Slide 13 — Wat kunnen clubs doen?
slide = make_content_slide("Wat Kunnen Clubs Doen?", [
    "Bestem minimaal één fondsenwervende activiteit voor Alzheimer Nederland",
    "Organiseer Voetbalherinneringen: mensen met dementie weer laten voetballen",
    "Creëer Dementievriendelijke Ruimten in de eigen gemeente",
    "Samenwerken met lokale Alzheimer-afdelingen en ontmoetingspunten",
    "Donaties via Stichting Lions Helpen (ANBI) — elke euro telt",
])

# Slide 14 — Doelen per district
slide = make_content_slide("Doelen & Actieplan District 110AN", [
    "Doel: €40.000 ophalen voor Alzheimer Nederland",
    "Per zone: minimaal 1x Voetbalherinneringen + 1x Dementievriendelijke Ruimten",
    "GST-coördinator Hans Luijcx verbindt clubs met Alzheimer NL",
    "Schiphol-testproject Q1 2027: donatie Schiphol áf hankelijk van Lions-opkomst",
    "MeerBomenNu: 20.000 zaailingen oogsten en planten",
    "Fight for Sight: start 1 oogcafé in het district",
])


# ══════════════════════════════════════════════════════════════
# DEEL 4 — SAMEN VERDER BOUWEN (Slides 15-21)
# ══════════════════════════════════════════════════════════════

make_section_slide("Samen Verder Bouwen", "Districtsthema 2026-2027")

# Slide 16 — Visie
slide = make_content_slide("Visie voor het Lionsjaar 2026-2027", [
    "Niet alles anders doen — voortbouwen op het fundament van voorgangers",
    "Drie bouwniveaus: Clubs, Impact/Zichtbaarheid, Organisatie/ICT",
    "Breder denken: over de grenzen van de eigen club heen",
    "Verbinding: oog voor andermans belangen creëert sterke relaties",
    "Toekomstbestendig: aansluiten bij Mission 1.5 en digitalisering",
    "'Samen zijn we sterker' — de rode draad door alles wat we doen",
])

# Slide 17 — Kabinetssamenstelling
slide = make_content_slide("Kabinetssamenstelling — Wie Zit Waar?", [
    "Dagelijks Bestuur: Jorick (DG), Pieter (IPDG), Martijn (1e VDG), Hans L. (2e VDG), Hans-Peter (secr.), Harrie (pen.)",
    "Global Action Team: Jonel Penders (GLT), Hans Luijcx (GST), Arthur Wigbout (GMT), Arjan van Ommen (GET)",
    "Zonevoorzitters: Erik B., Alexander M., Maarten G., Zoridza F., Marco v.D., Floris B.",
    "Commissarissen: Elisabeth Haderer (New Voices), Anja Luijcx (Lions Media), Robertjan Reininga (Conventie)",
    "Stichtingen: Robertjan R. (LCIF), Bas v.B. (Lions Helpen), Wil M. (Jeugduitwisseling)",
])

# Slide 18 — Portefeuilleverdeling
slide = make_content_slide("Portefeuilleverdeling — Overzicht", [
    "DG Jorick: Voorzitter DB + GAT, zonevoorzitters, landelijk portefeuille GMT/GET/ICT",
    "IPDG Pieter: GAT-voorzitter, Lions 75 Jaar, internationale relaties",
    "1e VDG Martijn: Zonevoorzitters, kascontrole, voorjaarsconventie",
    "2e VDG Hans L.: GST, Alzheimer Nederland, conventie-ondersteuning",
    "GET Arjan: Bestuurlijke continuïteit, ervaring als PDG, mentoring",
])

# Slide 19 — Doelstellingen
slide = make_content_slide("Doelstellingen 2026-2027", [
    "Ledenbehoud: positieve netto groei in het district",
    "Ledenwerving: minimaal 1 nieuwe club charteren",
    "Zichtbaarheid: Lions 75 Jaar campagne, 'Lions Helpen' profilering",
    "Mentale gezondheid: Alzheimer NL als rode draad, lokaal verankerd",
    "Innovatie: LionsBase doorontwikkeling, AI-exploratie, digitale clubs",
    "Reporting: tenminste 30% van de club-activiteiten rapporteren",
])

# Slide 20 — Plannen per commissie
slide = make_content_slide("Plannen per Commissie — Highlights", [
    "GLT (Jonel Penders): trainingen voor leden, presidenten, secretarissen + Guiding Lions",
    "GST (Hans Luijcx): Alzheimer NL, MeerBomenNu (20k zaailingen), Fight for Sight",
    "GMT (Arthur Wigbout): handleiding groei, clubs <20 leden, nulmeting ledenbestand",
    "GET (Arjan van Ommen): certificering Guiding Lions, clubs in gevarenzone",
    "New Voices (Elisabeth Haderer): diversiteit als fundament, geen project maar cultuur",
])

# Slide 21 — Tijdlijn
slide = make_content_slide("Tijdlijn — Milestones Komend Jaar", [
    "Aug 2026: Kabinetswissel — vandaag, inhoudelijke kick-off",
    "Sep 2026: Lustrumviering 75 jaar Lions (landelijk, 21 september)",
    "Q4 2026: Handleiding groei + nulmeting ledenbestand opgeleverd",
    "Jan 2027: Kabinet on tour — eerste vergadering op clublocatie",
    "Q1 2027: Schiphol Pier C test — Lions als testers",
    "Q2 2027: Adviesrapport digitale clubs + verdere LionsBase implementatie",
    "Mrt 2027: Trendanalyse leden + voorjaarsconventie",
    "Jun 2027: Evaluatie kabinet + voorbereiding overdracht",
])


# ══════════════════════════════════════════════════════════════
# DEEL 5 — SAMEN ZIJN (Slides 22-25)
# ══════════════════════════════════════════════════════════════

make_section_slide("Samen Zijn", "Verbinding, plezier en samenwerking")

# Slide 23 — Buitenactiviteit
slide = make_content_slide("Buitenactiviteit — Teambuilding op het Strand", [
    "13:30 – 15:00: Activiteit op het strand van Papa's Beach House",
    "Samenwerken, lachen en elkaar beter leren kennen",
    "Back-up bij regen: interactieve quiz in Key West zaal",
    "Doel: verbinden buiten de formele setting",
    "Organisatie: kabinetsteam zorgt voor programma en materialen",
])

# Slide 24 — World Café
slide = make_content_slide("World Café — Interactieve Sessie (15:30-16:30)", [
    "Ronde tafels (6 tafels × 6-7 personen) — wissel van tafel per ronde",
    "Onderwerpen: ledengroei, zichtbaarheid, Alzheimer NL, innovatie, Samen Zijn",
    "Iedereen denkt mee — input voor het komende Lionsjaar",
    "Resultaten worden verzameld en verwerkt in actiepunten",
    "Facilitatoren per tafel zorgen voor structuur en opvolging",
])

# Slide 25 — Borrel
slide = make_content_slide("Borrel op het Strand — Afsluiting (16:30-18:00)", [
    "Lounge-setup op het strand met Lions-vlaggen en 75-jaar spandoek",
    "BBQ + dranken — informeel netwerken en napraten",
    "Tijd voor persoonlijke gesprekken en nieuwe verbindingen",
    "Afsluiting door DG Jorick: korte terugblik en vooruitblik",
    "Tot ziens bij de eerste kabinetsvergadering!",
])


# ══════════════════════════════════════════════════════════════
# DEEL 6 — AFSLUITING (Slides 26-28)
# ══════════════════════════════════════════════════════════════

make_section_slide("Afsluiting", "Naar een fantastisch Lionsjaar")

# Slide 26 — Vervolgstappen
slide = make_content_slide("Vervolgstappen — Wat Gebeurt er Na Vandaag?", [
    "Eerste kabinetsvergadering: in september, locatie volgt",
    "Zonevoorzitters starten met kennismaking bij hun clubs",
    "Lions Media lanceert 75-jaar campagne",
    "GST activeert Alzheimer NL-plannen per zone",
    "Kabinet on tour: eerste vergadering op clublocatie in januari 2027",
])

# Slide 27 — Call to action
slide = make_content_slide("Call to Action — Elk Kabinetslid Heeft een Rol", [
    "Jij bent de ambassadeur van Lions in jouw regio",
    "Zoek contact met je clubs — luister, stimuleer, verbind",
    "Denk mee over ledengroei: elke club telt, elk lid telt",
    "Wees trots op wat we doen — en laat het zien",
    "Samen Verder Bouwen begint vandaag, bij jou",
])

# Slide 28 — Bedankt
slide = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(slide, PRIMARY)
add_gold_line(slide, Inches(3), Inches(3.5), Inches(7.333))
add_textbox(slide, Inches(1), Inches(2.2), Inches(11.333), Inches(1.2),
            "Bedankt & Tot Ziens", font_size=44, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(3.8), Inches(11.333), Inches(0.8),
            "Op naar een fantastisch Lionsjaar!", font_size=26, color=ACCENT, align=PP_ALIGN.CENTER)
add_textbox(slide, Inches(1), Inches(5.0), Inches(11.333), Inches(0.6),
            "We Serve — Samen Verder Bouwen", font_size=20, color=WHITE, align=PP_ALIGN.CENTER)

# ── Opslaan ──
output_path = "/root/projects/jg/2026-lions-kabinetswissel-110AN/deliverables/pptx/presentatie-kabinetswissel-110AN_v1.0.pptx"
try:
    prs.save(output_path)
    print(f"OK: {output_path} ({len(prs.slides)} slides)")
except Exception as e:
    print(f"FOUT: {e}", file=sys.stderr)
    sys.exit(1)