"""Support for the AEMET OpenData images."""

from typing import Final, override

from aemet_opendata.const import AOD_DATETIME, AOD_IMG_BYTES, AOD_IMG_TYPE, AOD_RADAR
from aemet_opendata.helpers import dict_nested_value

from homeassistant.components.image import Image, ImageEntity, ImageEntityDescription
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback

from .coordinator import AemetConfigEntry, WeatherUpdateCoordinator
from .entity import AemetEntity

AEMET_IMAGES: Final[tuple[ImageEntityDescription, ...]] = (
    ImageEntityDescription(
        key=AOD_RADAR,
        translation_key="weather_radar",
    ),
)


async def async_setup_entry(
    hass: HomeAssistant,
    config_entry: AemetConfigEntry,
    async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
    """Set up AEMET OpenData image entities based on a config entry."""
    domain_data = config_entry.runtime_data
    name = domain_data.name
    coordinator = domain_data.coordinator

    unique_id = config_entry.unique_id
    assert unique_id is not None

    async_add_entities(
        AemetImage(
            hass,
            name,
            coordinator,
            description,
            unique_id,
        )
        for description in AEMET_IMAGES
        if dict_nested_value(coordinator.data["lib"], [description.key]) is not None
    )


class AemetImage(AemetEntity, ImageEntity):
    """Implementation of an AEMET OpenData image."""

    entity_description: ImageEntityDescription

    def __init__(
        self,
        hass: HomeAssistant,
        name: str,
        coordinator: WeatherUpdateCoordinator,
        description: ImageEntityDescription,
        unique_id: str,
    ) -> None:
        """Initialize the image."""
        super().__init__(coordinator, name, unique_id)
        ImageEntity.__init__(self, hass)
        self.entity_description = description
        self._attr_unique_id = f"{unique_id}-{description.key}"

        self._async_update_attrs()

    @callback
    @override
    def _handle_coordinator_update(self) -> None:
        """Update attributes when the coordinator updates."""
        self._async_update_attrs()
        super()._handle_coordinator_update()

    @callback
    def _async_update_attrs(self) -> None:
        """Update image attributes."""
        image_data = self.get_aemet_value([self.entity_description.key])
        self._cached_image = Image(
            content_type=image_data.get(AOD_IMG_TYPE),
            content=image_data.get(AOD_IMG_BYTES),
        )
        self._attr_image_last_updated = image_data.get(AOD_DATETIME)
