#!/usr/bin/python
import os
import sys
import time
import traceback
from calendar import timegm
from datetime import datetime, timedelta

import pytz
from requests import get

from hosted import config, node

config.restart_on_update()

SEND_PREFIX = os.environ["NODE"].replace("root/", "root/plugin/")


def log(msg):
    sys.stderr.write("[pretalx] {}\n".format(msg))


def idle(seconds, event_start, event_tz):
    end = time.time() + seconds
    log("sleeping for {} seconds".format(seconds))
    while time.time() < end:
        send_data = {"day": "??", "time": int(time.time())}
        if event_start is not None:
            event_now = datetime.now(event_tz)
            utc_now = datetime.now(pytz.utc)

            day_zero = event_tz.localize(
                event_start.replace(hour=0, minute=0, second=0)
            ) - timedelta(days=1)

            day_info = event_now - day_zero

            log("Day0: {}".format(day_zero.isoformat()))
            log("NOW:  {}".format(event_now.isoformat()))

            send_data["day"] = day_info.days

        for k, v in send_data.items():
            node.send_raw("{}/{}:{}".format(SEND_PREFIX, k, v))
        time.sleep(1)


def main():
    event_info = None
    event_start = None
    schedule = None
    event_tz = pytz.utc

    while True:
        schedule_url = config["schedule_url"]
        if "example.com" in schedule_url:
            log("default schedule url, waiting for config update")
            # sleep forever, service will get restarted if the config
            # changes.
            time.sleep(99999999)
        log("event url: {}".format(schedule_url))
        log("using json flavour: {}".format(config["json_flavour"]))

        if config["json_flavour"] == "pretalx-broadcast-tools":
            if not schedule_url.endswith("/"):
                schedule_url = schedule_url + "/"
            try:
                r = get(
                    schedule_url + "p/broadcast-tools/event.json",
                )
                r.raise_for_status()
            except Exception as e:
                log("updating event info failed: {}".format(repr(e)))
                # Only print the error message. If we have fetched the event
                # info json blob atleast once, we have all the information
                # we need.
            else:
                event_info = r.json()

            if event_info is not None:
                event_start = datetime.strptime(event_info["start"], "%Y-%m-%d")
                event_tz = pytz.timezone(event_info["timezone"])

            try:
                r = get(
                    schedule_url + "p/broadcast-tools/schedule.json",
                )
                r.raise_for_status()
            except Exception as e:
                log("updating schedule failed: {}".format(repr(e)))
                # Only print the error message. If we have fetched the schedule
                # info json blob atleast once, we have all the information
                # we need.
            else:
                schedule = r.json()
                for talk in schedule["talks"]:
                    talk["start_str"] = (
                        datetime.fromtimestamp(talk["start_ts"])
                        .replace(tzinfo=pytz.utc)
                        .astimezone(event_tz)
                        .strftime("%H:%M")
                    )
                node.write_json("schedule.json", schedule)
                log("updated schedule json")
        elif config["json_flavour"] == "voc-schema":
            try:
                r = get(schedule_url)
                r.raise_for_status()
            except Exception as e:
                log("getting schedule.json failed: {}".format(repr(e)))
            else:
                raw_schedule = r.json()["schedule"]
                schedule = {"talks": []}

                event_start = datetime.strptime(
                    raw_schedule["conference"]["start"][:10], "%Y-%m-%d"
                )
                event_tz = pytz.timezone(raw_schedule["conference"]["time_zone_name"])

                for day in raw_schedule["conference"]["days"]:
                    for room in day["rooms"].values():
                        for talk in room:
                            start = datetime.strptime(
                                talk["date"][:19], "%Y-%m-%dT%H:%M:%S"
                            ).replace(tzinfo=event_tz)
                            d_h, d_m = talk["duration"].split(":")
                            end = start + timedelta(hours=int(d_h), minutes=int(d_m))

                            talk["start_ts"] = timegm(start.timetuple())
                            talk["start_str"] = talk["start"]
                            talk["end_ts"] = timegm(end.timetuple())
                            talk["locale"] = talk["language"]

                            track = None
                            if talk["track"]:
                                for t in raw_schedule["conference"]["tracks"]:
                                    if t["name"] == talk["track"]:
                                        track = {
                                            "color": t["color"],
                                            "name": t["name"],
                                        }
                                        break
                            talk["track"] = track

                            persons = []
                            for p in talk["persons"]:
                                persons.append(p["public_name"])
                            talk["persons"] = persons

                            schedule["talks"].append(talk)
                node.write_json("schedule.json", schedule)
                log("updated schedule json")
        else:
            log("unknown json flavour, something is very wrong")

        idle(30, event_start, event_tz)


if __name__ == "__main__":
    try:
        main()
    except:
        traceback.print_exc()
        time.sleep(30)