"""Types."""

import dataclasses
import datetime


@dataclasses.dataclass
class Event:
    """Event."""

    name: str
    date: datetime.date | datetime.datetime
    end_date: datetime.date | datetime.datetime | None = None
    title: str | None = None
    url: str | None = None

    @property
    def as_datetime(self) -> datetime.datetime:
        """Date/time of event."""
        d = self.date
        t0 = datetime.datetime.min.time()
        return (
            d
            if isinstance(d, datetime.datetime)
            else datetime.datetime.combine(d, t0).replace(tzinfo=datetime.timezone.utc)
        )

    @property
    def has_time(self) -> bool:
        """Event has a time associated with it."""
        return isinstance(self.date, datetime.datetime)

    @property
    def as_date(self) -> datetime.date:
        """Date of event."""
        return (
            self.date.date() if isinstance(self.date, datetime.datetime) else self.date
        )

    @property
    def end_as_date(self) -> datetime.date:
        """Date of event."""
        assert self.end_date
        return (
            self.end_date.date()
            if isinstance(self.end_date, datetime.datetime)
            else self.end_date
        )

    @property
    def display_time(self) -> str | None:
        """Time for display on web page."""
        return (
            self.date.strftime("%H:%M")
            if isinstance(self.date, datetime.datetime)
            else None
        )

    @property
    def display_timezone(self) -> str | None:
        """Timezone for display on web page."""
        return (
            self.date.strftime("%z")
            if isinstance(self.date, datetime.datetime)
            else None
        )

    def delta_days(self, today: datetime.date) -> str:
        """Return number of days from today as a string."""
        delta = (self.as_date - today).days

        match delta:
            case 0:
                return "today"
            case 1:
                return "1 day"
            case _:
                return f"{delta:,d} days"

    @property
    def display_date(self) -> str:
        """Date for display on web page."""
        if isinstance(self.date, datetime.datetime):
            return self.date.strftime("%a, %d, %b %Y %H:%M %z")
        else:
            return self.date.strftime("%a, %d, %b %Y")

    @property
    def display_title(self) -> str:
        """Name for display."""
        return self.title or self.name