"""Fixtures for tests."""

import time
from unittest.mock import AsyncMock, patch

from monzopy.monzopy import UserAccount
import pytest

from homeassistant.components.application_credentials import (
    ClientCredential,
    async_import_client_credential,
)
from homeassistant.components.monzo.api import AuthenticatedMonzoAPI
from homeassistant.components.monzo.const import DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component

from tests.common import MockConfigEntry

CLIENT_ID = "1234"
CLIENT_SECRET = "5678"
TEST_ACCOUNTS = [
    {
        "id": "acc_curr",
        "name": "Current Account",
        "type": "uk_retail",
        "balance": {"balance": 123, "total_balance": 321},
    },
    {
        "id": "acc_flex",
        "name": "Flex",
        "type": "uk_monzo_flex",
        "balance": {"balance": 123, "total_balance": 321},
    },
]
TEST_POTS = [
    {
        "id": "pot_savings",
        "name": "Savings",
        "style": "savings",
        "balance": 134578,
        "currency": "GBP",
        "type": "instant_access",
    }
]
TITLE = "jake"
USER_ID = 12345


@pytest.fixture(autouse=True)
async def setup_credentials(hass: HomeAssistant) -> None:
    """Fixture to setup credentials."""
    assert await async_setup_component(hass, "application_credentials", {})
    await async_import_client_credential(
        hass,
        DOMAIN,
        ClientCredential(CLIENT_ID, CLIENT_SECRET, DOMAIN),
    )


@pytest.fixture(name="expires_at")
def mock_expires_at() -> int:
    """Fixture to set the oauth token expiration time."""
    return time.time() + 3600


@pytest.fixture
def polling_config_entry(expires_at: int) -> MockConfigEntry:
    """Create Monzo entry in Home Assistant."""
    return MockConfigEntry(
        domain=DOMAIN,
        title=TITLE,
        unique_id=str(USER_ID),
        data={
            "auth_implementation": DOMAIN,
            "token": {
                "status": 0,
                "userid": str(USER_ID),
                "access_token": "mock-access-token",
                "refresh_token": "mock-refresh-token",
                "expires_in": 60,
                "expires_at": time.time() + 1000,
            },
            "profile": TITLE,
        },
    )


@pytest.fixture(name="basic_monzo")
def mock_basic_monzo():
    """Mock monzo with one pot."""

    mock = AsyncMock(spec=AuthenticatedMonzoAPI)
    mock_user_account = AsyncMock(spec=UserAccount)

    mock_user_account.accounts.return_value = []

    mock_user_account.pots.return_value = TEST_POTS

    mock.user_account = mock_user_account

    with patch(
        "homeassistant.components.monzo.AuthenticatedMonzoAPI",
        return_value=mock,
    ):
        yield mock


@pytest.fixture(name="monzo")
def mock_monzo():
    """Mock monzo."""

    mock = AsyncMock(spec=AuthenticatedMonzoAPI)
    mock_user_account = AsyncMock(spec=UserAccount)

    mock_user_account.accounts.return_value = TEST_ACCOUNTS
    mock_user_account.pots.return_value = TEST_POTS

    mock.user_account = mock_user_account

    with patch(
        "homeassistant.components.monzo.AuthenticatedMonzoAPI",
        return_value=mock,
    ):
        yield mock