"""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