"""Test Matter Event entities."""

from unittest.mock import MagicMock

from matter_server.client.models.node import MatterNode
from matter_server.common.models import EventType, MatterNodeEvent
import pytest

from homeassistant.components.event import ATTR_EVENT_TYPE, ATTR_EVENT_TYPES
from homeassistant.core import HomeAssistant

from .common import setup_integration_with_node_fixture, trigger_subscription_callback


@pytest.fixture(name="generic_switch_node")
async def switch_node_fixture(
    hass: HomeAssistant, matter_client: MagicMock
) -> MatterNode:
    """Fixture for a GenericSwitch node."""
    return await setup_integration_with_node_fixture(
        hass, "generic-switch", matter_client
    )


@pytest.fixture(name="generic_switch_multi_node")
async def multi_switch_node_fixture(
    hass: HomeAssistant, matter_client: MagicMock
) -> MatterNode:
    """Fixture for a GenericSwitch node with multiple buttons."""
    return await setup_integration_with_node_fixture(
        hass, "generic-switch-multi", matter_client
    )


# This tests needs to be adjusted to remove lingering tasks
@pytest.mark.parametrize("expected_lingering_tasks", [True])
async def test_generic_switch_node(
    hass: HomeAssistant,
    matter_client: MagicMock,
    generic_switch_node: MatterNode,
) -> None:
    """Test event entity for a GenericSwitch node."""
    state = hass.states.get("event.mock_generic_switch")
    assert state
    assert state.state == "unknown"
    # the switch endpoint has no label so the entity name should be the device itself
    assert state.name == "Mock Generic Switch"
    # check event_types from featuremap 30
    assert state.attributes[ATTR_EVENT_TYPES] == [
        "initial_press",
        "short_release",
        "long_press",
        "long_release",
        "multi_press_ongoing",
        "multi_press_complete",
    ]
    # trigger firing a new event from the device
    await trigger_subscription_callback(
        hass,
        matter_client,
        EventType.NODE_EVENT,
        MatterNodeEvent(
            node_id=generic_switch_node.node_id,
            endpoint_id=1,
            cluster_id=59,
            event_id=1,
            event_number=0,
            priority=1,
            timestamp=0,
            timestamp_type=0,
            data=None,
        ),
    )
    state = hass.states.get("event.mock_generic_switch")
    assert state.attributes[ATTR_EVENT_TYPE] == "initial_press"
    # trigger firing a multi press event
    await trigger_subscription_callback(
        hass,
        matter_client,
        EventType.NODE_EVENT,
        MatterNodeEvent(
            node_id=generic_switch_node.node_id,
            endpoint_id=1,
            cluster_id=59,
            event_id=5,
            event_number=0,
            priority=1,
            timestamp=0,
            timestamp_type=0,
            data={"NewPosition": 3},
        ),
    )
    state = hass.states.get("event.mock_generic_switch")
    assert state.attributes[ATTR_EVENT_TYPE] == "multi_press_ongoing"
    assert state.attributes["NewPosition"] == 3


# This tests needs to be adjusted to remove lingering tasks
@pytest.mark.parametrize("expected_lingering_tasks", [True])
async def test_generic_switch_multi_node(
    hass: HomeAssistant,
    matter_client: MagicMock,
    generic_switch_multi_node: MatterNode,
) -> None:
    """Test event entity for a GenericSwitch node with multiple buttons."""
    state_button_1 = hass.states.get("event.mock_generic_switch_button_1")
    assert state_button_1
    assert state_button_1.state == "unknown"
    # name should be 'DeviceName Button 1' due to the label set to just '1'
    assert state_button_1.name == "Mock Generic Switch Button 1"
    # check event_types from featuremap 14
    assert state_button_1.attributes[ATTR_EVENT_TYPES] == [
        "initial_press",
        "short_release",
        "long_press",
        "long_release",
    ]
    # check button 2
    state_button_1 = hass.states.get("event.mock_generic_switch_fancy_button")
    assert state_button_1
    assert state_button_1.state == "unknown"
    # name should be 'DeviceName Fancy Button' due to the label set to 'Fancy Button'
    assert state_button_1.name == "Mock Generic Switch Fancy Button"
