"""Support for Dynalite channels as lights."""

from typing import TYPE_CHECKING

from .const import ATTR_BRIGHTNESS
from .dynalitebase import DynaliteChannelBaseDevice

if TYPE_CHECKING:  # pragma: no cover
    from .dynalite_devices import DynaliteDevices


class DynaliteChannelLightDevice(DynaliteChannelBaseDevice):
    """Representation of a Dynalite Channel as a Home Assistant Light."""

    def __init__(
        self, area: int, channel: int, bridge: "DynaliteDevices", hidden: bool
    ) -> None:
        """Initialize the light."""
        self._level = 0.0
        self._direction = "stop"
        super().__init__(area, channel, bridge, hidden)

    @property
    def category(self) -> str:
        """Return the category of the entity: light, switch, or cover."""
        return "light"

    @property
    def brightness(self) -> int:
        """Return the brightness of this light between 0..255."""
        return int(self._level * 255)

    @property
    def level(self) -> float:
        """Return the brightness of this light between 0..255."""
        return self._level

    @property
    def direction(self) -> str:
        """Return the brightness of this light between 0..1."""
        return self._direction

    @property
    def is_on(self) -> bool:
        """Return true if device is on."""
        return self._level > 0

    def update_level(self, actual_level: float, target_level: float) -> None:
        """Update the current level."""
        old_level = self._level
        self._level = actual_level
        if target_level > actual_level:
            self._direction = "open"
        elif target_level < actual_level:
            self._direction = "close"
        else:
            self._direction = "stop"

        if self._level != old_level:
            self.update_listeners()

    async def async_turn_on(self, **kwargs) -> None:
        """Turn light on."""
        # pylint: disable=unused-argument
        if ATTR_BRIGHTNESS in kwargs:
            brightness = kwargs[ATTR_BRIGHTNESS] / 255.0
        else:
            brightness = 1.0
        fade = self._bridge.get_channel_fade(self._area, self._channel)
        self._bridge.set_channel_level(self._area, self._channel, brightness, fade)

    async def async_turn_off(self, **kwargs) -> None:
        """Turn light off."""
        # pylint: disable=unused-argument
        await self.async_turn_on(**{ATTR_BRIGHTNESS: 0})

    def init_level(self, level):
        """Initialize to a given level."""
        if level < 0 or level > 255:
            raise ValueError
        self._level = level / 255
