"""Tests for timezone-aware datetime parsing in reservation tools."""

from __future__ import annotations

from datetime import UTC
from unittest.mock import MagicMock

import pytest

from app.agents.tools.reservation import parse_restaurant_local_datetime

pytestmark = pytest.mark.anyio


def _restaurant_with_tz(tz: str | None) -> MagicMock:
    restaurant = MagicMock()
    restaurant.timezone = tz
    return restaurant


def test_amsterdam_summer_cest() -> None:
    """19:00 Amsterdam summer (CEST, UTC+2) -> 17:00 UTC."""
    restaurant = _restaurant_with_tz("Europe/Amsterdam")

    result = parse_restaurant_local_datetime("2026-07-15", "19:00", restaurant)
    utc_result = result.astimezone(UTC)

    assert result.tzinfo is not None
    assert utc_result.hour == 17
    assert utc_result.minute == 0


def test_amsterdam_winter_cet() -> None:
    """19:00 Amsterdam winter (CET, UTC+1) -> 18:00 UTC."""
    restaurant = _restaurant_with_tz("Europe/Amsterdam")

    result = parse_restaurant_local_datetime("2026-01-15", "19:00", restaurant)
    utc_result = result.astimezone(UTC)

    assert utc_result.hour == 18
    assert utc_result.minute == 0


def test_missing_timezone_defaults_to_amsterdam() -> None:
    """When restaurant.timezone is None, default to Europe/Amsterdam."""
    restaurant = _restaurant_with_tz(None)

    result = parse_restaurant_local_datetime("2026-07-15", "19:00", restaurant)
    utc_result = result.astimezone(UTC)

    assert utc_result.hour == 17


def test_empty_timezone_defaults_to_amsterdam() -> None:
    restaurant = _restaurant_with_tz("")

    result = parse_restaurant_local_datetime("2026-07-15", "19:00", restaurant)
    utc_result = result.astimezone(UTC)

    assert utc_result.hour == 17


def test_invalid_timezone_falls_back_to_amsterdam() -> None:
    restaurant = _restaurant_with_tz("Invalid/Timezone")

    result = parse_restaurant_local_datetime("2026-07-15", "19:00", restaurant)
    utc_result = result.astimezone(UTC)

    assert utc_result.hour == 17


def test_none_restaurant_defaults_to_amsterdam() -> None:
    """When restaurant is None entirely."""
    result = parse_restaurant_local_datetime("2026-07-15", "19:00", None)
    utc_result = result.astimezone(UTC)

    assert utc_result.hour == 17


def test_invalid_date_raises_value_error() -> None:
    restaurant = _restaurant_with_tz("Europe/Amsterdam")

    with pytest.raises(ValueError):
        parse_restaurant_local_datetime("not-a-date", "19:00", restaurant)


def test_different_timezone() -> None:
    """US/Eastern: 19:00 summer (EDT, UTC-4) -> 23:00 UTC."""
    restaurant = _restaurant_with_tz("US/Eastern")

    result = parse_restaurant_local_datetime("2026-07-15", "19:00", restaurant)
    utc_result = result.astimezone(UTC)

    assert utc_result.hour == 23
