#!/usr/bin/env python3
# Minimal result-collector for the POC extensions. Listens on 127.0.0.1:8123,
# prints each JSON report line to stdout, and exits once both extensions have
# posted a {"tag":"done"} record (or after a timeout).

import http.server, json, sys, threading, time

DONE = set()
LOCK = threading.Lock()

class H(http.server.BaseHTTPRequestHandler):
    def do_POST(self):
        n = int(self.headers.get('Content-Length', 0))
        body = self.rfile.read(n).decode('utf-8', 'replace')
        try:
            obj = json.loads(body)
        except Exception:
            obj = {'raw': body}
        line = json.dumps(obj)
        print('[REPORT]', line, flush=True)
        if obj.get('tag') == 'done':
            with LOCK:
                DONE.add(obj.get('ext'))
        self.send_response(200)
        self.end_headers()

    def log_message(self, *a):  # silence default access log
        pass

def main():
    expected = int(sys.argv[1]) if len(sys.argv) > 1 else 2
    timeout = int(sys.argv[2]) if len(sys.argv) > 2 else 60
    srv = http.server.HTTPServer(('127.0.0.1', 8123), H)
    t = threading.Thread(target=srv.serve_forever, daemon=True)
    t.start()
    print(f'[server] listening on 127.0.0.1:8123 (expect {expected} done, timeout {timeout}s)',
          flush=True)
    start = time.time()
    while time.time() - start < timeout:
        with LOCK:
            if len(DONE) >= expected:
                break
        time.sleep(0.2)
    print(f'[server] exiting (done={sorted(DONE)})', flush=True)
    srv.shutdown()

if __name__ == '__main__':
    main()
