from __future__ import annotations

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

from fastapi.testclient import TestClient

from jarvis_gateway.main import create_app
from jarvis_gateway.services.overview_service import OverviewService

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


def test_overview_safe_marker_mode_is_stable(monkeypatch, tmp_path: Path) -> None:
    payload = json.loads((FIXTURES / "valid_fresh.json").read_text(encoding="utf-8"))
    now = datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")
    payload["generated_at"] = now
    payload["last_success_at"] = now
    marker = tmp_path / "safe.json"
    marker.write_text(json.dumps(payload), encoding="utf-8")
    monkeypatch.setenv("HEALTH_ADAPTER_MODE", "safe_marker")
    monkeypatch.setenv("HEALTH_SAFE_STATUS_MARKER_PATH", str(marker))

    overview = OverviewService.from_config().build_overview()
    health = next(module for module in overview.modules if module.module_id == "health")
    assert health.source_health.source_type == "safe_marker"
    assert health.status == "ok"
    assert len(health.kpis) <= 3
    assert str(marker) not in json.dumps(overview.model_dump(mode="json"))


def test_api_overview_does_not_crash_for_missing_safe_marker(monkeypatch) -> None:
    monkeypatch.setenv("HEALTH_ADAPTER_MODE", "safe_marker")
    monkeypatch.delenv("HEALTH_SAFE_STATUS_MARKER_PATH", raising=False)
    client = TestClient(create_app())
    response = client.get("/api/overview")
    assert response.status_code == 200
    payload = response.json()
    health = next(module for module in payload["modules"] if module["module_id"] == "health")
    assert health["status"] in {"degraded", "offline"}
    assert health["source_health"]["source_type"] == "safe_marker"


def test_modules_endpoint_reports_safe_marker_without_path(monkeypatch, tmp_path: Path) -> None:
    marker = tmp_path / "safe.json"
    marker.write_text((FIXTURES / "valid_fresh.json").read_text(encoding="utf-8"), encoding="utf-8")
    monkeypatch.setenv("HEALTH_ADAPTER_MODE", "safe_marker")
    monkeypatch.setenv("HEALTH_SAFE_STATUS_MARKER_PATH", str(marker))
    client = TestClient(create_app())
    response = client.get("/api/modules")
    assert response.status_code == 200
    text = response.text
    assert str(marker) not in text
    health = next(module for module in response.json() if module["module_id"] == "health")
    assert health["source_type"] == "safe_marker"
    assert health["runtime_base_env"] == "HEALTH_SAFE_STATUS_MARKER_PATH"
