import json
from datetime import timezone
from zoneinfo import ZoneInfo
from unittest.mock import patch
from hyprsunset_qt.sun import to_local_hm, read_cache, write_cache, geolocate, fetch_sun


def test_utc_to_local_hm():
    # 2026-07-17T17:40:00+00:00 -> 19:40 in Europe/Rome (UTC+2 summer)
    tz = ZoneInfo("Europe/Rome")
    assert to_local_hm("2026-07-17T17:40:00+00:00", tz) == "19:40"


def test_cache_roundtrip(tmp_path):
    path = tmp_path / "sun.json"
    payload = {"lat": "45.07", "lon": "7.68", "results": {"sunset": "x"}}
    write_cache(payload, path)
    assert read_cache(path) == payload


def test_read_cache_missing(tmp_path):
    assert read_cache(tmp_path / "nope.json") is None


def test_geolocate_parses_latlon():
    body = json.dumps({"status": "success", "lat": 45.07, "lon": 7.68})
    with patch("hyprsunset_qt.sun._http_get", return_value=body):
        assert geolocate() == ("45.07", "7.68")


def test_fetch_sun_returns_results_dict():
    body = json.dumps({
        "status": "OK",
        "results": {
            "sunrise": "2026-07-17T03:12:00+00:00",
            "sunset": "2026-07-17T17:40:00+00:00",
        },
    })
    with patch("hyprsunset_qt.sun._http_get", return_value=body) as g:
        out = fetch_sun("45.07", "7.68")
        assert out["results"]["sunset"] == "2026-07-17T17:40:00+00:00"
        url = g.call_args[0][0]
        assert "lat=45.07" in url and "lng=7.68" in url and "formatted=0" in url
