"""Common fixtures for PAJ GPS integration tests."""

from __future__ import annotations

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

from pajgps_api.models.auth import AuthResponse
from pajgps_api.models.device import Device
from pajgps_api.models.trackpoint import TrackPoint
import pytest

from homeassistant.components.paj_gps.const import DOMAIN
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD

from tests.common import MockConfigEntry, load_json_object_fixture


@pytest.fixture
def mock_setup_entry() -> Generator[AsyncMock]:
    """Prevent the PAJ GPS integration from setting up during config flow tests."""
    with patch(
        "homeassistant.components.paj_gps.async_setup_entry",
        return_value=True,
    ) as mock:
        yield mock


@pytest.fixture
def mock_config_entry() -> MockConfigEntry:
    """Return a mock config entry for PAJ GPS."""
    return MockConfigEntry(
        domain=DOMAIN,
        title="test@example.com",
        unique_id="42",
        data={
            CONF_EMAIL: "test@example.com",
            CONF_PASSWORD: "secret",
        },
    )


@pytest.fixture
def mock_paj_gps_api() -> Generator[AsyncMock]:
    """Mock PajGpsApi for PAJ GPS integration tests."""
    with (
        patch(
            "homeassistant.components.paj_gps.coordinator.PajGpsApi",
            autospec=True,
        ) as mock_api_cls,
        patch(
            "homeassistant.components.paj_gps.config_flow.PajGpsApi",
            new=mock_api_cls,
        ),
    ):
        api = mock_api_cls.return_value
        api.login.return_value = AuthResponse(
            userID=42, token="test_token", refresh_token="test_refresh"
        )
        api.get_devices.return_value = [
            Device(**load_json_object_fixture("device.json", DOMAIN))
        ]
        api.get_all_last_positions.return_value = [
            TrackPoint(**load_json_object_fixture("trackpoint.json", DOMAIN))
        ]
        yield api
