"""Test the Kegtron sensors."""

from homeassistant.components.kegtron.const import DOMAIN
from homeassistant.components.sensor import ATTR_STATE_CLASS
from homeassistant.const import ATTR_FRIENDLY_NAME, ATTR_UNIT_OF_MEASUREMENT

from . import (
    KEGTRON_KT100_SERVICE_INFO,
    KEGTRON_KT200_PORT_1_SERVICE_INFO,
    KEGTRON_KT200_PORT_2_SERVICE_INFO,
)

from tests.common import MockConfigEntry
from tests.components.bluetooth import inject_bluetooth_service_info


async def test_sensors_kt100(hass):
    """Test setting up creates the sensors for Kegtron KT-100."""
    entry = MockConfigEntry(
        domain=DOMAIN,
        unique_id="D0:CF:5E:5C:9B:75",
    )
    entry.add_to_hass(hass)

    assert await hass.config_entries.async_setup(entry.entry_id)
    await hass.async_block_till_done()

    assert len(hass.states.async_all("sensor")) == 0

    inject_bluetooth_service_info(
        hass,
        KEGTRON_KT100_SERVICE_INFO,
    )
    await hass.async_block_till_done()
    assert len(hass.states.async_all("sensor")) == 7

    port_count_sensor = hass.states.get("sensor.kegtron_kt_100_9b75_port_count")
    port_count_sensor_attrs = port_count_sensor.attributes
    assert port_count_sensor.state == "Single port device"
    assert (
        port_count_sensor_attrs[ATTR_FRIENDLY_NAME] == "Kegtron KT-100 9B75 Port Count"
    )

    keg_size_sensor = hass.states.get("sensor.kegtron_kt_100_9b75_keg_size")
    keg_size_sensor_attrs = keg_size_sensor.attributes
    assert keg_size_sensor.state == "18.927"
    assert keg_size_sensor_attrs[ATTR_FRIENDLY_NAME] == "Kegtron KT-100 9B75 Keg Size"
    assert keg_size_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "L"
    assert keg_size_sensor_attrs[ATTR_STATE_CLASS] == "measurement"

    keg_type_sensor = hass.states.get("sensor.kegtron_kt_100_9b75_keg_type")
    keg_type_sensor_attrs = keg_type_sensor.attributes
    assert keg_type_sensor.state == "Corny (5.0 gal)"
    assert keg_type_sensor_attrs[ATTR_FRIENDLY_NAME] == "Kegtron KT-100 9B75 Keg Type"

    volume_start_sensor = hass.states.get("sensor.kegtron_kt_100_9b75_volume_start")
    volume_start_sensor_attrs = volume_start_sensor.attributes
    assert volume_start_sensor.state == "5.0"
    assert (
        volume_start_sensor_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-100 9B75 Volume Start"
    )
    assert volume_start_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "L"
    assert volume_start_sensor_attrs[ATTR_STATE_CLASS] == "measurement"

    volume_dispensed_sensor = hass.states.get(
        "sensor.kegtron_kt_100_9b75_volume_dispensed"
    )
    volume_dispensed_attrs = volume_dispensed_sensor.attributes
    assert volume_dispensed_sensor.state == "0.738"
    assert (
        volume_dispensed_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-100 9B75 Volume Dispensed"
    )
    assert volume_dispensed_attrs[ATTR_UNIT_OF_MEASUREMENT] == "L"
    assert volume_dispensed_attrs[ATTR_STATE_CLASS] == "total"

    port_state_sensor = hass.states.get("sensor.kegtron_kt_100_9b75_port_state")
    port_state_sensor_attrs = port_state_sensor.attributes
    assert port_state_sensor.state == "Configured"
    assert (
        port_state_sensor_attrs[ATTR_FRIENDLY_NAME] == "Kegtron KT-100 9B75 Port State"
    )

    port_name_sensor = hass.states.get("sensor.kegtron_kt_100_9b75_port_name")
    port_name_attrs = port_name_sensor.attributes
    assert port_name_sensor.state == "Single Port"
    assert port_name_attrs[ATTR_FRIENDLY_NAME] == "Kegtron KT-100 9B75 Port Name"

    assert await hass.config_entries.async_unload(entry.entry_id)
    await hass.async_block_till_done()


async def test_sensors_kt200(hass):
    """Test setting up creates the sensors for Kegtron KT-200."""
    entry = MockConfigEntry(
        domain=DOMAIN,
        unique_id="D0:CF:5E:5C:9B:75",
    )
    entry.add_to_hass(hass)

    assert await hass.config_entries.async_setup(entry.entry_id)
    await hass.async_block_till_done()

    assert len(hass.states.async_all("sensor")) == 0

    # Kegtron KT-200 has two ports that are reported separately, start with port 2
    inject_bluetooth_service_info(
        hass,
        KEGTRON_KT200_PORT_2_SERVICE_INFO,
    )
    await hass.async_block_till_done()
    assert len(hass.states.async_all("sensor")) == 7

    port_count_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_port_count")
    port_count_sensor_attrs = port_count_sensor.attributes
    assert port_count_sensor.state == "Dual port device"
    assert (
        port_count_sensor_attrs[ATTR_FRIENDLY_NAME] == "Kegtron KT-200 9B75 Port Count"
    )

    keg_size_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_keg_size_port_2")
    keg_size_sensor_attrs = keg_size_sensor.attributes
    assert keg_size_sensor.state == "58.93"
    assert (
        keg_size_sensor_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Keg Size Port 2"
    )
    assert keg_size_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "L"
    assert keg_size_sensor_attrs[ATTR_STATE_CLASS] == "measurement"

    keg_type_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_keg_type_port_2")
    keg_type_sensor_attrs = keg_type_sensor.attributes
    assert keg_type_sensor.state == "Other (58.93 L)"
    assert (
        keg_type_sensor_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Keg Type Port 2"
    )

    volume_start_sensor = hass.states.get(
        "sensor.kegtron_kt_200_9b75_volume_start_port_2"
    )
    volume_start_sensor_attrs = volume_start_sensor.attributes
    assert volume_start_sensor.state == "15.0"
    assert (
        volume_start_sensor_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Volume Start Port 2"
    )
    assert volume_start_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "L"
    assert volume_start_sensor_attrs[ATTR_STATE_CLASS] == "measurement"

    volume_dispensed_sensor = hass.states.get(
        "sensor.kegtron_kt_200_9b75_volume_dispensed_port_2"
    )
    volume_dispensed_attrs = volume_dispensed_sensor.attributes
    assert volume_dispensed_sensor.state == "0.738"
    assert (
        volume_dispensed_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Volume Dispensed Port 2"
    )
    assert volume_dispensed_attrs[ATTR_UNIT_OF_MEASUREMENT] == "L"
    assert volume_dispensed_attrs[ATTR_STATE_CLASS] == "total"

    port_state_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_port_state_port_2")
    port_state_sensor_attrs = port_state_sensor.attributes
    assert port_state_sensor.state == "Configured"
    assert (
        port_state_sensor_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Port State Port 2"
    )

    port_name_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_port_name_port_2")
    port_name_attrs = port_name_sensor.attributes
    assert port_name_sensor.state == "2nd Port"
    assert port_name_attrs[ATTR_FRIENDLY_NAME] == "Kegtron KT-200 9B75 Port Name Port 2"

    # Followed by a BLE advertisement of port 1
    inject_bluetooth_service_info(
        hass,
        KEGTRON_KT200_PORT_1_SERVICE_INFO,
    )
    await hass.async_block_till_done()
    assert len(hass.states.async_all("sensor")) == 13

    port_count_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_port_count")
    port_count_sensor_attrs = port_count_sensor.attributes
    assert port_count_sensor.state == "Dual port device"
    assert (
        port_count_sensor_attrs[ATTR_FRIENDLY_NAME] == "Kegtron KT-200 9B75 Port Count"
    )

    keg_size_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_keg_size_port_1")
    keg_size_sensor_attrs = keg_size_sensor.attributes
    assert keg_size_sensor.state == "9.04"
    assert (
        keg_size_sensor_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Keg Size Port 1"
    )
    assert keg_size_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "L"
    assert keg_size_sensor_attrs[ATTR_STATE_CLASS] == "measurement"

    keg_type_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_keg_type_port_1")
    keg_type_sensor_attrs = keg_type_sensor.attributes
    assert keg_type_sensor.state == "Other (9.04 L)"
    assert (
        keg_type_sensor_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Keg Type Port 1"
    )

    volume_start_sensor = hass.states.get(
        "sensor.kegtron_kt_200_9b75_volume_start_port_1"
    )
    volume_start_sensor_attrs = volume_start_sensor.attributes
    assert volume_start_sensor.state == "50.0"
    assert (
        volume_start_sensor_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Volume Start Port 1"
    )
    assert volume_start_sensor_attrs[ATTR_UNIT_OF_MEASUREMENT] == "L"
    assert volume_start_sensor_attrs[ATTR_STATE_CLASS] == "measurement"

    volume_dispensed_sensor = hass.states.get(
        "sensor.kegtron_kt_200_9b75_volume_dispensed_port_1"
    )
    volume_dispensed_attrs = volume_dispensed_sensor.attributes
    assert volume_dispensed_sensor.state == "13.0"
    assert (
        volume_dispensed_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Volume Dispensed Port 1"
    )
    assert volume_dispensed_attrs[ATTR_UNIT_OF_MEASUREMENT] == "L"
    assert volume_dispensed_attrs[ATTR_STATE_CLASS] == "total"

    port_state_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_port_state_port_1")
    port_state_sensor_attrs = port_state_sensor.attributes
    assert port_state_sensor.state == "Configured"
    assert (
        port_state_sensor_attrs[ATTR_FRIENDLY_NAME]
        == "Kegtron KT-200 9B75 Port State Port 1"
    )

    port_name_sensor = hass.states.get("sensor.kegtron_kt_200_9b75_port_name_port_1")
    port_name_attrs = port_name_sensor.attributes
    assert port_name_sensor.state == "Port 1"
    assert port_name_attrs[ATTR_FRIENDLY_NAME] == "Kegtron KT-200 9B75 Port Name Port 1"

    assert await hass.config_entries.async_unload(entry.entry_id)
    await hass.async_block_till_done()