"""Provide ICalendarParser class."""

from datetime import datetime
from typing import Optional

from .filter import Filter
from .parserevent import ParserEvent


class ICalendarParser:
    """Provide interface for various parser classes."""

    def set_content(self, content: str):
        """Parse content into a calendar object.

        This must be called at least once before get_event_list or
        get_current_event.
        :param content is the calendar data
        :type content str
        """

    def set_filter(self, filt: Filter):
        """Set a Filter object to filter events.

        :param filt: The Filter object
        :type exclude: Filter
        """

    def get_event_list(
        self,
        start: datetime,
        end: datetime,
        include_all_day: bool,
        offset_hours: int = 0,
    ) -> list[ParserEvent]:
        """Get a list of events.

        Gets the events from start to end, including or excluding all day
        events.
        :param start the earliest start time of events to return
        :type start datetime
        :param end the latest start time of events to return
        :type end datetime
        :param include_all_day if true, all day events will be included.
        :type include_all_day boolean
        :param offset_hours the number of hours to offset the event
        :type offset_hours int
        :returns a list of events, or an empty list
        :rtype list[ParserEvent]
        """

    def get_current_event(
        self,
        include_all_day: bool,
        now: datetime,
        days: int,
        offset_hours: int = 0,
    ) -> Optional[ParserEvent]:
        """Get the current or next event.

        Gets the current event, or the next upcoming event with in the
        specified number of days, if there is no current event.
        :param include_all_day if true, all day events will be included.
        :type include_all_day boolean
        :param now the current date and time
        :type now datetime
        :param days the number of days to check for an upcoming event
        :type days int
        :param offset_hours the number of hours to offset the event
        :type offset_hours int
        :returns a ParserEvent or None
        """
