"""Platform for switch integration."""
from __future__ import annotations

from typing import Any

from devolo_home_control_api.devices.zwave import Zwave
from devolo_home_control_api.homecontrol import HomeControl

from homeassistant.components.switch import SwitchEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .devolo_device import DevoloDeviceEntity


async def async_setup_entry(
    hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
    """Get all devices and setup the switch devices via config entry."""
    entities = []

    for gateway in hass.data[DOMAIN][entry.entry_id]["gateways"]:
        for device in gateway.binary_switch_devices:
            for binary_switch in device.binary_switch_property:
                # Exclude the binary switch which also has multi_level_switches here,
                # because those are implemented as light entities now.
                if not hasattr(device, "multi_level_switch_property"):
                    entities.append(
                        DevoloSwitch(
                            homecontrol=gateway,
                            device_instance=device,
                            element_uid=binary_switch,
                        )
                    )

    async_add_entities(entities)


class DevoloSwitch(DevoloDeviceEntity, SwitchEntity):
    """Representation of a switch."""

    def __init__(
        self, homecontrol: HomeControl, device_instance: Zwave, element_uid: str
    ) -> None:
        """Initialize an devolo Switch."""
        super().__init__(
            homecontrol=homecontrol,
            device_instance=device_instance,
            element_uid=element_uid,
        )
        self._binary_switch_property = self._device_instance.binary_switch_property[
            self._attr_unique_id  # type: ignore[index]
        ]
        self._attr_is_on = self._binary_switch_property.state

    def turn_on(self, **kwargs: Any) -> None:
        """Switch on the device."""
        self._binary_switch_property.set(state=True)

    def turn_off(self, **kwargs: Any) -> None:
        """Switch off the device."""
        self._binary_switch_property.set(state=False)

    def _sync(self, message: tuple) -> None:
        """Update the binary switch state and consumption."""
        if message[0].startswith("devolo.BinarySwitch"):
            self._attr_is_on = self._device_instance.binary_switch_property[
                message[0]
            ].state
        else:
            self._generic_message(message)
        self.schedule_update_ha_state()