"""Common fixtures for the Cookidoo tests."""

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

from cookidoo_api import (
    CookidooAdditionalItem,
    CookidooAuthResponse,
    CookidooIngredientItem,
    CookidooSubscription,
    CookidooUserInfo,
)
from cookidoo_api.types import CookidooCalendarDay, CookidooCalendarDayRecipe
import pytest

from homeassistant.components.cookidoo.const import DOMAIN
from homeassistant.const import CONF_COUNTRY, CONF_EMAIL, CONF_LANGUAGE, CONF_PASSWORD

from tests.common import MockConfigEntry, load_json_object_fixture

EMAIL = "test-email"
PASSWORD = "test-password"
COUNTRY = "CH"
LANGUAGE = "de-CH"

TEST_UUID = "sub_uuid"


@pytest.fixture
def mock_setup_entry() -> Generator[AsyncMock]:
    """Override async_setup_entry."""
    with patch(
        "homeassistant.components.cookidoo.async_setup_entry", return_value=True
    ) as mock_setup_entry:
        yield mock_setup_entry


@pytest.fixture
def mock_cookidoo_client() -> Generator[AsyncMock]:
    """Mock a Cookidoo client."""
    with patch(
        "homeassistant.components.cookidoo.helpers.Cookidoo",
        autospec=True,
    ) as mock_client:
        client = mock_client.return_value
        client.login.return_value = cast(CookidooAuthResponse, {"name": "Cookidoo"})
        client.get_ingredient_items.return_value = [
            CookidooIngredientItem(**item)
            for item in load_json_object_fixture("ingredient_items.json", DOMAIN)[
                "data"
            ]
        ]
        client.get_additional_items.return_value = [
            CookidooAdditionalItem(**item)
            for item in load_json_object_fixture("additional_items.json", DOMAIN)[
                "data"
            ]
        ]
        client.get_active_subscription.return_value = CookidooSubscription(
            **load_json_object_fixture("subscriptions.json", DOMAIN)["data"]
        )
        client.get_user_info.return_value = CookidooUserInfo(
            **load_json_object_fixture("user_info.json", DOMAIN)["data"]
        )
        client.login.return_value = CookidooAuthResponse(
            **load_json_object_fixture("login.json", DOMAIN)
        )
        client.get_recipes_in_calendar_week.return_value = [
            CookidooCalendarDay(
                id=day["id"],
                title=day["title"],
                recipes=[
                    CookidooCalendarDayRecipe(
                        id=recipe["id"],
                        name=recipe["name"],
                        total_time=recipe["total_time"],
                    )
                    for recipe in day["recipes"]
                ],
            )
            for day in load_json_object_fixture("calendar_week.json", DOMAIN)["data"]
        ]
        yield client


@pytest.fixture(name="cookidoo_config_entry")
def mock_cookidoo_config_entry() -> MockConfigEntry:
    """Mock cookidoo configuration entry."""
    return MockConfigEntry(
        domain=DOMAIN,
        version=1,
        minor_version=2,
        data={
            CONF_EMAIL: EMAIL,
            CONF_PASSWORD: PASSWORD,
            CONF_COUNTRY: COUNTRY,
            CONF_LANGUAGE: LANGUAGE,
        },
        entry_id="01JBVVVJ87F6G5V0QJX6HBC94T",
        unique_id=TEST_UUID,
    )
