"""Test the Hong Kong Observatory config flow."""

from unittest.mock import patch

from hko import HKOError

from homeassistant.components.hko.const import DEFAULT_LOCATION, DOMAIN
from homeassistant.config_entries import SOURCE_USER
from homeassistant.const import CONF_LOCATION
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType


async def test_config_flow_default(hass: HomeAssistant) -> None:
    """Test user config flow with default fields."""
    result = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": SOURCE_USER}
    )

    assert result["type"] is FlowResultType.FORM
    assert result["step_id"] == SOURCE_USER
    assert "flow_id" in result

    result2 = await hass.config_entries.flow.async_configure(
        result["flow_id"],
        user_input={CONF_LOCATION: DEFAULT_LOCATION},
    )

    assert result2["type"] is FlowResultType.CREATE_ENTRY
    assert result2["title"] == DEFAULT_LOCATION
    assert result2["result"].unique_id == DEFAULT_LOCATION
    assert result2["data"][CONF_LOCATION] == DEFAULT_LOCATION


async def test_config_flow_cannot_connect(hass: HomeAssistant) -> None:
    """Test user config flow without connection to the API."""
    with patch("homeassistant.components.hko.config_flow.HKO.weather") as client_mock:
        client_mock.side_effect = HKOError()
        result = await hass.config_entries.flow.async_init(
            DOMAIN,
            context={"source": SOURCE_USER},
            data={CONF_LOCATION: DEFAULT_LOCATION},
        )

        assert result["type"] is FlowResultType.FORM
        assert result["errors"]["base"] == "cannot_connect"

        client_mock.side_effect = None

        result = await hass.config_entries.flow.async_init(
            DOMAIN,
            context={"source": SOURCE_USER},
            data={CONF_LOCATION: DEFAULT_LOCATION},
        )

        assert result["type"] is FlowResultType.CREATE_ENTRY
        assert result["result"].unique_id == DEFAULT_LOCATION
        assert result["data"][CONF_LOCATION] == DEFAULT_LOCATION


async def test_config_flow_timeout(hass: HomeAssistant) -> None:
    """Test user config flow with timedout connection to the API."""
    with patch("homeassistant.components.hko.config_flow.HKO.weather") as client_mock:
        client_mock.side_effect = TimeoutError()
        result = await hass.config_entries.flow.async_init(
            DOMAIN,
            context={"source": SOURCE_USER},
            data={CONF_LOCATION: DEFAULT_LOCATION},
        )

        assert result["type"] is FlowResultType.FORM
        assert result["errors"]["base"] == "unknown"

        client_mock.side_effect = None

        result = await hass.config_entries.flow.async_init(
            DOMAIN,
            context={"source": SOURCE_USER},
            data={CONF_LOCATION: DEFAULT_LOCATION},
        )

        assert result["type"] is FlowResultType.CREATE_ENTRY
        assert result["result"].unique_id == DEFAULT_LOCATION
        assert result["data"][CONF_LOCATION] == DEFAULT_LOCATION


async def test_config_flow_already_configured(hass: HomeAssistant) -> None:
    """Test user config flow with two equal entries."""
    r1 = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": SOURCE_USER}
    )
    assert r1["type"] is FlowResultType.FORM
    assert r1["step_id"] == SOURCE_USER
    assert "flow_id" in r1
    result1 = await hass.config_entries.flow.async_configure(
        r1["flow_id"],
        user_input={CONF_LOCATION: DEFAULT_LOCATION},
    )
    assert result1["type"] is FlowResultType.CREATE_ENTRY

    r2 = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": SOURCE_USER}
    )
    assert r2["type"] is FlowResultType.FORM
    assert r2["step_id"] == SOURCE_USER
    assert "flow_id" in r2
    result2 = await hass.config_entries.flow.async_configure(
        r2["flow_id"],
        user_input={CONF_LOCATION: DEFAULT_LOCATION},
    )
    assert result2["type"] is FlowResultType.ABORT
    assert result2["reason"] == "already_configured"
