"""
Tests for ``bal.gui.qt.calendar``.

Covers BalCalendar static methods: format_time, ical_escape, fold_ical_line,
write_temp_ics, open_with_default_app.

Run:
    QT_QPA_PLATFORM=offscreen python3 tests/test_gui_calendar.py
"""

import os
import sys
from datetime import datetime, timezone

sys.path.insert(0, __file__.rsplit("/", 2)[0])

from bal.gui.qt.calendar import BalCalendar

# ------------------------------------------------------------------ #
# format_time
# ------------------------------------------------------------------ #

def test_format_time_utc():
    dt = datetime(2025, 6, 1, 12, 30, 45, tzinfo=timezone.utc)
    assert BalCalendar.format_time(dt) == "20250601T123045Z"


def test_format_time_non_utc():
    from datetime import timedelta
    tz = timezone(timedelta(hours=2))
    dt = datetime(2025, 1, 15, 8, 0, 0, tzinfo=tz)
    result = BalCalendar.format_time(dt)
    assert result.endswith("Z")
    assert result == "20250115T060000Z"


# ------------------------------------------------------------------ #
# ical_escape
# ------------------------------------------------------------------ #

def test_ical_escape_no_change():
    text = "hello world"
    assert BalCalendar.ical_escape(text) == "hello world"


def test_ical_escape_backslash():
    assert BalCalendar.ical_escape("a\\b") == "a\\\\b"


def test_ical_escape_semicolon():
    assert BalCalendar.ical_escape("a;b") == "a\\;b"


def test_ical_escape_comma():
    assert BalCalendar.ical_escape("a,b") == "a\\,b"


def test_ical_escape_multiline():
    text = "line1\r\nline2"
    result = BalCalendar.ical_escape(text)
    assert "\r\n" in result
    assert "line1" in result
    assert "line2" in result


def test_ical_escape_all():
    text = "\\;,"
    assert BalCalendar.ical_escape(text) == "\\\\\\;\\,"


# ------------------------------------------------------------------ #
# fold_ical_line
# ------------------------------------------------------------------ #

def test_fold_ical_line_short():
    line = "SUMMARY:Test"
    assert BalCalendar.fold_ical_line(line) == "SUMMARY:Test"


def test_fold_ical_line_long():
    line = "X-LONG:" + "a" * 100
    result = BalCalendar.fold_ical_line(line, limit=75)
    parts = result.split("\r\n ")
    assert len(parts) > 1
    assert result.startswith("X-LONG:")


def test_fold_ical_line_unicode():
    line = "DESCRIPTION:" + "\u20ac" * 40
    result = BalCalendar.fold_ical_line(line, limit=75)
    assert "\r\n " in result
    assert "\u20ac" in result


# ------------------------------------------------------------------ #
# write_temp_ics
# ------------------------------------------------------------------ #

def test_write_temp_ics():
    content = "BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n"
    path = BalCalendar.write_temp_ics(content)
    try:
        assert os.path.isfile(path)
        with open(path, "rb") as f:
            assert f.read() == content.encode("utf-8")
    finally:
        os.unlink(path)


def test_write_temp_ics_empty():
    path = BalCalendar.write_temp_ics("")
    try:
        assert os.path.isfile(path)
        with open(path, "rb") as f:
            assert f.read() == b""
    finally:
        os.unlink(path)


# ------------------------------------------------------------------ #
# open_with_default_app
# ------------------------------------------------------------------ #

def test_open_with_default_app_not_found():
    result = BalCalendar.open_with_default_app(
        "/nonexistent/calendar_app", "/tmp/fake.ics"
    )
    assert result is False


# ------------------------------------------------------------------ #
# Main
# ------------------------------------------------------------------ #

if __name__ == "__main__":
    for name in sorted(dir()):
        if name.startswith("test_"):
            globals()[name]()
            print(f"  [OK] {name}")
    print("[OK] All calendar tests passed")
