"""Test Fing Agent device tracker entity."""

from datetime import timedelta

from fing_agent_api.models import DeviceResponse
from freezegun.api import FrozenDateTimeFactory

from homeassistant.components.fing.const import DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er

from . import init_integration

from tests.common import (
    AsyncMock,
    async_fire_time_changed,
    async_load_json_object_fixture,
    snapshot_platform,
)
from tests.conftest import MockConfigEntry, SnapshotAssertion


async def test_all_entities(
    hass: HomeAssistant,
    snapshot: SnapshotAssertion,
    mock_config_entry: MockConfigEntry,
    mocked_fing_agent: AsyncMock,
    entity_registry: er.EntityRegistry,
) -> None:
    """Test all entities created by Fing with snapshot."""
    entry = await init_integration(hass, mock_config_entry, mocked_fing_agent)

    await snapshot_platform(hass, entity_registry, snapshot, entry.entry_id)


async def test_new_device_found(
    hass: HomeAssistant,
    mock_config_entry: MockConfigEntry,
    mocked_fing_agent: AsyncMock,
    entity_registry: er.EntityRegistry,
    freezer: FrozenDateTimeFactory,
) -> None:
    """Test Fing device tracker setup."""

    delta_time = timedelta(seconds=35)  # 30 seconds + 5 delta seconds

    await hass.config.async_set_time_zone("UTC")
    freezer.move_to("2021-01-09 12:00:00+00:00")
    entry = await init_integration(hass, mock_config_entry, mocked_fing_agent)

    # First check -> there are 3 devices in total
    assert len(er.async_entries_for_config_entry(entity_registry, entry.entry_id)) == 3

    mocked_fing_agent.get_devices.return_value = DeviceResponse(
        await async_load_json_object_fixture(
            hass, "device_resp_device_added.json", DOMAIN
        )
    )

    freezer.tick(delta_time)
    async_fire_time_changed(hass)
    await hass.async_block_till_done()

    # Second check -> added one device
    assert len(er.async_entries_for_config_entry(entity_registry, entry.entry_id)) == 4

    mocked_fing_agent.get_devices.return_value = DeviceResponse(
        await async_load_json_object_fixture(
            hass, "device_resp_device_deleted.json", DOMAIN
        )
    )

    freezer.tick(delta_time)
    async_fire_time_changed(hass)
    await hass.async_block_till_done()

    # Third check -> removed two devices (old devices)
    assert len(er.async_entries_for_config_entry(entity_registry, entry.entry_id)) == 2


async def test_device_modified(
    hass: HomeAssistant,
    mock_config_entry: MockConfigEntry,
    mocked_fing_agent: AsyncMock,
    entity_registry: er.EntityRegistry,
    freezer: FrozenDateTimeFactory,
) -> None:
    """Test Fing device modified."""

    delta_time = timedelta(seconds=35)  # 30 seconds + 5 delta seconds

    # ----------------------------------------------------

    await hass.config.async_set_time_zone("UTC")
    freezer.move_to("2021-01-09 12:00:00+00:00")
    entry = await init_integration(hass, mock_config_entry, mocked_fing_agent)

    old_entries = er.async_entries_for_config_entry(entity_registry, entry.entry_id)

    # ----------------------------------------------------

    mocked_fing_agent.get_devices.return_value = DeviceResponse(
        await async_load_json_object_fixture(
            hass, "device_resp_device_modified.json", DOMAIN
        )
    )

    freezer.tick(delta_time)
    async_fire_time_changed(hass)
    await hass.async_block_till_done()

    new_entries = er.async_entries_for_config_entry(entity_registry, entry.entry_id)

    # ----------------------------------------------------

    assert len(old_entries) == len(new_entries)

    old_entries_by_ids = {e.unique_id: e for e in old_entries}
    new_entries_by_ids = {e.unique_id: e for e in new_entries}

    unique_id = "0000000000XX-00:00:00:00:00:03"

    old_entry = old_entries_by_ids[unique_id]
    new_entry = new_entries_by_ids[unique_id]

    assert old_entry.original_name != new_entry.original_name
    assert old_entry.original_icon != new_entry.original_icon
