"""Test the Enigma2 config flow."""

from collections.abc import Generator
from unittest.mock import AsyncMock, patch

from openwebif.api import OpenWebIfDevice, OpenWebIfServiceEvent, OpenWebIfStatus
import pytest

from homeassistant.components.enigma2.const import (
    CONF_DEEP_STANDBY,
    CONF_SOURCE_BOUQUET,
    CONF_USE_CHANNEL_ICON,
    DEFAULT_DEEP_STANDBY,
    DEFAULT_PORT,
    DEFAULT_SSL,
    DEFAULT_VERIFY_SSL,
    DOMAIN,
)
from homeassistant.const import (
    CONF_HOST,
    CONF_PASSWORD,
    CONF_PORT,
    CONF_SSL,
    CONF_USERNAME,
    CONF_VERIFY_SSL,
)

from tests.common import MockConfigEntry, load_json_object_fixture

MAC_ADDRESS = "12:34:56:78:90:ab"

TEST_REQUIRED = {
    CONF_HOST: "1.1.1.1",
    CONF_PORT: DEFAULT_PORT,
    CONF_SSL: DEFAULT_SSL,
    CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL,
}

TEST_FULL = {
    CONF_HOST: "1.1.1.1",
    CONF_PORT: DEFAULT_PORT,
    CONF_SSL: DEFAULT_SSL,
    CONF_USERNAME: "root",
    CONF_PASSWORD: "password",
    CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL,
}

EXPECTED_OPTIONS = {
    CONF_DEEP_STANDBY: DEFAULT_DEEP_STANDBY,
    CONF_SOURCE_BOUQUET: "Favourites",
    CONF_USE_CHANNEL_ICON: False,
}


@pytest.fixture
def mock_config_entry() -> MockConfigEntry:
    """Return the default mocked config entry."""
    return MockConfigEntry(
        domain=DOMAIN, data=TEST_REQUIRED, unique_id="12:34:56:78:90:ab"
    )


@pytest.fixture
def openwebif_device_mock() -> Generator[AsyncMock]:
    """Mock a OpenWebIf device."""

    with (
        patch(
            "homeassistant.components.enigma2.coordinator.OpenWebIfDevice",
            spec=OpenWebIfDevice,
        ) as openwebif_device_mock,
        patch(
            "homeassistant.components.enigma2.config_flow.OpenWebIfDevice",
            new=openwebif_device_mock,
        ),
    ):
        device = openwebif_device_mock.return_value
        device.status = OpenWebIfStatus(currservice=OpenWebIfServiceEvent())
        device.turn_off_to_deep = False
        device.sources = {"Test": "1"}
        device.source_list = list(device.sources.keys())
        device.picon_url = "file:///"
        device.get_about.return_value = load_json_object_fixture(
            "device_about.json", DOMAIN
        )
        device.get_status_info.return_value = load_json_object_fixture(
            "device_statusinfo_on.json", DOMAIN
        )
        device.get_all_bouquets.return_value = {
            "bouquets": [
                [
                    (
                        "1:7:1:0:0:0:0:0:0:0:FROM BOUQUET"
                        ' "userbouquet.favourites.tv"'
                        " ORDER BY bouquet"
                    ),
                    "Favourites (TV)",
                ]
            ]
        }
        yield device
