"""Test Z-Wave Services."""
from openzwavemqtt.const import ATTR_POSITION, ATTR_VALUE
from openzwavemqtt.exceptions import InvalidValueError, NotFoundError, WrongTypeError
import pytest

from .common import setup_ozw


async def test_services(hass, light_data, sent_messages):
    """Test services on lock."""
    await setup_ozw(hass, fixture=light_data)

    # Test set_config_parameter list by label
    await hass.services.async_call(
        "ozw",
        "set_config_parameter",
        {"node_id": 39, "parameter": 1, "value": "Disable"},
        blocking=True,
    )
    assert len(sent_messages) == 1
    msg = sent_messages[0]
    assert msg["topic"] == "OpenZWave/1/command/setvalue/"
    assert msg["payload"] == {"Value": 0, "ValueIDKey": 281475641245716}

    # Test set_config_parameter list by index int
    await hass.services.async_call(
        "ozw",
        "set_config_parameter",
        {"node_id": 39, "parameter": 1, "value": 1},
        blocking=True,
    )
    assert len(sent_messages) == 2
    msg = sent_messages[1]
    assert msg["topic"] == "OpenZWave/1/command/setvalue/"
    assert msg["payload"] == {"Value": 1, "ValueIDKey": 281475641245716}

    # Test set_config_parameter int
    await hass.services.async_call(
        "ozw",
        "set_config_parameter",
        {"node_id": 39, "parameter": 3, "value": 55},
        blocking=True,
    )
    assert len(sent_messages) == 3
    msg = sent_messages[2]
    assert msg["topic"] == "OpenZWave/1/command/setvalue/"
    assert msg["payload"] == {"Value": 55, "ValueIDKey": 844425594667027}

    # Test set_config_parameter invalid list int
    with pytest.raises(NotFoundError):
        assert await hass.services.async_call(
            "ozw",
            "set_config_parameter",
            {"node_id": 39, "parameter": 1, "value": 12},
            blocking=True,
        )
    assert len(sent_messages) == 3

    # Test set_config_parameter invalid list value
    with pytest.raises(NotFoundError):
        assert await hass.services.async_call(
            "ozw",
            "set_config_parameter",
            {"node_id": 39, "parameter": 1, "value": "Blah"},
            blocking=True,
        )
    assert len(sent_messages) == 3

    # Test set_config_parameter invalid list value type
    with pytest.raises(WrongTypeError):
        assert await hass.services.async_call(
            "ozw",
            "set_config_parameter",
            {
                "node_id": 39,
                "parameter": 1,
                "value": {ATTR_VALUE: True, ATTR_POSITION: 1},
            },
            blocking=True,
        )
    assert len(sent_messages) == 3

    # Test set_config_parameter int out of range
    with pytest.raises(InvalidValueError):
        assert await hass.services.async_call(
            "ozw",
            "set_config_parameter",
            {"node_id": 39, "parameter": 3, "value": 2147483657},
            blocking=True,
        )
    assert len(sent_messages) == 3

    # Test set_config_parameter short
    await hass.services.async_call(
        "ozw",
        "set_config_parameter",
        {"node_id": 39, "parameter": 81, "value": 3000},
        blocking=True,
    )
    assert len(sent_messages) == 4
    msg = sent_messages[3]
    assert msg["topic"] == "OpenZWave/1/command/setvalue/"
    assert msg["payload"] == {"Value": 3000, "ValueIDKey": 22799473778098198}

    # Test set_config_parameter byte
    await hass.services.async_call(
        "ozw",
        "set_config_parameter",
        {"node_id": 39, "parameter": 16, "value": 20},
        blocking=True,
    )
    assert len(sent_messages) == 5
    msg = sent_messages[4]
    assert msg["topic"] == "OpenZWave/1/command/setvalue/"
    assert msg["payload"] == {"Value": 20, "ValueIDKey": 4503600291905553}