#!/usr/bin/env python3
# ============================================================
# Autor: kamowski & AI
# Názov: meniny pre XFCE panel
# Popis: V paneli pomocou doplnku xfce4-genmon-plugin (Všeobecné sledovanie) zobrazuje meniny.
# Inštalácia: Vytvor adresár ~/.local/share/meniny a doň ulož *.ics s meninami. Tam ho bude hľadať tento skript!
# ics som stiahol z https://peterfromslovakia.github.io/meniny-kalendar/
# Verzia: 09.11.2026–12:35
# Spúšťanie: Po inštalácii a pridaní doplnku zadaj doň ako príkaz: cesta k tomuto skriptu/meniny.py
# ============================================================
from datetime import date, datetime
from pathlib import Path
import re
import sys

ICS_FILE = Path.home() / ".local/share/meniny/meniny.ics"


def unescape_ics(value):
    return (
        value.replace(r"\n", " ")
             .replace(r"\N", " ")
             .replace(r"\,", ",")
             .replace(r"\;", ";")
             .replace(r"\\", "\\")
    )


def parse_date(value):
    # Celodenný dátum: YYYYMMDD
    match = re.match(r"^(\d{4})(\d{2})(\d{2})", value)
    if match:
        return date(*(int(part) for part in match.groups()))

    # Dátum a čas, napríklad 20260102T090000Z
    match = re.match(r"^(\d{4})(\d{2})(\d{2})T", value)
    if match:
        return date(*(int(part) for part in match.groups()))

    return None


def main():
    if not ICS_FILE.is_file():
        print("Chýba meniny.ics")
        return

    lines = ICS_FILE.read_text(encoding="utf-8-sig").splitlines()

    # Spoj zalomené riadky podľa formátu ICS.
    unfolded = []
    for line in lines:
        if line.startswith((" ", "\t")) and unfolded:
            unfolded[-1] += line[1:]
        else:
            unfolded.append(line)

    today = date.today()
    names = []
    event = None

    for line in unfolded:
        if line.upper() == "BEGIN:VEVENT":
            event = []
        elif line.upper() == "END:VEVENT" and event is not None:
            start_line = next(
                (x for x in event if x.upper().startswith("DTSTART")),
                None,
            )
            summary_line = next(
                (x for x in event if x.upper().startswith("SUMMARY")),
                None,
            )

            if start_line and summary_line and ":" in start_line and ":" in summary_line:
                start_value = start_line.split(":", 1)[1]
                summary = unescape_ics(summary_line.split(":", 1)[1])
                event_date = parse_date(start_value)

                if event_date == today:
                    names.append(summary)

            event = None
        elif event is not None:
            event.append(line)

    print(", ".join(names) if names else "Dnes meniny v ICS nie sú")


if __name__ == "__main__":
    try:
        main()
    except (OSError, UnicodeError, ValueError) as error:
        print(f"Chyba pri čítaní kalendára: {error}", file=sys.stderr)
        print("Meniny: chyba")
