from homeassistant.components.sensor import (
    SensorDeviceClass,
    SensorEntity,
    SensorStateClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
    PERCENTAGE,
    UnitOfElectricPotential,
    UnitOfPower,
    UnitOfTemperature,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from .const import DOMAIN
from .coordinator import SmS4IoTCoordinator

_SENSOR_DESCRIPTIONS = [
    {
        "key": "temperature",
        "name": "Temperature",
        "device_class": SensorDeviceClass.TEMPERATURE,
        "state_class": SensorStateClass.MEASUREMENT,
        "unit": UnitOfTemperature.CELSIUS,
        "icon": "mdi:thermometer",
    },
    {
        "key": "humidity",
        "name": "Humidity",
        "device_class": SensorDeviceClass.HUMIDITY,
        "state_class": SensorStateClass.MEASUREMENT,
        "unit": PERCENTAGE,
        "icon": "mdi:water-percent",
    },
    {
        "key": "uptime",
        "name": "Uptime",
        "device_class": None,
        "state_class": None,
        "unit": None,
        "icon": "mdi:timer-outline",
    },
    {
        "key": "power",
        "name": "Power",
        "device_class": SensorDeviceClass.POWER,
        "state_class": SensorStateClass.MEASUREMENT,
        "unit": UnitOfPower.WATT,
        "icon": "mdi:lightning-bolt",
    },
    {
        "key": "voltage",
        "name": "Voltage",
        "device_class": SensorDeviceClass.VOLTAGE,
        "state_class": SensorStateClass.MEASUREMENT,
        "unit": UnitOfElectricPotential.VOLT,
        "icon": "mdi:sine-wave",
    },
    {
        "key": "wifi",
        "name": "WiFi SSID",
        "device_class": None,
        "state_class": None,
        "unit": None,
        "icon": "mdi:wifi",
    },
    {
        "key": "adc",
        "name": "adc",
        "device_class": SensorDeviceClass.VOLTAGE,
        "state_class": SensorStateClass.MEASUREMENT,
        "unit": UnitOfElectricPotential.VOLT,
        "icon": "mdi:sine-wave",
    },
    {
        "key": "devname",
        "name": "devname",
        "device_class": None,
        "state_class": None,
        "unit": None,
        "icon": None,
    },
    {
        "key": "version",
        "name": "version",
        "device_class": None,
        "state_class": None,
        "unit": None,
        "icon": None,
    },    
    {
        "key": "lastseen",
        "name": "lastseen",
        "device_class": None,
        "state_class": None,
        "unit": None,
        "icon": "mdi:timer-outline",
    },
]


async def async_setup_entry(
    hass: HomeAssistant,
    entry: ConfigEntry,
    async_add_entities: AddEntitiesCallback,
) -> None:
    coordinator: SmS4IoTCoordinator = hass.data[DOMAIN][entry.entry_id]
    async_add_entities(
        SmS4IoTSensor(coordinator, entry, desc) for desc in _SENSOR_DESCRIPTIONS
    )


class SmS4IoTSensor(CoordinatorEntity, SensorEntity):
    def __init__(
        self,
        coordinator: SmS4IoTCoordinator,
        entry: ConfigEntry,
        description: dict,
    ) -> None:
        super().__init__(coordinator)
        self._desc = description
        device_id = entry.data["device_id"]
        self._attr_unique_id = f"{device_id}_{description['key']}"
        self._attr_name = f"SMS4IoT {device_id} {description['name']}"
        self._attr_device_class = description["device_class"]
        self._attr_state_class = description["state_class"]
        self._attr_native_unit_of_measurement = description["unit"]
        self._attr_icon = description["icon"]
        self._attr_device_info = {
            "identifiers": {(DOMAIN, device_id)},
            "name": f"SMS4IoT {device_id}",
            "manufacturer": "SMS4IoT",
        }

    @property
    def native_value(self):
        if not self.coordinator.data:
            return None
        raw = self.coordinator.data.get(self._desc["key"])
        if raw is None:
            return None
        if self._desc["unit"] in (
            UnitOfTemperature.CELSIUS,
            PERCENTAGE,
            UnitOfPower.WATT,
            UnitOfElectricPotential.VOLT,
        ):
            try:
                return float(raw)
            except ValueError:
                return raw
        if self._desc["key"] == "uptime":
            try:
                return int(raw)
            except ValueError:
                return raw
        return raw
