from __future__ import annotations

import json
from pathlib import Path

from fastapi.testclient import TestClient

from jarvis_gateway.adapters.autoshorts_live_readonly import AutoShortsLiveReadonlyAdapter
from jarvis_gateway.adapters.autoshorts_sanitizer import assert_no_sensitive_autoshorts_output, sanitize_autoshorts_status
from jarvis_gateway.contracts import SourceType, utcnow
from jarvis_gateway.main import create_app

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


def load(name: str) -> dict:
    return json.loads((FIXTURES / name).read_text(encoding="utf-8"))


def test_live_dashboard_summary_shape_maps_to_safe_snapshot() -> None:
    adapter = AutoShortsLiveReadonlyAdapter("http://127.0.0.1:1")
    raw = adapter._map_summary(load("live_dashboard_summary_shape.json"), {"status": "ok"})
    snap = sanitize_autoshorts_status(raw, source_type=SourceType.HTTP_API, last_attempt_at=utcnow())
    assert snap.module_id == "autoshorts"
    assert snap.source_health.source_type == "http_api"
    assert snap.source_health.contract_version == "autoshorts.safe_status.v1"
    assert len(snap.kpis) <= 3
    assert snap.kpis[0].value == 1
    assert snap.kpis[1].value == 2
    assert snap.kpis[2].value == "ready"


def test_live_dashboard_dirty_shape_ignores_unknown_and_forbidden_fields() -> None:
    adapter = AutoShortsLiveReadonlyAdapter("http://127.0.0.1:1")
    raw = adapter._map_summary(load("live_dashboard_summary_dirty_shape.json"), {"status": "ok"})
    snap = sanitize_autoshorts_status(raw, source_type=SourceType.HTTP_API, last_attempt_at=utcnow())
    output = json.dumps(snap.model_dump(mode="json"), sort_keys=True).lower()
    forbidden = ["/home/", ".mp4", ".webp", "prompt", "script", "voiceover", "caption", "description", "oauth", "token", "ffmpeg", "manifest"]
    for item in forbidden:
        assert item not in output
    assert len(snap.kpis) <= 3
    assert_no_sensitive_autoshorts_output(snap.model_dump(mode="json"))


def test_overview_stays_stable_with_live_shape_mapping(monkeypatch) -> None:
    monkeypatch.setenv("AUTOSHORTS_ADAPTER_MODE", "live_readonly")
    monkeypatch.setenv("AUTOSHORTS_API_BASE_URL", "http://127.0.0.1:9")
    client = TestClient(create_app())
    response = client.get("/api/overview")
    assert response.status_code == 200
    module = next(item for item in response.json()["modules"] if item["module_id"] == "autoshorts")
    assert module["source_health"]["source_type"] == "http_api"
    assert len(module["kpis"]) <= 3
