from __future__ import annotations

import json
import threading
from http.server import BaseHTTPRequestHandler, HTTPServer

from jarvis_gateway.adapters.autoshorts_live_readonly import ALLOWED_ENDPOINTS, AutoShortsLiveReadonlyAdapter


class Handler(BaseHTTPRequestHandler):
    seen: list[tuple[str, str]] = []

    def do_GET(self):  # noqa: N802
        self.seen.append(("GET", self.path))
        if self.path == "/api/dashboard/summary":
            payload = {"ready_for_approval": 2, "needs_metadata": 1, "scheduled_private_uploads": 0, "failed_actions": 0, "current_content_pipeline": {"in_production": 0, "produced": 1}}
        elif self.path == "/api/health":
            payload = {"status": "ok"}
        else:
            self.send_response(404); self.end_headers(); return
        self.send_response(200); self.send_header("Content-Type", "application/json"); self.end_headers(); self.wfile.write(json.dumps(payload).encode())

    def log_message(self, format, *args):
        return


def test_autoshorts_live_readonly_uses_only_get_and_allowed_endpoints() -> None:
    Handler.seen = []
    server = HTTPServer(("127.0.0.1", 0), Handler)
    thread = threading.Thread(target=server.serve_forever, daemon=True); thread.start()
    try:
        snap = AutoShortsLiveReadonlyAdapter(f"http://127.0.0.1:{server.server_port}").get_snapshot()
    finally:
        server.shutdown(); thread.join(timeout=2)
    assert snap.source_health.source_type == "http_api"
    assert snap.status == "attention"
    assert all(method == "GET" for method, _ in Handler.seen)
    assert {path for _, path in Handler.seen}.issubset(set(ALLOWED_ENDPOINTS))
    assert not any(any(word in path for word in ["upload", "publish", "render"]) for _, path in Handler.seen)


def test_autoshorts_live_readonly_rejects_non_local_url() -> None:
    snap = AutoShortsLiveReadonlyAdapter("https://example.com").get_snapshot()
    assert snap.status == "degraded"
    assert snap.source_health.reachable is False
