"""Calendar."""

import typing
from datetime import timedelta

from .event import Event

event_type_color_map = {
    "bank_holiday": "success-subtle",
    "conference": "primary-subtle",
    "us_holiday": "secondary-subtle",
    "birthday": "info-subtle",
    "waste_schedule": "danger-subtle",
}

colors = {
    "primary-subtle": "#cfe2ff",
    "secondary-subtle": "#e2e3e5",
    "success-subtle": "#d1e7dd",
    "info-subtle": "#cff4fc",
    "warning-subtle": "#fff3cd",
    "danger-subtle": "#f8d7da",
}


def build_events(events: list[Event]) -> list[dict[str, typing.Any]]:
    """Build list of events for FullCalendar."""
    items: list[dict[str, typing.Any]] = []

    one_day = timedelta(days=1)

    for e in events:
        if e.name == "today":
            continue
        if e.name == "accommodation":
            assert e.title and e.end_date
            item = {
                "allDay": True,
                "title": e.title_with_emoji,
                "start": e.as_date.isoformat(),
                "end": (e.end_as_date + one_day).isoformat(),
                "url": e.url,
            }
            items.append(item)

            item = {
                "allDay": False,
                "title": "checkin: " + e.title,
                "start": e.date.isoformat(),
                "url": e.url,
            }
            items.append(item)
            item = {
                "allDay": False,
                "title": "checkout: " + e.title,
                "start": e.end_date.isoformat(),
                "url": e.url,
            }
            items.append(item)

            continue

        if e.has_time:
            end = e.end_date or e.date + timedelta(minutes=30)
        else:
            end = (e.end_as_date if e.end_date else e.as_date) + one_day
        item = {
            "allDay": not e.has_time,
            "title": e.title_with_emoji,
            "start": e.date.isoformat(),
            "end": end.isoformat(),
        }
        if e.name in event_type_color_map:
            item["color"] = colors[event_type_color_map[e.name]]
            item["textColor"] = "black"
        if e.url:
            item["url"] = e.url
        items.append(item)
    return items