"""The tests for the Ring event platform."""

from datetime import datetime
import time

from freezegun.api import FrozenDateTimeFactory
import pytest
from ring_doorbell import Ring

from homeassistant.components.ring.binary_sensor import RingEvent
from homeassistant.components.ring.coordinator import RingEventListener
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant

from .common import setup_platform
from .device_mocks import FRONT_DOOR_DEVICE_ID, INGRESS_DEVICE_ID


@pytest.mark.parametrize(
    ("device_id", "device_name", "alert_kind", "device_class"),
    [
        pytest.param(
            FRONT_DOOR_DEVICE_ID,
            "front_door",
            "motion",
            "motion",
            id="front_door_motion",
        ),
        pytest.param(
            FRONT_DOOR_DEVICE_ID, "front_door", "ding", "doorbell", id="front_door_ding"
        ),
        pytest.param(
            INGRESS_DEVICE_ID, "ingress", "ding", "doorbell", id="ingress_ding"
        ),
        pytest.param(
            INGRESS_DEVICE_ID,
            "ingress",
            "intercom_unlock",
            "button",
            id="ingress_unlock",
        ),
    ],
)
async def test_event(
    hass: HomeAssistant,
    mock_ring_client: Ring,
    mock_ring_event_listener_class: RingEventListener,
    freezer: FrozenDateTimeFactory,
    device_id: int,
    device_name: str,
    alert_kind: str,
    device_class: str,
) -> None:
    """Test the Ring event platforms."""

    await setup_platform(hass, Platform.EVENT)

    start_time_str = "2024-09-04T15:32:53.892+00:00"
    start_time = datetime.strptime(start_time_str, "%Y-%m-%dT%H:%M:%S.%f%z")
    freezer.move_to(start_time)
    on_event_cb = mock_ring_event_listener_class.return_value.add_notification_callback.call_args.args[
        0
    ]

    # Default state is unknown
    entity_id = f"event.{device_name}_{alert_kind}"
    state = hass.states.get(entity_id)
    assert state is not None
    assert state.state == "unknown"
    assert state.attributes["device_class"] == device_class

    # A new alert sets to on
    event = RingEvent(
        1234546, device_id, "Foo", "Bar", time.time(), 180, kind=alert_kind, state=None
    )
    mock_ring_client.active_alerts.return_value = [event]
    on_event_cb(event)
    state = hass.states.get(entity_id)
    assert state is not None
    assert state.state == start_time_str