"""Platform for sensor integration."""
from __future__ import annotations

from homeassistant.components.sensor import SensorEntity
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType

from .const import DOMAIN
from .hub import Device, Hub


async def async_setup_entry(
    hass: HomeAssistant,
    config: ConfigType,
    async_add_entities: AddEntitiesCallback,
    discovery_info: DiscoveryInfoType | None = None,
) -> None:
    """Set up the sensor platform."""

    hub: Hub = hass.data[DOMAIN]["hub"]

    for device in hub.devices.values():
        async_add_entities([RoomSensor(device)])


class RoomSensor(SensorEntity):
    """Representation of a Sensor."""

    def __init__(self, device: Device) -> None:
        """Initialize the sensor."""
        self._attr_name = f"{device.name} Room"
        self._attr_unique_id = f"{device.id}_room"
        self._device = device
        self._attr_should_poll = False

    @property
    def device_info(self):
        return {
            "identifiers": {(DOMAIN, self._device.id)},
        }

    @property
    def state(self):
        return self._device.room

    @property
    def available(self):
        return True

    async def async_added_to_hass(self):
        """Run when this Entity has been added to HA."""
        # Sensors should also register callbacks to HA when their state changes
        self._device.add_callback(self.async_write_ha_state)

    async def async_will_remove_from_hass(self):
        """Entity being removed from hass."""
        # The opposite of async_added_to_hass. Remove any registered call backs here.
        self._device.remove_callback(self.async_write_ha_state)
