"""Support for the Philips Hue sensor devices."""
from homeassistant.helpers import entity

from .const import DOMAIN as HUE_DOMAIN


class GenericHueDevice(entity.Entity):
    """Representation of a Hue device."""

    def __init__(self, sensor, name, bridge, primary_sensor=None):
        """Initialize the sensor."""
        self.sensor = sensor
        self._name = name
        self._primary_sensor = primary_sensor
        self.bridge = bridge

    @property
    def primary_sensor(self):
        """Return the primary sensor entity of the physical device."""
        return self._primary_sensor or self.sensor

    @property
    def device_id(self):
        """Return the ID of the physical device this sensor is part of."""
        return self.unique_id[:23]

    @property
    def unique_id(self):
        """Return the ID of this Hue sensor."""
        return self.sensor.uniqueid

    @property
    def name(self):
        """Return a friendly name for the sensor."""
        return self._name

    @property
    def swupdatestate(self):
        """Return detail of available software updates for this device."""
        return self.primary_sensor.raw.get("swupdate", {}).get("state")

    @property
    def device_info(self) -> entity.DeviceInfo:
        """Return the device info.

        Links individual entities together in the hass device registry.
        """
        return entity.DeviceInfo(
            identifiers={(HUE_DOMAIN, self.device_id)},
            manufacturer=self.primary_sensor.manufacturername,
            model=(self.primary_sensor.productname or self.primary_sensor.modelid),
            name=self.primary_sensor.name,
            sw_version=self.primary_sensor.swversion,
            via_device=(HUE_DOMAIN, self.bridge.api.config.bridgeid),
        )

    async def async_added_to_hass(self) -> None:
        """Handle entity being added to Home Assistant."""
        self.async_on_remove(
            self.bridge.listen_updates(
                self.sensor.ITEM_TYPE, self.sensor.id, self.async_write_ha_state
            )
        )
        await super().async_added_to_hass()