"""UptimeRobot sensor platform."""

from typing import override

from pyuptimerobot import UptimeRobotMonitor

from homeassistant.components.sensor import (
    SensorDeviceClass,
    SensorEntity,
    SensorEntityDescription,
)
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback

from .coordinator import UptimeRobotConfigEntry
from .entity import UptimeRobotEntity
from .utils import new_device_listener

# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0


async def async_setup_entry(
    hass: HomeAssistant,
    entry: UptimeRobotConfigEntry,
    async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
    """Set up the UptimeRobot sensors."""
    coordinator = entry.runtime_data

    def _add_new_entities(new_monitors: list[UptimeRobotMonitor]) -> None:
        """Add entities for new monitors."""
        entities = [
            UptimeRobotSensor(
                coordinator,
                SensorEntityDescription(
                    key=str(monitor.id),
                    entity_category=EntityCategory.DIAGNOSTIC,
                    device_class=SensorDeviceClass.ENUM,
                    options=[
                        "down",
                        "not_checked_yet",
                        "pause",
                        "seems_down",
                        "started",
                        "up",
                    ],
                    translation_key="monitor_status",
                ),
            )
            for monitor in new_monitors
        ]
        if entities:
            async_add_entities(entities)

    entry.async_on_unload(new_device_listener(coordinator, _add_new_entities))


class UptimeRobotSensor(UptimeRobotEntity, SensorEntity):
    """Representation of a UptimeRobot sensor."""

    @property
    @override
    def native_value(self) -> str | None:
        """Return the status of the monitor."""
        if not self._monitor.status:
            return None

        status = self._monitor.status.lower()
        # The API returns "paused"
        # but the entity state will be "pause" to avoid a breaking change
        return {"paused": "pause"}.get(status, status)
