"""Tests for Vanderbilt SPC component."""
from unittest.mock import Mock, PropertyMock, patch

from homeassistant.bootstrap import async_setup_component
from homeassistant.components.spc import DATA_API
from homeassistant.const import STATE_ALARM_ARMED_AWAY, STATE_ALARM_DISARMED

from tests.common import mock_coro


async def test_valid_device_config(hass, monkeypatch):
    """Test valid device config."""
    config = {"spc": {"api_url": "http://localhost/", "ws_url": "ws://localhost/"}}

    with patch(
        "homeassistant.components.spc.SpcWebGateway.async_load_parameters",
        return_value=mock_coro(True),
    ):
        assert await async_setup_component(hass, "spc", config) is True


async def test_invalid_device_config(hass, monkeypatch):
    """Test valid device config."""
    config = {"spc": {"api_url": "http://localhost/"}}

    with patch(
        "homeassistant.components.spc.SpcWebGateway.async_load_parameters",
        return_value=mock_coro(True),
    ):
        assert await async_setup_component(hass, "spc", config) is False


async def test_update_alarm_device(hass):
    """Test that alarm panel state changes on incoming websocket data."""
    import pyspcwebgw
    from pyspcwebgw.const import AreaMode

    config = {"spc": {"api_url": "http://localhost/", "ws_url": "ws://localhost/"}}

    area_mock = Mock(
        spec=pyspcwebgw.area.Area,
        id="1",
        mode=AreaMode.FULL_SET,
        last_changed_by="Sven",
    )
    area_mock.name = "House"
    area_mock.verified_alarm = False

    with patch(
        "homeassistant.components.spc.SpcWebGateway.areas", new_callable=PropertyMock
    ) as mock_areas:
        mock_areas.return_value = {"1": area_mock}
        with patch(
            "homeassistant.components.spc.SpcWebGateway.async_load_parameters",
            return_value=mock_coro(True),
        ):
            assert await async_setup_component(hass, "spc", config) is True

        await hass.async_block_till_done()

    entity_id = "alarm_control_panel.house"

    assert hass.states.get(entity_id).state == STATE_ALARM_ARMED_AWAY
    assert hass.states.get(entity_id).attributes["changed_by"] == "Sven"

    area_mock.mode = AreaMode.UNSET
    area_mock.last_changed_by = "Anna"
    await hass.data[DATA_API]._async_callback(area_mock)
    await hass.async_block_till_done()

    assert hass.states.get(entity_id).state == STATE_ALARM_DISARMED
    assert hass.states.get(entity_id).attributes["changed_by"] == "Anna"