"""Number platform for LED Screen Controller (device & KC target brightness)."""
from __future__ import annotations

import logging
from typing import Any

from homeassistant.components.number import NumberEntity, NumberMode
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from .const import DOMAIN, DATA_COORDINATOR, TARGET_TYPE_KEY_COLORS
from .coordinator import WLEDScreenControllerCoordinator

_LOGGER = logging.getLogger(__name__)


async def async_setup_entry(
    hass: HomeAssistant,
    entry: ConfigEntry,
    async_add_entities: AddEntitiesCallback,
) -> None:
    """Set up LED Screen Controller brightness numbers."""
    data = hass.data[DOMAIN][entry.entry_id]
    coordinator: WLEDScreenControllerCoordinator = data[DATA_COORDINATOR]

    entities = []
    if coordinator.data and "targets" in coordinator.data:
        devices = coordinator.data.get("devices") or {}

        for target_id, target_data in coordinator.data["targets"].items():
            info = target_data["info"]

            if info.get("target_type") == TARGET_TYPE_KEY_COLORS:
                # KC target — brightness lives in key_colors_settings
                entities.append(
                    WLEDScreenControllerKCBrightness(
                        coordinator, target_id, entry.entry_id,
                    )
                )
                continue

            # LED target — brightness lives on the device
            device_id = info.get("device_id", "")
            if not device_id:
                continue

            device_data = devices.get(device_id)
            if not device_data:
                continue

            capabilities = device_data.get("info", {}).get("capabilities") or []
            if "brightness_control" not in capabilities or "static_color" in capabilities:
                continue

            entities.append(
                WLEDScreenControllerBrightness(
                    coordinator, target_id, device_id, entry.entry_id,
                )
            )

    async_add_entities(entities)


class WLEDScreenControllerBrightness(CoordinatorEntity, NumberEntity):
    """Brightness control for an LED device associated with a target."""

    _attr_has_entity_name = True
    _attr_native_min_value = 0
    _attr_native_max_value = 255
    _attr_native_step = 1
    _attr_mode = NumberMode.SLIDER
    _attr_icon = "mdi:brightness-6"

    def __init__(
        self,
        coordinator: WLEDScreenControllerCoordinator,
        target_id: str,
        device_id: str,
        entry_id: str,
    ) -> None:
        """Initialize the brightness number."""
        super().__init__(coordinator)
        self._target_id = target_id
        self._device_id = device_id
        self._entry_id = entry_id
        self._attr_unique_id = f"{target_id}_brightness"
        self._attr_translation_key = "brightness"

    @property
    def device_info(self) -> dict[str, Any]:
        """Return device information."""
        return {"identifiers": {(DOMAIN, self._target_id)}}

    @property
    def native_value(self) -> float | None:
        """Return the current brightness value."""
        if not self.coordinator.data:
            return None
        device_data = self.coordinator.data.get("devices", {}).get(self._device_id)
        if not device_data:
            return None
        return device_data.get("brightness")

    @property
    def available(self) -> bool:
        """Return if entity is available."""
        if not self.coordinator.data:
            return False
        targets = self.coordinator.data.get("targets", {})
        devices = self.coordinator.data.get("devices", {})
        return self._target_id in targets and self._device_id in devices

    async def async_set_native_value(self, value: float) -> None:
        """Set brightness value."""
        await self.coordinator.set_brightness(self._device_id, int(value))


class WLEDScreenControllerKCBrightness(CoordinatorEntity, NumberEntity):
    """Brightness control for a Key Colors target."""

    _attr_has_entity_name = True
    _attr_native_min_value = 0
    _attr_native_max_value = 255
    _attr_native_step = 1
    _attr_mode = NumberMode.SLIDER
    _attr_icon = "mdi:brightness-6"

    def __init__(
        self,
        coordinator: WLEDScreenControllerCoordinator,
        target_id: str,
        entry_id: str,
    ) -> None:
        """Initialize the KC brightness number."""
        super().__init__(coordinator)
        self._target_id = target_id
        self._entry_id = entry_id
        self._attr_unique_id = f"{target_id}_brightness"
        self._attr_translation_key = "brightness"

    @property
    def device_info(self) -> dict[str, Any]:
        """Return device information."""
        return {"identifiers": {(DOMAIN, self._target_id)}}

    @property
    def native_value(self) -> float | None:
        """Return the current brightness value (0-255)."""
        if not self.coordinator.data:
            return None
        target_data = self.coordinator.data.get("targets", {}).get(self._target_id)
        if not target_data:
            return None
        kc_settings = target_data.get("info", {}).get("key_colors_settings") or {}
        brightness_float = kc_settings.get("brightness", 1.0)
        return round(brightness_float * 255)

    @property
    def available(self) -> bool:
        """Return if entity is available."""
        if not self.coordinator.data:
            return False
        return self._target_id in self.coordinator.data.get("targets", {})

    async def async_set_native_value(self, value: float) -> None:
        """Set brightness value."""
        await self.coordinator.set_kc_brightness(self._target_id, int(value))
