"""Support for Axis switches."""

from axis.event_stream import CLASS_OUTPUT

from homeassistant.components.switch import SwitchDevice
from homeassistant.const import CONF_MAC
from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect

from .axis_base import AxisEventBase
from .const import DOMAIN as AXIS_DOMAIN


async def async_setup_entry(hass, config_entry, async_add_entities):
    """Set up a Axis switch."""
    serial_number = config_entry.data[CONF_MAC]
    device = hass.data[AXIS_DOMAIN][serial_number]

    @callback
    def async_add_switch(event_id):
        """Add switch from Axis device."""
        event = device.api.event.events[event_id]

        if event.CLASS == CLASS_OUTPUT:
            async_add_entities([AxisSwitch(event, device)], True)

    device.listeners.append(
        async_dispatcher_connect(hass, device.event_new_sensor, async_add_switch)
    )


class AxisSwitch(AxisEventBase, SwitchDevice):
    """Representation of a Axis switch."""

    @property
    def is_on(self):
        """Return true if event is active."""
        return self.event.is_tripped

    async def async_turn_on(self, **kwargs):
        """Turn on switch."""
        action = "/"
        await self.hass.async_add_executor_job(
            self.device.api.vapix.ports[self.event.id].action, action
        )

    async def async_turn_off(self, **kwargs):
        """Turn off switch."""
        action = "\\"
        await self.hass.async_add_executor_job(
            self.device.api.vapix.ports[self.event.id].action, action
        )

    @property
    def name(self):
        """Return the name of the event."""
        if self.event.id and self.device.api.vapix.ports[self.event.id].name:
            return "{} {}".format(
                self.device.name, self.device.api.vapix.ports[self.event.id].name
            )

        return super().name
