#!/usr/bin/env python3
# Someone's Mattermost scripts.
#   Copyright (c) 2016-2020 by Someone <someone@somenet.org> (aka. Jan Vales <jan@jvales.net>)
#   published under MIT-License
#
# Send event-reminders to configured channels.
#

import datetime
import pytz
import pprint
import time
import traceback

import icalendar
import requests
import mattermost

import config

def process_ics(mm, now, alias, ics_config):
    c = icalendar.Calendar.from_ical(requests.get(ics_config[0]).text)
    for ev in c.subcomponents:
        if isinstance(ev,icalendar.cal.Event):
            spam_mm = False
            for remind in ev.subcomponents:
                if isinstance(ev.get("DTSTART").dt,datetime.datetime):
                    event_datetime = ev.get("DTSTART").dt
                    alarm_datetime = ev.get("DTSTART").dt+remind.get("TRIGGER").dt

                    # convert to now's tz
                    event_datetime = (event_datetime-datetime.datetime.utcoffset(event_datetime)+datetime.datetime.utcoffset(now)).replace(second=0, tzinfo=now.tzinfo)
                    alarm_datetime = (alarm_datetime-datetime.datetime.utcoffset(alarm_datetime)+datetime.datetime.utcoffset(now)).replace(second=0, tzinfo=now.tzinfo)

                else:
                    # why the diffrent handling of "full-day" events?!
                    event_datetime = datetime.datetime.combine(ev.get("DTSTART").dt, datetime.datetime.min.time()).replace(second=0, tzinfo=now.tzinfo)
                    alarm_datetime = (datetime.datetime.combine(ev.get("DTSTART").dt, datetime.datetime.min.time())+remind.get("TRIGGER").dt).replace(second=0, tzinfo=now.tzinfo)

                seconds_to_reminder_time = (now-alarm_datetime).total_seconds()

                if seconds_to_reminder_time >= 0 and seconds_to_reminder_time < 300:
                    spam_mm = True

            if spam_mm:
                for channel_id in ics_config[1]:
                    pprint.pprint(mm.create_post(channel_id, "``BOT-AUTODELETE-FAST`` #termin_reminder Datasource: "+alias+"\nUpcoming event at: **``"+str(event_datetime)+"``**\n### ``"+str(ev.get("SUMMARY"))+"``\n"+str(ev.get("DESCRIPTION"))))



mm = mattermost.MMApi(config.mm_api_url)
mm.login(config.mm_user, config.mm_user_pw)

TS_START = time.time()
now = datetime.datetime.now(tz=pytz.timezone("Europe/Vienna")).replace(second=0, microsecond=0)

for alias, ics_config in config.ics_config.items():
    try:
        process_ics(mm, now, alias, ics_config)
    except:
        traceback.print_exc()
    print("* ["+("%07.6g"%round(time.time() - TS_START, 5))+"] COMPLETED: "+alias)

mm.logout()
