"""Vera tests."""
from unittest.mock import MagicMock

from pyvera import (
    VeraArmableDevice,
    VeraBinarySensor,
    VeraController,
    VeraCurtain,
    VeraDevice,
    VeraDimmer,
    VeraLock,
    VeraScene,
    VeraSceneController,
    VeraSensor,
    VeraSwitch,
    VeraThermostat,
)

from homeassistant.components.vera import (
    CONF_EXCLUDE,
    CONF_LIGHTS,
    DOMAIN,
    VERA_DEVICES,
)
from homeassistant.core import HomeAssistant

from .common import ComponentFactory


def new_vera_device(cls, device_id: int) -> VeraDevice:
    """Create new mocked vera device.."""
    vera_device = MagicMock(spec=cls)  # type: VeraDevice
    vera_device.device_id = device_id
    vera_device.name = f"dev${device_id}"
    return vera_device


def assert_hass_vera_devices(hass: HomeAssistant, platform: str, arr_len: int) -> None:
    """Assert vera devices are present.."""
    assert hass.data[VERA_DEVICES][platform]
    assert len(hass.data[VERA_DEVICES][platform]) == arr_len


async def test_init(
    hass: HomeAssistant, vera_component_factory: ComponentFactory
) -> None:
    """Test function."""

    def setup_callback(controller: VeraController, hass_config: dict) -> None:
        hass_config[DOMAIN][CONF_EXCLUDE] = [11]
        hass_config[DOMAIN][CONF_LIGHTS] = [10]

    await vera_component_factory.configure_component(
        hass=hass,
        devices=(
            new_vera_device(VeraDimmer, 1),
            new_vera_device(VeraBinarySensor, 2),
            new_vera_device(VeraSensor, 3),
            new_vera_device(VeraArmableDevice, 4),
            new_vera_device(VeraLock, 5),
            new_vera_device(VeraThermostat, 6),
            new_vera_device(VeraCurtain, 7),
            new_vera_device(VeraSceneController, 8),
            new_vera_device(VeraSwitch, 9),
            new_vera_device(VeraSwitch, 10),
            new_vera_device(VeraSwitch, 11),
        ),
        scenes=(MagicMock(spec=VeraScene),),
        setup_callback=setup_callback,
    )

    assert_hass_vera_devices(hass, "light", 2)
    assert_hass_vera_devices(hass, "binary_sensor", 1)
    assert_hass_vera_devices(hass, "sensor", 2)
    assert_hass_vera_devices(hass, "switch", 2)
    assert_hass_vera_devices(hass, "lock", 1)
    assert_hass_vera_devices(hass, "climate", 1)
    assert_hass_vera_devices(hass, "cover", 1)