#!/usr/bin/env python3
"""Uitnodigingsbrief Kabinetswissel 110AN — v1.0
Generates a professional invitation letter (DOCX) with Lions branding."""

import os
from docx import Document
from docx.shared import Pt, Cm, RGBColor, Inches
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 ──────────────────────────────────────────────────────────
OUT_DIR = os.path.dirname(os.path.abspath(__file__))
OUT_FILE = os.path.join(OUT_DIR, "uitnodigingsbrief-kabinetswissel-110AN_v2.0.docx")

# Lions brand colors
NAVY = RGBColor(0x00, 0x33, 0x66)
GOLD = RGBColor(0xF5, 0x9E, 0x0B)
GREEN = RGBColor(0x00, 0xA8, 0x59)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)

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

def set_run_font(run, name="Calibri", size=11, color=None, bold=False, italic=False):
    """Helper to style a run."""
    run.font.name = name
    run.font.size = Pt(size)
    if color:
        run.font.color.rgb = color
    run.bold = bold
    run.italic = italic
    # Ensure correct font in Word
    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="{name}" w:hAnsi="{name}"/>')
        rpr.insert(0, rFonts)

def add_spacer(doc, pt=6):
    """Add vertical space."""
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(0)
    p.paragraph_format.space_after = Pt(pt)
    return p

def main():
    try:
        doc = Document()

        # ── Page margins ───────────────────────────────────────────────
        for section in doc.sections:
            section.top_margin = Cm(2)
            section.bottom_margin = Cm(2)
            section.left_margin = Cm(2.5)
            section.right_margin = Cm(2.5)

        # ── FORDBLAD: Lions branding header ────────────────────────────
        # Navy banner table
        banner = doc.add_table(rows=1, cols=1)
        banner.alignment = WD_TABLE_ALIGNMENT.CENTER
        cell = banner.cell(0, 0)
        set_cell_shading(cell, "003366")

        # Title in banner
        p = cell.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.paragraph_format.space_before = Pt(20)
        p.paragraph_format.space_after = Pt(4)
        run = p.add_run("LIONS CLUBS")
        set_run_font(run, "Calibri", 28, WHITE, bold=True)

        p2 = cell.add_paragraph()
        p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p2.paragraph_format.space_before = Pt(0)
        p2.paragraph_format.space_after = Pt(4)
        run2 = p2.add_run("DISTRICT 110AN")
        set_run_font(run2, "Calibri", 18, GOLD, bold=True)

        # Gold divider line
        p3 = cell.add_paragraph()
        p3.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p3.paragraph_format.space_before = Pt(8)
        p3.paragraph_format.space_after = Pt(20)
        run3 = p3.add_run("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
        set_run_font(run3, "Calibri", 10, GOLD)

        # ── Subtitle ───────────────────────────────────────────────────
        add_spacer(doc, 12)
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run("UITNODIGING")
        set_run_font(run, "Calibri", 16, NAVY, bold=True)

        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.paragraph_format.space_after = Pt(4)
        run = p.add_run("Kabinetswissel 2026-2027")
        set_run_font(run, "Calibri", 14, NAVY)

        # Theme
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.paragraph_format.space_after = Pt(16)
        run = p.add_run('"Samen Verder Bouwen"')
        set_run_font(run, "Calibri", 14, GOLD, bold=True, italic=True)

        # ── Aanhef ─────────────────────────────────────────────────────
        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(8)
        run = p.add_run("Geachte kabinetsleden,")
        set_run_font(run, "Calibri", 11, NAVY)

        # ── Intro ──────────────────────────────────────────────────────
        intro = (
            "Het nieuwe Lionsjaar staat voor de deur en dat viert District 110AN op een bijzondere manier. "
            "Op zaterdag 15 augustus 2026 nodigen wij u van harte uit voor de kabinetswissel, "
            "waarbij het nieuwe kabinet onder leiding van Districtsgouverneur Jorick van Gemert "
            "formeel van start gaat."
        )
        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(8)
        run = p.add_run(intro)
        set_run_font(run, "Calibri", 11)

        # Context
        context = (
            "Dit jaar is bijzonder: Lions Nederland viert haar 75-jarig jubileum, "
            "we verbinden ons met Stichting Alzheimer Nederland als landelijk goed doel, "
            "en onder het thema 'Samen Verder Bouwen' zetten we de koers uit voor een impactvol Lionsjaar. "
            "Een unieke combinatie die deze dag een bijzonder startmoment maakt."
        )
        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(12)
        run = p.add_run(context)
        set_run_font(run, "Calibri", 11)

        # ── Details table ──────────────────────────────────────────────
        details_table = doc.add_table(rows=5, cols=2)
        details_table.alignment = WD_TABLE_ALIGNMENT.LEFT

        details = [
            ("Datum:", "Zaterdag 15 augustus 2026"),
            ("Tijd:", "10:00 — 18:00 uur (inclusief lunch, activiteiten en borrel)"),
            ("Locatie:", "Papa's Beach House, Haarlemmermeerse Bos, Hoofddorp"),
            ("Dresscode:", "Smart Casual / Summer"),
            ("Parkeren:", "Gratis bij Papa's Beach House, Haarlemmermeerse Bos"),
        ]

        for i, (label, value) in enumerate(details):
            cell_l = details_table.cell(i, 0)
            cell_r = details_table.cell(i, 1)

            # Label cell
            p = cell_l.paragraphs[0]
            p.paragraph_format.space_before = Pt(4)
            p.paragraph_format.space_after = Pt(4)
            run = p.add_run(label)
            set_run_font(run, "Calibri", 11, NAVY, bold=True)

            # Value cell
            p = cell_r.paragraphs[0]
            p.paragraph_format.space_before = Pt(4)
            p.paragraph_format.space_after = Pt(4)
            run = p.add_run(value)
            set_run_font(run, "Calibri", 11)

        # Set column widths
        for row in details_table.rows:
            row.cells[0].width = Cm(3)
            row.cells[1].width = Cm(12)

        # Remove table borders for cleaner look
        for row in details_table.rows:
            for cell in row.cells:
                tc = cell._tc
                tcPr = tc.get_or_add_tcPr()
                borders = parse_xml(
                    f'<w:tcBorders {nsdecls("w")}>'
                    '  <w:top w:val="none" w:sz="0" w:space="0" w:color="auto"/>'
                    '  <w:left w:val="none" w:sz="0" w:space="0" w:color="auto"/>'
                    '  <w:bottom w:val="none" w:sz="0" w:space="0" w:color="auto"/>'
                    '  <w:right w:val="none" w:sz="0" w:space="0" w:color="auto"/>'
                    '</w:tcBorders>'
                )
                tcPr.append(borders)

        add_spacer(doc, 12)

        # ── Programma summary ──────────────────────────────────────────
        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(6)
        run = p.add_run("Programma (verkort)")
        set_run_font(run, "Calibri", 12, NAVY, bold=True)

        programma = [
            ("10:00", "Ontvangst met koffie en thee"),
            ("10:30", "Opening + overdrachtssymboliek"),
            ("11:00", "75 Jaar Lions Nederland — presentatie door IPDG Pieter Haex"),
            ("11:30", "Stichting Alzheimer Nederland — presentatie door GST Hans Luijcx"),
            ("12:00", "'Samen Verder Bouwen' — visie DG Jorick van Gemert"),
            ("12:30", "Gezamenlijke lunch"),
            ("13:30", "Buitenactiviteit / teambuilding op het strand"),
            ("15:30", "World Café — interactieve sessie"),
            ("16:30", "Borrel op het strand — afsluiting"),
        ]

        prog_table = doc.add_table(rows=len(programma), cols=2)
        prog_table.alignment = WD_TABLE_ALIGNMENT.LEFT
        for i, (tijd, desc) in enumerate(programma):
            cl = prog_table.cell(i, 0)
            cr = prog_table.cell(i, 1)

            p = cl.paragraphs[0]
            p.paragraph_format.space_before = Pt(1)
            p.paragraph_format.space_after = Pt(1)
            run = p.add_run(tijd)
            set_run_font(run, "Calibri", 10, NAVY, bold=True)

            p = cr.paragraphs[0]
            p.paragraph_format.space_before = Pt(1)
            p.paragraph_format.space_after = Pt(1)
            run = p.add_run(desc)
            set_run_font(run, "Calibri", 10)

            cl.width = Cm(2)
            cr.width = Cm(13)

        # Remove borders
        for row in prog_table.rows:
            for cell in row.cells:
                tc = cell._tc
                tcPr = tc.get_or_add_tcPr()
                borders = parse_xml(
                    f'<w:tcBorders {nsdecls("w")}>'
                    '  <w:top w:val="none" w:sz="0" w:space="0" w:color="auto"/>'
                    '  <w:left w:val="none" w:sz="0" w:space="0" w:color="auto"/>'
                    '  <w:bottom w:val="none" w:sz="0" w:space="0" w:color="auto"/>'
                    '  <w:right w:val="none" w:sz="0" w:space="0" w:color="auto"/>'
                    '</w:tcBorders>'
                )
                tcPr.append(borders)

        add_spacer(doc, 12)

        # ── RSVP ───────────────────────────────────────────────────────
        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(6)
        run = p.add_run("Bevestiging")
        set_run_font(run, "Calibri", 12, NAVY, bold=True)

        rsvp = (
            "Wij verzoeken u vriendelijk om uiterlijk 1 augustus 2026 een bevestiging te sturen "
            "naar secretaris Hans-Peter Visser via secretaris@lions110an.nl of per WhatsApp. "
            "Geef hierbij aan of u aanwezig bent en of u dieetwensen heeft."
        )
        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(16)
        run = p.add_run(rsvp)
        set_run_font(run, "Calibri", 11)

        # ── Afsluiting ─────────────────────────────────────────────────
        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(4)
        run = p.add_run("Wij kijken ernaar uit u te verwelkomen op deze bijzondere dag.")
        set_run_font(run, "Calibri", 11, italic=True)

        add_spacer(doc, 16)

        # Signature block
        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(2)
        run = p.add_run("Met Lions-groet,")
        set_run_font(run, "Calibri", 11, NAVY, bold=True)

        add_spacer(doc, 8)

        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(2)
        run = p.add_run("Jorick van Gemert")
        set_run_font(run, "Calibri", 12, NAVY, bold=True)

        p = doc.add_paragraph()
        p.paragraph_format.space_after = Pt(2)
        run = p.add_run("Districtsgouverneur 110AN")
        set_run_font(run, "Calibri", 11, NAVY)

        # ── Footer ─────────────────────────────────────────────────────
        add_spacer(doc, 24)
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run("www.lions110an.nl")
        set_run_font(run, "Calibri", 9, RGBColor(0x99, 0x99, 0x99))

        # Save
        doc.save(OUT_FILE)
        print(f"✅ Uitnodigingsbrief opgeslagen: {OUT_FILE}")
        return True

    except Exception as e:
        print(f"❌ Fout bij genereren uitnodigingsbrief: {e}")
        return False

if __name__ == "__main__":
    main()
