"""Test websocket commands for the panel."""


from unittest.mock import patch

from homeassistant.components import dynalite
from homeassistant.components.cover import DEVICE_CLASSES
from homeassistant.const import CONF_PORT

from tests.common import MockConfigEntry


async def test_get_config(hass, hass_ws_client):
    """Get the config via websocket."""
    host = "1.2.3.4"
    port = 765

    entry = MockConfigEntry(
        domain=dynalite.DOMAIN,
        data={dynalite.CONF_HOST: host, CONF_PORT: port},
    )
    entry.add_to_hass(hass)
    with patch(
        "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup",
        return_value=True,
    ):
        assert await hass.config_entries.async_setup(entry.entry_id)
        await hass.async_block_till_done()

    client = await hass_ws_client(hass)

    await client.send_json(
        {
            "id": 24,
            "type": "dynalite/get-config",
        }
    )

    msg = await client.receive_json()
    assert msg["success"]
    result = msg["result"]
    entry_id = entry.entry_id
    assert result == {
        "config": {entry_id: {dynalite.CONF_HOST: host, CONF_PORT: port}},
        "default": {
            "DEFAULT_NAME": dynalite.const.DEFAULT_NAME,
            "DEFAULT_PORT": dynalite.const.DEFAULT_PORT,
            "DEVICE_CLASSES": DEVICE_CLASSES,
        },
    }


async def test_save_config(hass, hass_ws_client):
    """Save the config via websocket."""
    host1 = "1.2.3.4"
    port1 = 765
    host2 = "5.6.7.8"
    port2 = 432
    host3 = "5.3.2.1"
    port3 = 543

    entry1 = MockConfigEntry(
        domain=dynalite.DOMAIN,
        data={dynalite.CONF_HOST: host1, CONF_PORT: port1},
    )
    entry1.add_to_hass(hass)
    with patch(
        "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup",
        return_value=True,
    ):
        assert await hass.config_entries.async_setup(entry1.entry_id)
        await hass.async_block_till_done()
    entry2 = MockConfigEntry(
        domain=dynalite.DOMAIN,
        data={dynalite.CONF_HOST: host2, CONF_PORT: port2},
    )
    entry2.add_to_hass(hass)
    with patch(
        "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup",
        return_value=True,
    ):
        assert await hass.config_entries.async_setup(entry2.entry_id)
        await hass.async_block_till_done()

    client = await hass_ws_client(hass)

    await client.send_json(
        {
            "id": 24,
            "type": "dynalite/save-config",
            "entry_id": entry2.entry_id,
            "config": {dynalite.CONF_HOST: host3, CONF_PORT: port3},
        }
    )

    msg = await client.receive_json()
    assert msg["success"]
    assert msg["result"] == {}

    existing_entry = hass.config_entries.async_get_entry(entry1.entry_id)
    assert existing_entry.data == {dynalite.CONF_HOST: host1, CONF_PORT: port1}
    modified_entry = hass.config_entries.async_get_entry(entry2.entry_id)
    assert modified_entry.data[dynalite.CONF_HOST] == host3
    assert modified_entry.data[CONF_PORT] == port3


async def test_save_config_invalid_entry(hass, hass_ws_client):
    """Try to update nonexistent entry."""
    host1 = "1.2.3.4"
    port1 = 765
    host2 = "5.6.7.8"
    port2 = 432

    entry = MockConfigEntry(
        domain=dynalite.DOMAIN,
        data={dynalite.CONF_HOST: host1, CONF_PORT: port1},
    )
    entry.add_to_hass(hass)
    with patch(
        "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup",
        return_value=True,
    ):
        assert await hass.config_entries.async_setup(entry.entry_id)
        await hass.async_block_till_done()

    client = await hass_ws_client(hass)
    await client.send_json(
        {
            "id": 24,
            "type": "dynalite/save-config",
            "entry_id": "junk",
            "config": {dynalite.CONF_HOST: host2, CONF_PORT: port2},
        }
    )

    msg = await client.receive_json()
    assert msg["success"]
    assert msg["result"] == {"error": True}

    existing_entry = hass.config_entries.async_get_entry(entry.entry_id)
    assert existing_entry.data == {dynalite.CONF_HOST: host1, CONF_PORT: port1}