"""Loopback-only toy HTTP service. Listening does not imply readiness."""
import argparse
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
from pathlib import Path
import signal

from check_catalog import ROOT, checked_bytes


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--port", type=int, default=8765)
    parser.add_argument("--catalog", type=Path, default=ROOT / "build/catalog.json")
    args = parser.parse_args()
    stopping = [False]

    class Handler(BaseHTTPRequestHandler):
        def do_GET(self):
            if self.path not in ("/health", "/catalog"):
                status, body = 404, b"not found\n"
            else:
                try:
                    catalog = checked_bytes(args.catalog)
                    status, body = 200, b"ok" if self.path == "/health" else catalog
                except (OSError, ValueError):
                    status, body = 503, b"catalog unavailable"
            self.send_response(status)
            self.send_header("Content-Type", "application/json" if self.path == "/catalog" and status == 200 else "text/plain")
            self.send_header("Content-Length", str(len(body)))
            self.end_headers()
            self.wfile.write(body)

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

    def stop(signum, frame):
        stopping[0] = True

    signal.signal(signal.SIGTERM, stop)
    with HTTPServer(("127.0.0.1", args.port), Handler) as server:
        server.timeout = 0.2
        print(json.dumps({"event": "listening", "host": "127.0.0.1",
                          "port": server.server_address[1]}), flush=True)
        try:
            while not stopping[0]:
                server.handle_request()
        except KeyboardInterrupt:
            pass
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
