"""Tests for the Radarr component."""

from http import HTTPStatus
from unittest.mock import patch

from aiohttp.client_exceptions import ClientError

from homeassistant.components.radarr.const import DOMAIN
from homeassistant.const import (
    CONF_API_KEY,
    CONF_URL,
    CONF_VERIFY_SSL,
    CONTENT_TYPE_JSON,
)
from homeassistant.core import HomeAssistant

from tests.common import MockConfigEntry, load_fixture
from tests.test_util.aiohttp import AiohttpClientMocker

URL = "http://192.168.1.189:7887/test"
API_KEY = "MOCK_API_KEY"

MOCK_REAUTH_INPUT = {CONF_API_KEY: "test-api-key-reauth"}

MOCK_USER_INPUT = {
    CONF_URL: URL,
    CONF_API_KEY: API_KEY,
    CONF_VERIFY_SSL: False,
}

CONF_DATA = {
    CONF_URL: URL,
    CONF_API_KEY: API_KEY,
    CONF_VERIFY_SSL: False,
}


def mock_connection(
    aioclient_mock: AiohttpClientMocker,
    url: str = URL,
    error: bool = False,
    invalid_auth: bool = False,
    windows: bool = False,
    single_return: bool = False,
) -> None:
    """Mock radarr connection."""
    if error:
        mock_connection_error(
            aioclient_mock,
            url=url,
        )
        return

    if invalid_auth:
        mock_connection_invalid_auth(
            aioclient_mock,
            url=url,
        )
        return

    aioclient_mock.get(
        f"{url}/api/v3/system/status",
        text=load_fixture("radarr/system-status.json"),
        headers={"Content-Type": CONTENT_TYPE_JSON},
    )

    aioclient_mock.get(
        f"{url}/api/v3/command",
        text=load_fixture("radarr/command.json"),
        headers={"Content-Type": CONTENT_TYPE_JSON},
    )

    aioclient_mock.get(
        f"{url}/api/v3/health",
        text=load_fixture("radarr/health.json"),
        headers={"Content-Type": CONTENT_TYPE_JSON},
    )

    aioclient_mock.get(
        f"{url}/api/v3/queue",
        text=load_fixture("radarr/queue.json"),
        headers={"Content-Type": CONTENT_TYPE_JSON},
    )
    root_folder_fixture = "rootfolder-linux"

    if windows:
        root_folder_fixture = "rootfolder-windows"

    if single_return:
        root_folder_fixture = f"single-{root_folder_fixture}"

    aioclient_mock.get(
        f"{url}/api/v3/rootfolder",
        text=load_fixture(f"radarr/{root_folder_fixture}.json"),
        headers={"Content-Type": CONTENT_TYPE_JSON},
    )

    aioclient_mock.get(
        f"{url}/api/v3/movie",
        text=load_fixture("radarr/movies.json"),
        headers={"Content-Type": CONTENT_TYPE_JSON},
    )


def mock_calendar(
    aioclient_mock: AiohttpClientMocker,
    url: str = URL,
) -> None:
    """Mock radarr connection."""
    aioclient_mock.get(
        f"{url}/api/v3/calendar",
        text=load_fixture("radarr/calendar.json"),
        headers={"Content-Type": CONTENT_TYPE_JSON},
    )


def mock_connection_error(
    aioclient_mock: AiohttpClientMocker,
    url: str = URL,
) -> None:
    """Mock radarr connection errors."""
    aioclient_mock.get(f"{url}/api/v3/system/status", exc=ClientError)


def mock_connection_invalid_auth(
    aioclient_mock: AiohttpClientMocker,
    url: str = URL,
) -> None:
    """Mock radarr invalid auth errors."""
    aioclient_mock.get(f"{url}/api/v3/command", status=HTTPStatus.UNAUTHORIZED)
    aioclient_mock.get(f"{url}/api/v3/movie", status=HTTPStatus.UNAUTHORIZED)
    aioclient_mock.get(f"{url}/api/v3/queue", status=HTTPStatus.UNAUTHORIZED)
    aioclient_mock.get(f"{url}/api/v3/rootfolder", status=HTTPStatus.UNAUTHORIZED)
    aioclient_mock.get(f"{url}/api/v3/system/status", status=HTTPStatus.UNAUTHORIZED)
    aioclient_mock.get(f"{url}/api/v3/calendar", status=HTTPStatus.UNAUTHORIZED)


def mock_connection_server_error(
    aioclient_mock: AiohttpClientMocker,
    url: str = URL,
) -> None:
    """Mock radarr server errors."""
    aioclient_mock.get(f"{url}/api/v3/command", status=HTTPStatus.INTERNAL_SERVER_ERROR)
    aioclient_mock.get(f"{url}/api/v3/movie", status=HTTPStatus.INTERNAL_SERVER_ERROR)
    aioclient_mock.get(f"{url}/api/v3/queue", status=HTTPStatus.INTERNAL_SERVER_ERROR)
    aioclient_mock.get(
        f"{url}/api/v3/rootfolder", status=HTTPStatus.INTERNAL_SERVER_ERROR
    )
    aioclient_mock.get(
        f"{url}/api/v3/system/status", status=HTTPStatus.INTERNAL_SERVER_ERROR
    )
    aioclient_mock.get(
        f"{url}/api/v3/calendar", status=HTTPStatus.INTERNAL_SERVER_ERROR
    )


async def setup_integration(
    hass: HomeAssistant,
    aioclient_mock: AiohttpClientMocker,
    url: str = URL,
    api_key: str = API_KEY,
    unique_id: str | None = None,
    skip_entry_setup: bool = False,
    connection_error: bool = False,
    invalid_auth: bool = False,
    windows: bool = False,
    single_return: bool = False,
) -> MockConfigEntry:
    """Set up the radarr integration in Home Assistant."""
    entry = MockConfigEntry(
        domain=DOMAIN,
        unique_id=unique_id,
        data={
            CONF_URL: url,
            CONF_API_KEY: api_key,
            CONF_VERIFY_SSL: False,
        },
    )

    entry.add_to_hass(hass)

    mock_connection(
        aioclient_mock,
        url=url,
        error=connection_error,
        invalid_auth=invalid_auth,
        windows=windows,
        single_return=single_return,
    )

    mock_calendar(aioclient_mock, url)

    if not skip_entry_setup:
        # async_setup_entry will automatically trigger async_setup
        # which registers services
        await hass.config_entries.async_setup(entry.entry_id)
        await hass.async_block_till_done()

    return entry


def patch_async_setup_entry(return_value=True):
    """Patch the async entry setup of radarr."""
    return patch(
        "homeassistant.components.radarr.async_setup_entry",
        return_value=return_value,
    )


def create_entry(hass: HomeAssistant) -> MockConfigEntry:
    """Create Radarr entry in Home Assistant."""
    entry = MockConfigEntry(
        domain=DOMAIN,
        data={
            CONF_URL: URL,
            CONF_API_KEY: API_KEY,
            CONF_VERIFY_SSL: False,
        },
    )

    entry.add_to_hass(hass)
    return entry
