"""AsusRouter light module."""

from __future__ import annotations

import logging
from typing import Any

from asusrouter.modules.aura import AsusAura
from asusrouter.modules.color import ColorRGB, scale_value_int
from asusrouter.modules.led import AsusLED
from homeassistant.components.light import (
    ColorMode,
    LightEntity,
    LightEntityFeature,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator

from .const import ASUSROUTER, DOMAIN, STATIC_AURA, STATIC_LIGHTS
from .dataclass import ARLightDescription
from .entity import ARBinaryEntity, async_setup_ar_entry
from .modules.aura import AURA_EFFECTS, AURA_NO_EFFECT, per_zone_light
from .router import ARDevice

_LOGGER = logging.getLogger(__name__)

EFFECT = "effect"
RGB_COLOR = "rgb_color"
BRIGHTNESS = "brightness"
COLOR_MODE = "color_mode"
ZONE_ID = "zone_id"


async def async_setup_entry(
    hass: HomeAssistant,
    config_entry: ConfigEntry,
    async_add_entities: AddEntitiesCallback,
) -> None:
    """Set up AsusRouter lights."""

    leds = STATIC_LIGHTS.copy()
    if (
        hass.data[DOMAIN][config_entry.entry_id][
            ASUSROUTER
        ].bridge.identity.led
        is True
    ):
        await async_setup_ar_entry(
            hass, config_entry, async_add_entities, leds, ARLightLED
        )

    auras = STATIC_AURA.copy()
    if (
        hass.data[DOMAIN][config_entry.entry_id][
            ASUSROUTER
        ].bridge.identity.aura
        is True
    ):
        # Create per-zone lights
        auras.extend(
            per_zone_light(
                hass.data[DOMAIN][config_entry.entry_id][
                    ASUSROUTER
                ].bridge.identity.aura_zone
            )
        )

        await async_setup_ar_entry(
            hass, config_entry, async_add_entities, auras, ARLightAura
        )


class ARLightLED(ARBinaryEntity, LightEntity):
    """AsusRouter LED light."""

    _attr_color_mode = ColorMode.ONOFF
    _attr_supported_color_modes = {ColorMode.ONOFF}

    def __init__(
        self,
        coordinator: DataUpdateCoordinator,
        router: ARDevice,
        description: ARLightDescription,
    ) -> None:
        """Initialize AsusRouter LED light."""

        super().__init__(coordinator, router, description)
        self.entity_description: ARLightDescription = description

    async def async_turn_on(
        self,
        **kwargs: Any,
    ) -> None:
        """Turn on LED."""

        await self._set_state(AsusLED.ON)

    async def async_turn_off(
        self,
        **kwargs: Any,
    ) -> None:
        """Turn off LED."""

        await self._set_state(AsusLED.OFF)


class ARLightAura(ARBinaryEntity, LightEntity):
    """AsusRouter Aura light."""

    def __init__(
        self,
        coordinator: DataUpdateCoordinator,
        router: ARDevice,
        description: ARLightDescription,
    ) -> None:
        """Initialize AsusRouter Aura light."""

        self._attr_supported_features = LightEntityFeature.EFFECT
        self._attr_effect_list = AURA_EFFECTS

        super().__init__(coordinator, router, description)
        self.entity_description: ARLightDescription = description

    async def async_turn_on(
        self,
        **kwargs: Any,
    ) -> None:
        """Turn on Aura."""

        effect = AsusAura.ON
        if "effect" in kwargs:
            effect = AsusAura.__members__.get(
                kwargs["effect"].upper(), AsusAura.ON
            )

        color = None
        if "rgb_color" in kwargs:
            rgb = kwargs["rgb_color"]
            color = ColorRGB(rgb[0], rgb[1], rgb[2], scale=255)

        brightness = None
        if "brightness" in kwargs:
            brightness = scale_value_int(kwargs["brightness"], 128, 255)

        zone_id = (
            self.entity_description.capabilities.get("zone_id", None)
            if self.entity_description.capabilities
            else None
        )

        await self._set_state(
            effect,
            color=color,
            brightness=brightness,
            zone=zone_id,
        )

    async def async_turn_off(
        self,
        **kwargs: Any,
    ) -> None:
        """Turn off Aura."""

        await self._set_state(AsusAura.OFF)

    @property
    def effect(self) -> str | None:
        """Return the current effect."""

        return self.coordinator.data.get("effect", AURA_NO_EFFECT)

    @property
    def supported_color_modes(self) -> set[str] | None:
        """Return the supported color modes."""

        # This is a workaround to avoid a bug in HA
        # which does not hide the color picker and brightness slider
        # even when the current color mode is set to ONOFF only
        _supported_color_modes = self.coordinator.data.get(
            "color_mode", ColorMode.RGB
        )
        return {_supported_color_modes}

    @property
    def color_mode(self) -> ColorMode | str | None:
        """Return the color mode."""

        return self.coordinator.data.get("color_mode", ColorMode.RGB)
