"""iCalendar generation (task 2.9)."""

from datetime import UTC, datetime, timedelta

from app.services.calendar import build_ics, google_calendar_url


def _sample(**overrides: object) -> str:
    kwargs: dict = {
        "uid": "abc@example.com",
        "summary": "Walima",
        "description": "Walima of Nazifa & Abdullah",
        "location": "Rose Garden, Dhaka",
        "starts_at": datetime(2026, 9, 12, 13, 0, tzinfo=UTC),
    }
    kwargs.update(overrides)
    return build_ics(**kwargs)  # type: ignore[arg-type]


def test_structure_is_a_valid_single_event_calendar() -> None:
    ics = _sample()
    assert ics.startswith("BEGIN:VCALENDAR")
    assert ics.rstrip().endswith("END:VCALENDAR")
    assert ics.count("BEGIN:VEVENT") == 1


def test_uses_crlf_line_endings() -> None:
    """Some calendar clients genuinely reject bare LF."""
    ics = _sample()
    assert "\r\n" in ics
    assert "\n" not in ics.replace("\r\n", "")


def test_special_characters_are_escaped() -> None:
    """Commas and semicolons are field separators in this format."""
    ics = _sample(location="Hall A, Level 3; Dhaka")
    assert "Hall A\\, Level 3\\; Dhaka" in ics


def test_end_time_defaults_to_three_hours() -> None:
    ics = _sample()
    assert "DTSTART:20260912T130000Z" in ics
    assert "DTEND:20260912T160000Z" in ics


def test_explicit_end_time_is_respected() -> None:
    ics = _sample(ends_at=datetime(2026, 9, 12, 23, 30, tzinfo=UTC))
    assert "DTEND:20260912T233000Z" in ics


def test_long_lines_are_folded_with_a_leading_space() -> None:
    ics = _sample(description="x" * 300)
    for line in ics.split("\r\n"):
        assert len(line) <= 75


def test_non_utc_input_is_converted() -> None:
    dhaka = datetime(2026, 9, 12, 19, 0, tzinfo=UTC) - timedelta(hours=6)
    ics = _sample(starts_at=dhaka)
    assert "DTSTART:20260912T130000Z" in ics


def test_google_url_carries_the_event_window() -> None:
    url = google_calendar_url(
        summary="Walima",
        details="Walima of Nazifa & Abdullah",
        location="Rose Garden",
        starts_at=datetime(2026, 9, 12, 13, 0, tzinfo=UTC),
    )
    assert url.startswith("https://calendar.google.com/calendar/render?action=TEMPLATE")
    assert "dates=20260912T130000Z/20260912T160000Z" in url
    assert "text=Walima" in url
