import datetime
import eventgenutils as utils

#################################################
# set true if you want to generate files for that event type
#################################################
OPENSPACE = False
# every wednesday 19:00 to 23:59:59 but not between (and including) 24.12 and 1.1
REINIGUNG = False
# wednesday from 09:00 to 18:00
PLENUM = False
# second thursday of the month, except in november, where it is the third
OSM = False
# vierter donnerstag in ungeraden monaten
SWK = False
# manchmal am 1. Donnerstag. Aber oft auch nicht.
BITSUNDBAEUME = True
# jeden zweiten Dienstag im Monat um 18:31...
FFHLORGA = False
# jeden dritten Donnerstag im Monat 19:00 bis 22:00 Uhr
NOOK = False
# zweiter freitag im November (und der darauf folgende Samstag)
FUENF_MIN_TERMINE = False
# Üblicherweise Zweiter Mittwoch im ersten Monat des Quartals
SOMMERFEST = False
# Üblicherweise der erste Samstag nach dem 10 Mai. 15:00 bis 23:59
TAG_DES_OFFENEN_HACKSPACES = False
# https://wiki.hackerspaces.org/International_Open_Hackerspace_Day
# The International Open Hackerspace Day is happening every last Saturday of March.
MOINC3 = False
# Congress.
MAUS_TUEROEFFNER_TAG = False
# Der Maus Türöffner Tag ist immer am Tag der Deutschen Einheit
GETTING_SPACE_CLEAN = False
# Erster Montag des Monats, außer das ist der 01.01 oder 01.05, dann der zweite Montag dieser Monate

#################################################
# Year to create events for
#################################################
YEAR = 2024  # Change to generate for another year


def is_open_space(_date_candidate):
    _md = _date_candidate.day
    _mo = _date_candidate.month
    if utils.is_january(_date_candidate) and _md == 1:
        return False
    if utils.is_december(_date_candidate) and _md > 23:
        return False
    if not utils.is_wednesday(_date_candidate):
        return False
    return True


def is_plenum(_date_candidate):
    if not utils.is_november(_date_candidate) and utils.is_nth_thursday_of_month(_date_candidate, 2):
        return True
    if utils.is_november(_date_candidate) and utils.is_nth_thursday_of_month(_date_candidate, 3):
        return True
    return False


def is_reinigung(_date_candidate):
    if utils.is_wednesday(_date_candidate):
        return True
    return False


def is_osm(_date_candidate):
    if utils.is_equal_month(_date_candidate) and utils.is_nth_thursday_of_month(_date_candidate, 4):
        return True
    return False


def is_bits_und_baeume(_date_candidate):
    if utils.is_nth_tuesday_of_month(_date_candidate, 2):
        return True
    return False


def is_ffhl(_date_candidate):
    if utils.is_nth_thursday_of_month(_date_candidate, 3):
        return True
    return False


def is_nook(_date_candidate):
    return utils.is_november(_date_candidate) and utils.is_nth_friday_of_month(_date_candidate, 2)


def is_fuenf_min(_date_candidate):
    if utils.is_april(_date_candidate) or utils.is_july(_date_candidate) or utils.is_october(_date_candidate):
        if utils.is_nth_wednesday_of_month(_date_candidate, 2):
            return True
    return False


def is_sommerfest(_date_candidate):
    return utils.first_saturday_after_may_10th(_date_candidate)


def is_tag_des_offenen_hackspaces(_date_candidate):
    return utils.last_saturday_in_march(_date_candidate)


def is_moin_c3(_date_candidate):
    _md = _date_candidate.day
    return utils.is_december(_date_candidate) and _md == 27


def is_maus_tueroeffner_tag(_date_candidate):
    _md = _date_candidate.day
    return utils.is_october(_date_candidate) and _md == 3


def is_getting_space_clean(_date_candidate):
    return utils.is_first_monday_of_month_except_january_an_may_if_monday_is_first(_date_candidate)


def create_open_space(_date):
    utils.create_event("openspace", _date, start_hour=19)


def create_plenum(_date):
    utils.create_event("plenum", _date, start_hour=19, end_hour=20, end_minute=00)


def create_reinigung(_date):
    utils.create_event("reinigung", _date, start_hour=9, end_hour=18, end_minute=00)


def create_osm(_date):
    utils.create_event("osm", _date, start_hour=19, end_hour=22, end_minute=00)


def create_bits_und_baeume(_date):
    utils.create_event("bitsundbaeume-treffen", _date, start_hour=18, start_minute=31, end_hour=22, end_minute=00)


def create_ffhl(_date):
    utils.create_event("ffhl-orga", _date, start_hour=18, end_hour=22, end_minute=00)


def create_nook(_date):
    utils.create_event("nook", _date, start_hour=17, end_hour=22, add_days=1)


def create_fuenf_min(_date):
    utils.create_event("5min", _date, start_hour=20, end_hour=21)


def create_sommerfest(_date):
    utils.create_event("sommerfest", _date, start_hour=15)


def create_tag_des_offenen_hackspaces(_date):
    utils.create_event("tagderoffenenhackspaces", _date, start_hour=15, end_hour=20, end_minute=00)


def create_moin_c3(_date):
    utils.create_event("moinc3", _date, add_days=3)


def create_getting_space_clean(_date):
    utils.create_event("getting-space-clean", _date, start_hour=18, start_minute=30, end_hour=20, end_minute=00)


def create_maus_tueroeffner_tag(_date):
    utils.create_event("maus", _date, start_hour=14, end_hour=19, end_minute=00)


date_to_check = datetime.datetime.strptime(str(YEAR) + "-01-01", utils.date_format)
while date_to_check <= datetime.datetime.strptime(str(YEAR) + "-12-31", utils.date_format):
    if OPENSPACE:
        result = is_open_space(date_to_check)
        if result:
            create_open_space(date_to_check)
    if PLENUM:
        result = is_plenum(date_to_check)
        if result:
            create_plenum(date_to_check)
    if REINIGUNG:
        result = is_reinigung(date_to_check)
        if result:
            create_reinigung(date_to_check)
    if OSM:
        result = is_osm(date_to_check)
        if result:
            create_osm(date_to_check)
    if BITSUNDBAEUME:
        result = is_bits_und_baeume(date_to_check)
        if result:
            create_bits_und_baeume(date_to_check)
    if FFHLORGA:
        result = is_ffhl(date_to_check)
        if result:
            create_ffhl(date_to_check)
    if NOOK:
        result = is_nook(date_to_check)
        if result:
            create_nook(date_to_check)
    if FUENF_MIN_TERMINE:
        result = is_fuenf_min(date_to_check)
        if result:
            create_fuenf_min(date_to_check)
    if SOMMERFEST:
        result = is_sommerfest(date_to_check)
        if result:
            create_sommerfest(date_to_check)
    if TAG_DES_OFFENEN_HACKSPACES:
        result = is_tag_des_offenen_hackspaces(date_to_check)
        if result:
            create_tag_des_offenen_hackspaces(date_to_check)
    if MOINC3:
        result = is_moin_c3(date_to_check)
        if result:
            create_moin_c3(date_to_check)
    if MAUS_TUEROEFFNER_TAG:
        result = is_maus_tueroeffner_tag(date_to_check)
        if result:
            create_maus_tueroeffner_tag(date_to_check)
    if GETTING_SPACE_CLEAN:
        result = is_getting_space_clean(date_to_check)
        if result:
            create_getting_space_clean(date_to_check)

    date_to_check += datetime.timedelta(days=1)