#!/usr/bin/env python3

# feiertage_at.py
# 2024-06-16
# by Gernot Walzl

# Generate an iCalendar (*.ics) file of public holidays in Austria
# https://de.wikipedia.org/wiki/Feiertage_in_%C3%96sterreich
# https://datatracker.ietf.org/doc/html/rfc5545

import argparse
from datetime import date, datetime, timedelta, timezone
from dateutil.easter import easter
from os.path import getmtime


def public_holidays_at(year):
    return [
        (date(year, 1, 1), "Neujahr", "Österreich",
         "https://de.wikipedia.org/wiki/Neujahr"),
        (date(year, 1, 6), "Heilige Drei Könige", "Österreich",
         "https://de.wikipedia.org/wiki/Heilige_Drei_K%C3%B6nige"),
        (date(year, 3, 19), "Josef", "Kärnten, Steiermark, Tirol, Vorarlberg",
         "https://de.wikipedia.org/wiki/Josefstag"),
        (easter(year)+timedelta(days=1), "Ostermontag", "Österreich",
         "https://de.wikipedia.org/wiki/Ostern"),
        (date(year, 5, 1), "Staatsfeiertag", "Österreich",
         "https://de.wikipedia.org/wiki/Staatsfeiertag_(%C3%96sterreich)"),
        (date(year, 5, 4), "Florian", "Oberösterreich",
         "https://de.wikipedia.org/wiki/Florian_von_Lorch"),
        (easter(year)+timedelta(days=39), "Christi Himmelfahrt", "Österreich",
         "https://de.wikipedia.org/wiki/Christi_Himmelfahrt"),
        (easter(year)+timedelta(days=50), "Pfingstmontag", "Österreich",
         "https://de.wikipedia.org/wiki/Pfingsten"),
        (easter(year)+timedelta(days=60), "Fronleichnam", "Österreich",
         "https://de.wikipedia.org/wiki/Fronleichnam"),
        (date(year, 8, 15), "Mariä Himmelfahrt", "Österreich",
         "https://de.wikipedia.org/wiki/Mari%C3%A4_Aufnahme_in_den_Himmel"),
        (date(year, 9, 24), "Rupert", "Salzburg",
         "https://de.wikipedia.org/wiki/Rupert_von_Salzburg"),
        (date(year, 10, 10), "Tag der Volksabstimmung", "Kärnten",
         "https://de.wikipedia.org/wiki/Volksabstimmung_1920_in_K%C3%A4rnten"),
        (date(year, 10, 26), "Nationalfeiertag", "Österreich",
         "https://de.wikipedia.org/wiki/Nationalfeiertag_(%C3%96sterreich)"),
        (date(year, 11, 1), "Allerheiligen", "Österreich",
         "https://de.wikipedia.org/wiki/Allerheiligen"),
        (date(year, 11, 11), "Martin", "Burgenland",
         "https://de.wikipedia.org/wiki/Martin_von_Tours"),
        (date(year, 11, 15), "Leopold", "Niederösterreich, Wien",
         "https://de.wikipedia.org/wiki/Leopold_III._(%C3%96sterreich)"),
        (date(year, 12, 8), "Mariä Empfängnis", "Österreich",
         "https://de.wikipedia.org/wiki/Mari%C3%A4_Empf%C3%A4ngnis"),
        (date(year, 12, 24), "Heiliger Abend", "Österreich",
         "https://de.wikipedia.org/wiki/Weihnachten"),
        (date(year, 12, 25), "Christtag", "Österreich",
         "https://de.wikipedia.org/wiki/Weihnachten"),
        (date(year, 12, 26), "Stefanitag", "Österreich",
         "https://de.wikipedia.org/wiki/Stefanitag"),
        (date(year, 12, 31), "Silvester", "Österreich",
         "https://de.wikipedia.org/wiki/Silvester")
    ]


def print_vevent(dtstart, summary, location, description):
    print("BEGIN:VEVENT")
    print("UID:"+dtstart.strftime('%Y%m%d')+"@feiertage-at")
    dtstamp = datetime.fromtimestamp(getmtime(__file__), timezone.utc)
    print("DTSTAMP:"+dtstamp.strftime('%Y%m%dT%H%M%SZ'))
    print("DTSTART;VALUE=DATE:"+dtstart.strftime('%Y%m%d'))
    print("DTEND;VALUE=DATE:"+(dtstart+timedelta(days=1)).strftime('%Y%m%d'))
    print("SUMMARY:"+summary)
    print("LOCATION:"+location)
    print("DESCRIPTION:"+description)
    print("END:VEVENT")


def main(year):
    print("BEGIN:VCALENDAR")
    print("VERSION:2.0")
    print("PRODID:-//")
    print("CALSCALE:GREGORIAN")
    for holiday in public_holidays_at(args.year):
        print_vevent(holiday[0], holiday[1], holiday[2], holiday[3])
    print("END:VCALENDAR")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("year", type=int, choices=range(2000, 2200))
    args = parser.parse_args()
    main(args.year)