"""Unit tests for the VegeHub integration's switch.py."""

from unittest.mock import patch

from syrupy.assertion import SnapshotAssertion

from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er

from . import init_integration
from .conftest import TEST_SIMPLE_MAC, TEST_WEBHOOK_ID

from tests.common import MockConfigEntry, snapshot_platform
from tests.typing import ClientSessionGenerator

UPDATE_DATA = {
    "api_key": "",
    "mac": TEST_SIMPLE_MAC,
    "error_code": 0,
    "sensors": [
        {"slot": 1, "samples": [{"v": 1.5, "t": "2025-01-15T16:51:23Z"}]},
        {"slot": 2, "samples": [{"v": 1.45599997, "t": "2025-01-15T16:51:23Z"}]},
        {"slot": 3, "samples": [{"v": 1.330000043, "t": "2025-01-15T16:51:23Z"}]},
        {"slot": 4, "samples": [{"v": 0.075999998, "t": "2025-01-15T16:51:23Z"}]},
        {"slot": 5, "samples": [{"v": 9.314800262, "t": "2025-01-15T16:51:23Z"}]},
        {"slot": 6, "samples": [{"v": 1, "t": "2025-01-15T16:51:23Z"}]},
        {"slot": 7, "samples": [{"v": 0, "t": "2025-01-15T16:51:23Z"}]},
    ],
    "send_time": 1736959883,
    "wifi_str": -27,
}


async def test_switch_entities(
    hass: HomeAssistant,
    snapshot: SnapshotAssertion,
    hass_client_no_auth: ClientSessionGenerator,
    entity_registry: er.EntityRegistry,
    mocked_config_entry: MockConfigEntry,
) -> None:
    """Test all entities."""

    with patch("homeassistant.components.vegehub.PLATFORMS", [Platform.SWITCH]):
        await init_integration(hass, mocked_config_entry)

    assert TEST_WEBHOOK_ID in hass.data["webhook"], "Webhook was not registered"

    client = await hass_client_no_auth()
    resp = await client.post(f"/api/webhook/{TEST_WEBHOOK_ID}", json=UPDATE_DATA)

    # Send the same update again so that the coordinator modifies existing data
    # instead of creating new data.
    resp = await client.post(f"/api/webhook/{TEST_WEBHOOK_ID}", json=UPDATE_DATA)

    # Wait for remaining tasks to complete.
    await hass.async_block_till_done()
    assert resp.status == 200, f"Unexpected status code: {resp.status}"
    await snapshot_platform(
        hass, entity_registry, snapshot, mocked_config_entry.entry_id
    )


async def test_switch_turn_on_off(
    hass: HomeAssistant,
    hass_client_no_auth: ClientSessionGenerator,
    mocked_config_entry: MockConfigEntry,
) -> None:
    """Test switch turn_on and turn_off methods."""
    with patch("homeassistant.components.vegehub.PLATFORMS", [Platform.SWITCH]):
        await init_integration(hass, mocked_config_entry)

    # Send webhook data to initialize switches
    client = await hass_client_no_auth()
    resp = await client.post(f"/api/webhook/{TEST_WEBHOOK_ID}", json=UPDATE_DATA)
    await hass.async_block_till_done()
    assert resp.status == 200

    # Get switch entity IDs
    switch_entity_ids = hass.states.async_entity_ids("switch")
    assert len(switch_entity_ids) > 0, "No switch entities found"

    # Test turn_on method
    with patch(
        "homeassistant.components.vegehub.VegeHub.set_actuator"
    ) as mock_set_actuator:
        await hass.services.async_call(
            "switch", "turn_on", {"entity_id": switch_entity_ids[0]}, blocking=True
        )
        mock_set_actuator.assert_called_once_with(
            1, 0, 600
        )  # on, index 0, duration 600

    # Test turn_off method
    with patch(
        "homeassistant.components.vegehub.VegeHub.set_actuator"
    ) as mock_set_actuator:
        await hass.services.async_call(
            "switch", "turn_off", {"entity_id": switch_entity_ids[0]}, blocking=True
        )
        mock_set_actuator.assert_called_once_with(
            0, 0, 600
        )  # off, index 0, duration 600
