#!/usr/bin/python3

import datetime
import os

import lxml.etree

from confarchive import database, model

DB_URL = "postgresql:///confarchive"
schedules_loc = "schedules"

database.init_db(DB_URL)

Element = lxml.etree._Element


def read_field(root: Element, field: str) -> str | None:
    """Get conference field."""
    value = root.findtext(".//" + field)
    if value is None:
        return None
    assert isinstance(value, str)
    return value


def process_schedule(filename: str, short_name: str) -> None:
    """Load conference schedule."""
    start = open(filename).read(15)
    if start == "BEGIN:VCALENDAR" or start.startswith("{"):
        return None

    conf = model.Conference.query.filter_by(short_name=short_name).one_or_none()

    if not conf:
        return

    print((conf.short_name, conf.title))

    root = lxml.etree.parse(filename).getroot()
    for day in root.findall(".//day"):
        day_index_str = day.get("index")
        # assert day_index_str is not None
        # day_index = int(day_index_str)
        print("day", day_index_str)
        for event_element in day.findall(".//event"):
            title = read_field(event_element, "title")
            start = read_field(event_element, "start")
            if len(start) == 4:
                start = "0" + start

            d = day.get("date")
            assert d and start

            dt = datetime.datetime.fromisoformat(d + " " + start)

            q = model.Event.query.filter_by(title=title, conference=conf)
            if q.count() != 1:
                continue

            event = q.one()
            event.event_date = dt
            event.abstract = read_field(event_element, "abstract")

            print(start, title)


for f in os.scandir(schedules_loc):
    if f.is_dir():
        continue
    print(f.name)
    process_schedule(f.path, f.name)
    # database.session.commit()