from __future__ import annotations

import json
from datetime import datetime, timedelta, timezone
from pathlib import Path

from jarvis_gateway.adapters.health_safe_marker import HealthSafeMarkerAdapter

FIXTURES = Path(__file__).parent / "fixtures" / "health_safe_marker"


def write_marker(tmp_path: Path, fixture_name: str, *, generated_at: datetime | None = None) -> Path:
    payload = json.loads((FIXTURES / fixture_name).read_text(encoding="utf-8"))
    if generated_at is not None:
        payload["generated_at"] = generated_at.isoformat().replace("+00:00", "Z")
        if payload.get("last_success_at") is not None:
            payload["last_success_at"] = payload["generated_at"]
    path = tmp_path / "marker.json"
    path.write_text(json.dumps(payload), encoding="utf-8")
    return path


def snapshot_for(tmp_path: Path, fixture_name: str, *, generated_at: datetime | None = None, max_age_hours: int = 72):
    path = write_marker(tmp_path, fixture_name, generated_at=generated_at)
    return HealthSafeMarkerAdapter(str(path), max_age_hours=max_age_hours).get_snapshot()


def test_valid_fresh_marker_generates_safe_module_snapshot(tmp_path: Path) -> None:
    snap = snapshot_for(tmp_path, "valid_fresh.json", generated_at=datetime.now(timezone.utc))
    assert snap.module_id == "health"
    assert snap.status == "ok"
    assert snap.source_health.source_type == "safe_marker"
    assert snap.source_health.contract_version == "health.safe_status_marker.v1"
    assert snap.primary_action and snap.primary_action.href == "/health"
    assert snap.primary_action.mode == "link_only"
    assert len(snap.kpis) == 3
    assert [k.label for k in snap.kpis] == ["Pipeline Freshness", "Backup Freshness", "Review Count"]


def test_valid_stale_marker_generates_attention_item(tmp_path: Path) -> None:
    snap = snapshot_for(tmp_path, "valid_stale.json", generated_at=datetime.now(timezone.utc))
    assert snap.status == "attention"
    titles = {item.title for item in snap.attention_items}
    assert "Health Pipeline stale" in titles
    assert "Health Review required" in titles


def test_valid_degraded_marker_remains_contract_conform(tmp_path: Path) -> None:
    snap = snapshot_for(tmp_path, "valid_degraded.json", generated_at=datetime.now(timezone.utc))
    assert snap.status == "degraded"
    assert snap.source_health.source_type == "safe_marker"
    assert len(snap.kpis) <= 3


def test_missing_marker_path_returns_safe_offline_snapshot() -> None:
    snap = HealthSafeMarkerAdapter(None).get_snapshot()
    assert snap.status == "offline"
    assert snap.source_health.reachable is False
    assert snap.source_health.source_type == "safe_marker"


def test_broken_json_returns_safe_degraded_snapshot(tmp_path: Path) -> None:
    marker = tmp_path / "broken.json"
    marker.write_text("{", encoding="utf-8")
    snap = HealthSafeMarkerAdapter(str(marker)).get_snapshot()
    assert snap.status == "degraded"
    assert snap.source_health.last_error_redacted


def test_old_marker_beyond_max_age_degrades(tmp_path: Path) -> None:
    old = datetime.now(timezone.utc) - timedelta(hours=73)
    snap = snapshot_for(tmp_path, "valid_fresh.json", generated_at=old, max_age_hours=72)
    assert snap.status == "degraded"
    assert snap.source_health.stale is True
    assert "Health Pipeline stale" in {item.title for item in snap.attention_items}
