"""Fake GitHub Enterprise host: open PRs with a large tied updatedAt group, like GitHub search."""
import json, re, ssl, sys
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer

LOG = open(sys.argv[2], "a", buffering=1)
TIED = "2026-07-02T00:00:00Z"


def ts(n):
    if n <= 20:
        return f"2026-07-03T00:{60 - n:02d}:00Z"  # newer, distinct
    if n <= 220:
        return TIED  # 200 tied rows
    return f"2026-07-01T00:{240 - n:02d}:00Z"  # older, distinct


def node(n):
    return {
        "number": n, "title": f"Fixture PR{n}", "url": f"https://127.0.0.1/acme/web/pull/{n}",
        "headRefName": f"feat/{n}", "baseRefName": "main", "createdAt": "2026-06-01T00:00:00Z",
        "updatedAt": ts(n), "repository": {"nameWithOwner": "acme/web"}, "author": {"__typename": "User", "login": "octo", "name": "Octo", "avatarUrl": "https://127.0.0.1/avatar.png"},
        "state": "OPEN", "isDraft": False, "mergeable": "UNKNOWN", "reviewDecision": None,
        "latestReviews": {"nodes": []}, "mergedAt": None, "reviewRequests": {"nodes": []},
        "labels": {"nodes": []}, "commits": {"nodes": []}, "additions": 1, "deletions": 1,
    }


ALL = [node(n) for n in range(1, 231)]  # already in updated-desc, number-asc order


class H(BaseHTTPRequestHandler):
    def log_message(self, *a):
        pass

    def send(self, code, body):
        data = json.dumps(body).encode()
        self.send_response(code)
        self.send_header("content-type", "application/json")
        self.send_header("content-length", str(len(data)))
        self.end_headers()
        self.wfile.write(data)

    def do_GET(self):
        LOG.write(f"GET {self.path}\n")
        if self.path.startswith("/api/v3/user"):
            return self.send(200, {"login": "octo", "id": 1})
        if self.path.startswith("/api/v3/repos/acme/web"):
            return self.send(200, {"full_name": "acme/web", "name": "web", "owner": {"login": "acme"},
                                   "default_branch": "main", "private": False,
                                   "permissions": {"admin": False, "push": True, "pull": True}})
        self.send(404, {"message": "Not Found"})

    def do_POST(self):
        length = int(self.headers.get("content-length", 0))
        req = json.loads(self.rfile.read(length) or b"{}")
        q, v = req.get("query", ""), req.get("variables") or {}
        name = re.search(r"(query|mutation)\s+(\w+)", q)
        name = name.group(2) if name else "?"
        LOG.write(f"POST {self.path} {name} {json.dumps(v)}\n")
        if "search(" in q:
            bound = re.search(r"updated:<=(\S+)", v.get("q", ""))
            rows = [] if "review-requested:" in v.get("q", "") else [r for r in ALL if bound is None or r["updatedAt"] <= bound.group(1)]
            start = int(v["after"]) if v.get("after") else 0
            end = start + int(v.get("first", 100))
            more = end < len(rows)
            LOG.write(f"  -> search rows {[r['number'] for r in rows[start:end]][:3]}..{len(rows[start:end])}\n")
            return self.send(200, {"data": {"search": {
                "pageInfo": {"hasNextPage": more, "endCursor": str(end) if more else None},
                "nodes": rows[start:end]}}})
        if "viewer" in q:
            return self.send(200, {"data": {"viewer": {"login": "octo"}}})
        self.send(200, {"data": None, "errors": [{"message": f"fake: unhandled {name}"}]})


srv = ThreadingHTTPServer(("127.0.0.1", int(sys.argv[1])), H)
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain(sys.argv[3] + "/cert.pem", sys.argv[3] + "/key.pem")
srv.socket = ctx.wrap_socket(srv.socket, server_side=True)
srv.serve_forever()
