from __future__ import annotations

import json
from pathlib import Path

from jarvis_gateway.adapters.health_safe_marker import HealthSafeMarkerAdapter

FIXTURES = Path(__file__).parent / "fixtures" / "health_safe_marker"
FORBIDDEN_OUTPUT = [
    "/tmp/",
    "/home/agent",
    "marker.json",
    "diagnosis",
    "BLOCKED_SYNTHETIC",
    "health" + "_data.db",
    "Traceback",
]


def write_fixture(tmp_path: Path, name: str) -> Path:
    target = tmp_path / name
    target.write_text((FIXTURES / name).read_text(encoding="utf-8"), encoding="utf-8")
    return target


def dumped(snapshot) -> str:
    return json.dumps(snapshot.model_dump(mode="json"), sort_keys=True)


def test_marker_path_never_appears_in_output(tmp_path: Path) -> None:
    marker = write_fixture(tmp_path, "valid_fresh.json")
    snap = HealthSafeMarkerAdapter(str(marker), max_age_hours=99999).get_snapshot()
    text = dumped(snap)
    assert str(marker) not in text
    assert marker.name not in text


def test_paths_are_rejected_and_redacted(tmp_path: Path) -> None:
    marker = write_fixture(tmp_path, "invalid_path_leak.json")
    snap = HealthSafeMarkerAdapter(str(marker), max_age_hours=99999).get_snapshot()
    text = dumped(snap)
    assert snap.status == "degraded"
    for forbidden in FORBIDDEN_OUTPUT:
        assert forbidden not in text


def test_sensitive_health_terms_are_blocked_and_redacted(tmp_path: Path) -> None:
    marker = write_fixture(tmp_path, "invalid_sensitive_content.json")
    snap = HealthSafeMarkerAdapter(str(marker), max_age_hours=99999).get_snapshot()
    text = dumped(snap)
    assert snap.status == "degraded"
    assert "diagnosis" not in text.lower()
    assert "BLOCKED_SYNTHETIC" not in text


def test_unknown_fields_and_free_text_do_not_leak(tmp_path: Path) -> None:
    for name in ["invalid_unknown_fields.json", "invalid_free_text.json"]:
        marker = write_fixture(tmp_path, name)
        snap = HealthSafeMarkerAdapter(str(marker), max_age_hours=99999).get_snapshot()
        text = dumped(snap)
        assert snap.status == "degraded"
        assert "unsupported fields" not in text
        assert "free text" not in text.lower()
