"""Fixtures for Google Time Travel tests."""

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

from google.maps.routing_v2 import ComputeRoutesResponse, Route
from google.protobuf import duration_pb2
from google.type import localized_text_pb2
import pytest

from homeassistant.components.google_travel_time.const import DEFAULT_NAME, DOMAIN
from homeassistant.core import HomeAssistant

from tests.common import MockConfigEntry


@pytest.fixture(name="mock_config")
async def mock_config_fixture(
    hass: HomeAssistant, data: dict[str, Any], options: dict[str, Any]
) -> MockConfigEntry:
    """Mock a Google Travel Time config entry."""
    config_entry = MockConfigEntry(
        domain=DOMAIN,
        title=DEFAULT_NAME,
        data=data,
        options=options,
        entry_id="test",
    )
    config_entry.add_to_hass(hass)
    await hass.config_entries.async_setup(config_entry.entry_id)
    await hass.async_block_till_done()
    return config_entry


@pytest.fixture
def mock_setup_entry() -> Generator[None]:
    """Bypass entry setup."""
    with patch(
        "homeassistant.components.google_travel_time.async_setup_entry",
        return_value=True,
    ):
        yield


@pytest.fixture
def routes_mock() -> Generator[AsyncMock]:
    """Return valid API result."""
    with (
        patch(
            "homeassistant.components.google_travel_time.helpers.RoutesAsyncClient",
            autospec=True,
        ) as mock_client,
        patch(
            "homeassistant.components.google_travel_time.sensor.RoutesAsyncClient",
            new=mock_client,
        ),
        patch(
            "homeassistant.components.google_travel_time.services.RoutesAsyncClient",
            new=mock_client,
        ),
    ):
        client_mock = mock_client.return_value
        client_mock.compute_routes.return_value = ComputeRoutesResponse(
            mapping={
                "routes": [
                    Route(
                        mapping={
                            "localized_values": Route.RouteLocalizedValues(
                                mapping={
                                    "distance": localized_text_pb2.LocalizedText(
                                        text="21.3 km"
                                    ),
                                    "duration": localized_text_pb2.LocalizedText(
                                        text="27 mins"
                                    ),
                                    "static_duration": localized_text_pb2.LocalizedText(
                                        text="26 mins"
                                    ),
                                }
                            ),
                            "duration": duration_pb2.Duration(seconds=1620),
                            "distance_meters": 21300,
                        }
                    )
                ]
            }
        )
        yield client_mock
