"""Tests for the Plugwise Sensor integration."""

from unittest.mock import MagicMock

import pytest
from syrupy.assertion import SnapshotAssertion

from homeassistant.components.plugwise.const import DOMAIN
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er

from tests.common import MockConfigEntry, snapshot_platform


@pytest.mark.parametrize("chosen_env", ["m_adam_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [False], indirect=True)
@pytest.mark.parametrize("platforms", [(SENSOR_DOMAIN,)])
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_adam_sensor_snapshot(
    hass: HomeAssistant,
    mock_smile_adam_heat_cool: MagicMock,
    snapshot: SnapshotAssertion,
    entity_registry: er.EntityRegistry,
    setup_platform: MockConfigEntry,
) -> None:
    """Test Adam sensor snapshot."""
    await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id)


async def test_adam_climate_sensor_humidity(
    hass: HomeAssistant,
    mock_smile_adam_jip: MagicMock,
    init_integration: MockConfigEntry,
) -> None:
    """Test creation of climate related humidity sensor entity."""
    state = hass.states.get("sensor.woonkamer_humidity")
    assert state
    assert float(state.state) == 56.2


async def test_unique_id_migration_humidity(
    hass: HomeAssistant,
    entity_registry: er.EntityRegistry,
    mock_smile_adam_jip: MagicMock,
    mock_config_entry: MockConfigEntry,
) -> None:
    """Test unique ID migration of -relative_humidity to -humidity."""
    mock_config_entry.add_to_hass(hass)

    # Entry to migrate
    entity_registry.async_get_or_create(
        SENSOR_DOMAIN,
        DOMAIN,
        "f61f1a2535f54f52ad006a3d18e459ca-relative_humidity",
        config_entry=mock_config_entry,
        suggested_object_id="woonkamer_humidity",
        disabled_by=None,
    )
    # Entry not needing migration
    entity_registry.async_get_or_create(
        SENSOR_DOMAIN,
        DOMAIN,
        "f61f1a2535f54f52ad006a3d18e459ca-battery",
        config_entry=mock_config_entry,
        suggested_object_id="woonkamer_battery",
        disabled_by=None,
    )

    await hass.config_entries.async_setup(mock_config_entry.entry_id)
    await hass.async_block_till_done()

    assert hass.states.get("sensor.woonkamer_humidity") is not None
    assert hass.states.get("sensor.woonkamer_battery") is not None

    entity_entry = entity_registry.async_get("sensor.woonkamer_humidity")
    assert entity_entry
    assert entity_entry.unique_id == "f61f1a2535f54f52ad006a3d18e459ca-humidity"

    entity_entry = entity_registry.async_get("sensor.woonkamer_battery")
    assert entity_entry
    assert entity_entry.unique_id == "f61f1a2535f54f52ad006a3d18e459ca-battery"


@pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True)
@pytest.mark.parametrize("cooling_present", [True], indirect=True)
@pytest.mark.parametrize("platforms", [(SENSOR_DOMAIN,)])
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_anna_sensor_snapshot(
    hass: HomeAssistant,
    mock_smile_anna: MagicMock,
    snapshot: SnapshotAssertion,
    entity_registry: er.EntityRegistry,
    setup_platform: MockConfigEntry,
) -> None:
    """Test Anna sensor snapshot."""
    await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id)


@pytest.mark.parametrize("platforms", [(SENSOR_DOMAIN,)])
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_anna_p1_sensor_snapshot(
    hass: HomeAssistant,
    mock_smile_anna_p1: MagicMock,
    snapshot: SnapshotAssertion,
    entity_registry: er.EntityRegistry,
    setup_platform: MockConfigEntry,
) -> None:
    """Test Anna P1 sensor snapshot."""
    await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id)


@pytest.mark.parametrize("chosen_env", ["p1v4_442_single"], indirect=True)
@pytest.mark.parametrize(
    "gateway_id", ["a455b61e52394b2db5081ce025a430f3"], indirect=True
)
@pytest.mark.parametrize("platforms", [(SENSOR_DOMAIN,)])
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_p1_dsmr_sensor_snapshot(
    hass: HomeAssistant,
    mock_smile_p1: MagicMock,
    snapshot: SnapshotAssertion,
    entity_registry: er.EntityRegistry,
    setup_platform: MockConfigEntry,
) -> None:
    """Test P1 1-phase sensor snapshot."""
    await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id)


@pytest.mark.parametrize("chosen_env", ["p1v4_442_triple"], indirect=True)
@pytest.mark.parametrize(
    "gateway_id", ["03e65b16e4b247a29ae0d75a78cb492e"], indirect=True
)
@pytest.mark.parametrize("platforms", [(SENSOR_DOMAIN,)])
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_p1_3ph_dsmr_sensor_snapshot(
    hass: HomeAssistant,
    mock_smile_p1: MagicMock,
    snapshot: SnapshotAssertion,
    entity_registry: er.EntityRegistry,
    setup_platform: MockConfigEntry,
) -> None:
    """Test P1 3-phase sensor snapshot."""
    await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id)


@pytest.mark.parametrize("chosen_env", ["p1v4_442_triple"], indirect=True)
@pytest.mark.parametrize(
    "gateway_id", ["03e65b16e4b247a29ae0d75a78cb492e"], indirect=True
)
async def test_p1_3ph_dsmr_sensor_disabled_entities(
    hass: HomeAssistant,
    entity_registry: er.EntityRegistry,
    mock_smile_p1: MagicMock,
    init_integration: MockConfigEntry,
) -> None:
    """Test disabled power related sensor entities intent."""
    entity_id = "sensor.p1_voltage_phase_one"
    state = hass.states.get(entity_id)
    assert not state

    entity_registry.async_update_entity(entity_id=entity_id, disabled_by=None)
    await hass.async_block_till_done()

    await hass.config_entries.async_reload(init_integration.entry_id)
    await hass.async_block_till_done()

    state = hass.states.get("sensor.p1_voltage_phase_one")
    assert state
    assert float(state.state) == 233.2


@pytest.mark.parametrize("platforms", [(SENSOR_DOMAIN,)])
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_stretch_sensor_snapshot(
    hass: HomeAssistant,
    mock_stretch: MagicMock,
    snapshot: SnapshotAssertion,
    entity_registry: er.EntityRegistry,
    setup_platform: MockConfigEntry,
) -> None:
    """Test Stretch sensor snapshot."""
    await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id)
