"""Define tests for AirVisual init."""
from unittest.mock import patch

from homeassistant.components.airvisual import (
    CONF_CITY,
    CONF_GEOGRAPHIES,
    CONF_INTEGRATION_TYPE,
    DOMAIN,
    INTEGRATION_TYPE_GEOGRAPHY_COORDS,
    INTEGRATION_TYPE_GEOGRAPHY_NAME,
    INTEGRATION_TYPE_NODE_PRO,
)
from homeassistant.components.airvisual_pro import DOMAIN as AIRVISUAL_PRO_DOMAIN
from homeassistant.const import (
    CONF_API_KEY,
    CONF_COUNTRY,
    CONF_IP_ADDRESS,
    CONF_LATITUDE,
    CONF_LONGITUDE,
    CONF_PASSWORD,
    CONF_STATE,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, issue_registry as ir

from .conftest import (
    COORDS_CONFIG,
    COORDS_CONFIG2,
    NAME_CONFIG,
    TEST_API_KEY,
    TEST_CITY,
    TEST_COUNTRY,
    TEST_LATITUDE,
    TEST_LATITUDE2,
    TEST_LONGITUDE,
    TEST_LONGITUDE2,
    TEST_STATE,
)

from tests.common import MockConfigEntry


async def test_migration_1_2(hass: HomeAssistant, mock_pyairvisual) -> None:
    """Test migrating from version 1 to 2."""
    entry = MockConfigEntry(
        domain=DOMAIN,
        unique_id=TEST_API_KEY,
        data={
            CONF_API_KEY: TEST_API_KEY,
            CONF_GEOGRAPHIES: [
                {
                    CONF_LATITUDE: TEST_LATITUDE,
                    CONF_LONGITUDE: TEST_LONGITUDE,
                },
                {
                    CONF_CITY: TEST_CITY,
                    CONF_STATE: TEST_STATE,
                    CONF_COUNTRY: TEST_COUNTRY,
                },
                {
                    CONF_LATITUDE: TEST_LATITUDE2,
                    CONF_LONGITUDE: TEST_LONGITUDE2,
                },
            ],
        },
        version=1,
    )
    entry.add_to_hass(hass)

    assert await hass.config_entries.async_setup(entry.entry_id)
    await hass.async_block_till_done()

    config_entries = hass.config_entries.async_entries(DOMAIN)
    assert len(config_entries) == 3

    # Ensure that after migration, each configuration has its own config entry:
    identifier1 = f"{TEST_LATITUDE}, {TEST_LONGITUDE}"
    assert config_entries[0].unique_id == identifier1
    assert config_entries[0].title == f"Cloud API ({identifier1})"
    assert config_entries[0].data == {
        **COORDS_CONFIG,
        CONF_INTEGRATION_TYPE: INTEGRATION_TYPE_GEOGRAPHY_COORDS,
    }

    identifier2 = f"{TEST_CITY}, {TEST_STATE}, {TEST_COUNTRY}"
    assert config_entries[1].unique_id == identifier2
    assert config_entries[1].title == f"Cloud API ({identifier2})"
    assert config_entries[1].data == {
        **NAME_CONFIG,
        CONF_INTEGRATION_TYPE: INTEGRATION_TYPE_GEOGRAPHY_NAME,
    }

    identifier3 = f"{TEST_LATITUDE2}, {TEST_LONGITUDE2}"
    assert config_entries[2].unique_id == identifier3
    assert config_entries[2].title == f"Cloud API ({identifier3})"
    assert config_entries[2].data == {
        **COORDS_CONFIG2,
        CONF_INTEGRATION_TYPE: INTEGRATION_TYPE_GEOGRAPHY_COORDS,
    }


async def test_migration_2_3(hass: HomeAssistant, mock_pyairvisual) -> None:
    """Test migrating from version 2 to 3."""
    entry = MockConfigEntry(
        domain=DOMAIN,
        unique_id="192.168.1.100",
        data={
            CONF_IP_ADDRESS: "192.168.1.100",
            CONF_PASSWORD: "abcde12345",
            CONF_INTEGRATION_TYPE: INTEGRATION_TYPE_NODE_PRO,
        },
        version=2,
    )
    entry.add_to_hass(hass)

    device_registry = dr.async_get(hass)
    device_registry.async_get_or_create(
        name="192.168.1.100",
        config_entry_id=entry.entry_id,
        identifiers={(DOMAIN, "SERIAL_NUMBER")},
    )

    with patch(
        "homeassistant.components.airvisual.automation.automations_with_device",
        return_value=["automation.test_automation"],
    ):
        await hass.config_entries.async_setup(entry.entry_id)
        await hass.async_block_till_done()

        # Ensure that after migration, the AirVisual Pro device has been moved to the
        # `airvisual_pro` domain and an issue has been created:
        for domain, entry_count in ((DOMAIN, 0), (AIRVISUAL_PRO_DOMAIN, 1)):
            assert len(hass.config_entries.async_entries(domain)) == entry_count

        issue_registry = ir.async_get(hass)
        assert len(issue_registry.issues) == 1