"""The tests for the PG LAB Electronics  discovery device."""

from syrupy.assertion import SnapshotAssertion

from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr

from .test_common import get_device_discovery_payload, send_discovery_message

from tests.typing import MqttMockHAClient


async def test_device_discover(
    hass: HomeAssistant,
    mqtt_mock: MqttMockHAClient,
    device_reg,
    entity_reg,
    setup_pglab,
) -> None:
    """Test setting up a device."""

    payload = get_device_discovery_payload(
        number_of_shutters=0,
        number_of_boards=2,
    )

    await send_discovery_message(hass, payload)

    # Verify device and registry entries are created
    device_entry = device_reg.async_get_device_by_connection(
        (dr.CONNECTION_NETWORK_MAC, payload["mac"]),
        hass.config_entries.async_entries("pglab")[0].entry_id,
    )
    assert device_entry is not None
    assert device_entry.configuration_url == f"http://{payload['ip']}/"
    assert device_entry.manufacturer == "PG LAB Electronics"
    assert device_entry.model == payload["type"]
    assert device_entry.name == payload["name"]
    assert device_entry.sw_version == payload["fw"]


async def test_device_update(
    hass: HomeAssistant,
    mqtt_mock: MqttMockHAClient,
    device_reg,
    entity_reg,
    setup_pglab,
    snapshot: SnapshotAssertion,
) -> None:
    """Test update a device."""
    payload = get_device_discovery_payload(
        number_of_shutters=0,
        number_of_boards=2,
    )

    await send_discovery_message(hass, payload)

    # Verify device is created
    device_entry = device_reg.async_get_device_by_connection(
        (dr.CONNECTION_NETWORK_MAC, payload["mac"]),
        hass.config_entries.async_entries("pglab")[0].entry_id,
    )
    assert device_entry is not None

    # update device
    payload["fw"] = "1.0.1"
    payload["hw"] = "1.0.8"

    await send_discovery_message(hass, payload)

    # Verify device is created
    device_entry = device_reg.async_get_device_by_connection(
        (dr.CONNECTION_NETWORK_MAC, payload["mac"]),
        hass.config_entries.async_entries("pglab")[0].entry_id,
    )
    assert device_entry is not None
    assert device_entry.sw_version == "1.0.1"
    assert device_entry.hw_version == "1.0.8"


async def test_device_remove(
    hass: HomeAssistant,
    mqtt_mock: MqttMockHAClient,
    device_reg,
    entity_reg,
    setup_pglab,
) -> None:
    """Test remove a device."""
    payload = get_device_discovery_payload(
        number_of_shutters=0,
        number_of_boards=2,
    )

    await send_discovery_message(hass, payload)

    # Verify device is created
    device_entry = device_reg.async_get_device_by_connection(
        (dr.CONNECTION_NETWORK_MAC, payload["mac"]),
        hass.config_entries.async_entries("pglab")[0].entry_id,
    )
    assert device_entry is not None

    await send_discovery_message(hass, None)

    # Verify device entry is removed
    assert (
        device_reg.async_get_device_by_connection(
            (dr.CONNECTION_NETWORK_MAC, payload["mac"]),
            hass.config_entries.async_entries("pglab")[0].entry_id,
        )
        is None
    )
