"""V2: answers planted on a local server, classed through probe.py's own ask(). Usage: python -B fixtures.py"""
import http.server, json, os, sys, threading
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import rule, probe

OK = json.dumps({"jsonrpc": "2.0", "id": 1, "result": {"protocolVersion": "2025-06-18", "serverInfo": {"name": "x"}}}).encode()
ERR = json.dumps({"jsonrpc": "2.0", "id": 1, "error": {"code": -32600, "message": "no"}}).encode()
PLANT = {"/json": (200, {}, OK, "SPEAKS"), "/sse": (200, {"Content-Type": "text/event-stream"}, b"event: message\ndata: " + OK + b"\n\n", "SPEAKS"),
         "/rpcerr": (400, {}, ERR, "SPEAKS"), "/lock": (401, {"WWW-Authenticate": "Bearer"}, b"", "LOCKED"),
         "/403bare": (403, {}, b"Forbidden", "NOTHING"), "/html": (200, {}, b"<html>home</html>", "NOTHING"),
         "/json200": (200, {}, b'{"status":"ok"}', "NOTHING"), "/404": (404, {}, b"", "NOTHING")}


class H(http.server.BaseHTTPRequestHandler):
    def do_POST(self):
        self.rfile.read(int(self.headers.get("Content-Length", 0)))
        code, head, body, _ = PLANT[self.path]
        self.send_response(code)
        for k, v in head.items():
            self.send_header(k, v)
        self.send_header("Content-Length", str(len(body))); self.end_headers(); self.wfile.write(body)

    def log_message(self, *a):
        pass


def main():
    srv = http.server.ThreadingHTTPServer(("127.0.0.1", 0), H)
    threading.Thread(target=srv.serve_forever, daemon=True).start()
    bad = 0
    for path, (_, _, _, want) in PLANT.items():
        got = probe.ask(f"http://127.0.0.1:{srv.server_port}{path}")[0]
        bad += got != want
        print(path, "OK" if got == want else f"WRONG {got}")
    bad += probe.ask("http://127.0.0.1:1/")[0] != "NOTHING"
    assert rule.urls_of({"remotes": [{"url": "https://a/mcp"}, {"url": "https://{t}.a/mcp"}], "endpoints": {"s": "https://b"}, "url": "http://c"}) == (["https://a/mcp", "https://b"], ["https://{t}.a/mcp"])
    srv.shutdown()
    print("V2", "PASS" if not bad else "FAIL")
    return 1 if bad else 0


if __name__ == "__main__":
    sys.exit(main())
