"""DataUpdateCoordinator for the Discovergy integration."""

from __future__ import annotations

from datetime import timedelta
import logging

from pydiscovergy import Discovergy
from pydiscovergy.error import DiscovergyClientError, HTTPError, InvalidLogin
from pydiscovergy.models import Meter, Reading

from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed

_LOGGER = logging.getLogger(__name__)


class DiscovergyUpdateCoordinator(DataUpdateCoordinator[Reading]):
    """The Discovergy update coordinator."""

    def __init__(
        self,
        hass: HomeAssistant,
        meter: Meter,
        discovergy_client: Discovergy,
    ) -> None:
        """Initialize the Discovergy coordinator."""
        self.meter = meter
        self.discovergy_client = discovergy_client

        super().__init__(
            hass,
            _LOGGER,
            name=f"Discovergy meter {meter.meter_id}",
            update_interval=timedelta(seconds=30),
        )

    async def _async_update_data(self) -> Reading:
        """Get last reading for meter."""
        try:
            return await self.discovergy_client.meter_last_reading(
                meter_id=self.meter.meter_id
            )
        except InvalidLogin as err:
            raise ConfigEntryAuthFailed(
                f"Auth expired while fetching last reading for meter {self.meter.meter_id}"
            ) from err
        except (HTTPError, DiscovergyClientError) as err:
            raise UpdateFailed(
                f"Error while fetching last reading for meter {self.meter.meter_id}"
            ) from err
