"""Test repairs handling for Sonos."""
from unittest.mock import Mock

from homeassistant.components.sonos.const import (
    DOMAIN,
    SCAN_INTERVAL,
    SUB_FAIL_ISSUE_ID,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.issue_registry import async_get as async_get_issue_registry
from homeassistant.util import dt as dt_util

from .conftest import SonosMockEvent

from tests.common import MockConfigEntry, async_fire_time_changed


async def test_subscription_repair_issues(
    hass: HomeAssistant, config_entry: MockConfigEntry, soco, zgs_discovery
) -> None:
    """Test repair issues handling for failed subscriptions."""
    issue_registry = async_get_issue_registry(hass)

    subscription = soco.zoneGroupTopology.subscribe.return_value
    subscription.event_listener = Mock(address=("192.168.4.2", 1400))

    config_entry.add_to_hass(hass)
    assert await hass.config_entries.async_setup(config_entry.entry_id)
    await hass.async_block_till_done()

    # Ensure an issue is registered on subscription failure
    async_fire_time_changed(hass, dt_util.utcnow() + SCAN_INTERVAL)
    await hass.async_block_till_done()
    assert issue_registry.async_get_issue(DOMAIN, SUB_FAIL_ISSUE_ID)

    # Ensure the issue still exists after reload
    assert await hass.config_entries.async_reload(config_entry.entry_id)
    await hass.async_block_till_done()
    assert issue_registry.async_get_issue(DOMAIN, SUB_FAIL_ISSUE_ID)

    # Ensure the issue has been removed after a successful subscription callback
    variables = {"ZoneGroupState": zgs_discovery}
    event = SonosMockEvent(soco, soco.zoneGroupTopology, variables)
    sub_callback = subscription.callback
    sub_callback(event)
    await hass.async_block_till_done()
    assert not issue_registry.async_get_issue(DOMAIN, SUB_FAIL_ISSUE_ID)