"""Test Emoncms component setup process."""

from unittest.mock import AsyncMock

from homeassistant.components.emoncms.const import DOMAIN, FEED_ID, FEED_NAME
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er, issue_registry as ir

from . import setup_integration
from .conftest import EMONCMS_FAILURE, FEEDS

from tests.common import MockConfigEntry


async def test_load_unload_entry(
    hass: HomeAssistant,
    config_entry: MockConfigEntry,
    emoncms_client: AsyncMock,
) -> None:
    """Test load and unload entry."""
    await setup_integration(hass, config_entry)

    assert config_entry.state is ConfigEntryState.LOADED

    await hass.config_entries.async_unload(config_entry.entry_id)
    await hass.async_block_till_done()

    assert config_entry.state is ConfigEntryState.NOT_LOADED


async def test_failure(
    hass: HomeAssistant,
    config_entry: MockConfigEntry,
    emoncms_client: AsyncMock,
) -> None:
    """Test load failure."""
    emoncms_client.async_request.return_value = EMONCMS_FAILURE
    config_entry.add_to_hass(hass)
    assert not await hass.config_entries.async_setup(config_entry.entry_id)


async def test_migrate_uuid(
    hass: HomeAssistant,
    config_entry: MockConfigEntry,
    entity_registry: er.EntityRegistry,
    emoncms_client: AsyncMock,
) -> None:
    """Test migration from home assistant uuid to emoncms uuid."""
    config_entry.add_to_hass(hass)
    assert config_entry.unique_id is None
    for _, feed in enumerate(FEEDS):
        entity_registry.async_get_or_create(
            Platform.SENSOR,
            DOMAIN,
            f"{config_entry.entry_id}-{feed[FEED_ID]}",
            config_entry=config_entry,
            suggested_object_id=f"{DOMAIN}_{feed[FEED_NAME]}",
        )
    assert await hass.config_entries.async_setup(config_entry.entry_id)
    await hass.async_block_till_done()
    emoncms_uuid = emoncms_client.async_get_uuid.return_value
    assert config_entry.unique_id == emoncms_uuid
    entity_entries = er.async_entries_for_config_entry(
        entity_registry, config_entry.entry_id
    )

    for nb, feed in enumerate(FEEDS):
        assert entity_entries[nb].unique_id == f"{emoncms_uuid}-{feed[FEED_ID]}"
        assert (
            entity_entries[nb].previous_unique_id
            == f"{config_entry.entry_id}-{feed[FEED_ID]}"
        )


async def test_no_uuid(
    hass: HomeAssistant,
    config_entry: MockConfigEntry,
    issue_registry: ir.IssueRegistry,
    emoncms_client: AsyncMock,
) -> None:
    """Test an issue is created when the emoncms server does not ship an uuid."""
    emoncms_client.async_get_uuid.return_value = None
    await setup_integration(hass, config_entry)

    assert issue_registry.async_get_issue(domain=DOMAIN, issue_id="migrate database")
