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

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('pyspcwebgw.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('pyspcwebgw.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('pyspcwebgw.SpcWebGateway.areas',
               new_callable=PropertyMock) as mock_areas:
        mock_areas.return_value = {'1': area_mock}
        with patch('pyspcwebgw.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'