"""Test ONVIF util functions."""

from homeassistant.components.onvif.models import Event
from homeassistant.components.onvif.util import build_event_entity_names

# Example device UID that would be used as prefix
TEST_DEVICE_UID = "aa:bb:cc:dd:ee:ff"


def test_build_event_entity_names_unique_names() -> None:
    """Test build_event_entity_names with unique event names."""
    events = [
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:RuleEngine/CellMotionDetector/Motion_00000_00000_00000",
            name="Cell Motion Detection",
            platform="binary_sensor",
        ),
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:RuleEngine/PeopleDetector/People_00000_00000_00000",
            name="Person Detection",
            platform="binary_sensor",
        ),
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:RuleEngine/MyRuleDetector/VehicleDetect_00000",
            name="Vehicle Detection",
            platform="binary_sensor",
        ),
    ]

    result = build_event_entity_names(events)

    assert result == {
        f"{TEST_DEVICE_UID}_tns1:RuleEngine/"
        "CellMotionDetector/Motion_00000_00000_00000": ("Cell Motion Detection"),
        f"{TEST_DEVICE_UID}_tns1:RuleEngine/PeopleDetector/People_00000_00000_00000": (
            "Person Detection"
        ),
        f"{TEST_DEVICE_UID}_tns1:RuleEngine/"
        "MyRuleDetector/VehicleDetect_00000": "Vehicle Detection",
    }


def test_build_event_entity_names_duplicated() -> None:
    """Test with multiple motion detection zones (realistic camera scenario)."""
    # Realistic scenario: Camera with motion detection on multiple source tokens
    events = [
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:VideoSource/MotionAlarm_00200",
            name="Motion Alarm",
            platform="binary_sensor",
        ),
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:VideoSource/MotionAlarm_00100",
            name="Motion Alarm",
            platform="binary_sensor",
        ),
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:VideoSource/MotionAlarm_00000",
            name="Motion Alarm",
            platform="binary_sensor",
        ),
    ]

    result = build_event_entity_names(events)

    # Should be sorted by UID (source tokens: 00000, 00100, 00200)
    assert result == {
        f"{TEST_DEVICE_UID}_tns1:VideoSource/MotionAlarm_00000": "Motion Alarm 1",
        f"{TEST_DEVICE_UID}_tns1:VideoSource/MotionAlarm_00100": "Motion Alarm 2",
        f"{TEST_DEVICE_UID}_tns1:VideoSource/MotionAlarm_00200": "Motion Alarm 3",
    }


def test_build_event_entity_names_mixed_events() -> None:
    """Test realistic mix of unique and duplicate event names."""
    events = [
        # Multiple person detection with different rules
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:RuleEngine/CellMotionDetector/People_00000_00000_00000",
            name="Person Detection",
            platform="binary_sensor",
        ),
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:RuleEngine/CellMotionDetector/People_00000_00000_00100",
            name="Person Detection",
            platform="binary_sensor",
        ),
        # Unique tamper detection
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:RuleEngine/CellMotionDetector/Tamper_00000_00000_00000",
            name="Tamper Detection",
            platform="binary_sensor",
        ),
        # Multiple line crossings with different rules
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:RuleEngine/CellMotionDetector/LineCross_00000_00000_00000",
            name="Line Detector Crossed",
            platform="binary_sensor",
        ),
        Event(
            uid=f"{TEST_DEVICE_UID}_tns1:RuleEngine/CellMotionDetector/LineCross_00000_00000_00100",
            name="Line Detector Crossed",
            platform="binary_sensor",
        ),
    ]

    result = build_event_entity_names(events)

    assert result == {
        f"{TEST_DEVICE_UID}_tns1:RuleEngine/"
        "CellMotionDetector/People_00000_00000_00000": ("Person Detection 1"),
        f"{TEST_DEVICE_UID}_tns1:RuleEngine/"
        "CellMotionDetector/People_00000_00000_00100": ("Person Detection 2"),
        f"{TEST_DEVICE_UID}_tns1:RuleEngine/"
        "CellMotionDetector/Tamper_00000_00000_00000": ("Tamper Detection"),
        f"{TEST_DEVICE_UID}_tns1:RuleEngine/"
        "CellMotionDetector/LineCross_00000_00000_00000": ("Line Detector Crossed 1"),
        f"{TEST_DEVICE_UID}_tns1:RuleEngine/"
        "CellMotionDetector/LineCross_00000_00000_00100": ("Line Detector Crossed 2"),
    }


def test_build_event_entity_names_empty() -> None:
    """Test build_event_entity_names with empty list."""
    assert build_event_entity_names([]) == {}
