"""Calendar platform support for Waste Collection Schedule."""

import logging
from datetime import timedelta

from homeassistant.components.calendar import CalendarEventDevice

_LOGGER = logging.getLogger(__name__)


async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
    """Set up calendar platform."""
    # We only want this platform to be set up via discovery.
    if discovery_info is None:
        return

    entities = []

    api = discovery_info["api"]

    for scraper in api.scrapers:
        entities.append(WasteCollectionCalendar(api, scraper))

    async_add_entities(entities)


class WasteCollectionCalendar(CalendarEventDevice):
    """Calendar entity class."""

    def __init__(self, api, scraper):
        self._api = api
        self._scraper = scraper

    @property
    def name(self):
        """Return entity name."""
        return self._scraper.calendar_title

    @property
    def event(self):
        """Return next collection event."""
        collections = self._scraper.get_upcoming(count=1, include_today=True)
        if len(collections) == 0:
            return None
        else:
            return self._convert(collections[0])

    async def async_get_events(self, hass, start_date, end_date):
        """Return all events within specified time span."""
        collections = []
        for a in self._scraper.get_upcoming(include_today=True):
            if a.date >= start_date.date() and a.date <= end_date.date():
                collections.append(self._convert(a))
        return collections

    def _convert(self, collection):
        """Convert an collection into a Home Assistant calendar event."""
        return {
            "uid": f"self._scraper.calendar_title-{collection.date.isoformat()}-{collection.type}",
            "summary": collection.type,
            "start": {"date": collection.date.isoformat()},
            "end": {"date": (collection.date + timedelta(days=1)).isoformat()},
            "allDay": True,
        }
