#!/usr/bin/env python3
"""
batch-b-server.py — serve fixtures Batch B + endpoint 302 redirect (TG1.4/1.5 C3).

Chạy:   python3 batch-b-server.py 8000
Rồi front bằng domain-có-TLS hoặc tunnel https (SW/TG1.13 cần https):
        cloudflared tunnel --url http://localhost:8000
        # hoặc: ngrok http 8000

Cung cấp:
  - static: mọi file trong thư mục fixtures/ (tg1-window-open.html, tg1-sw-page.html,
    probe-permissions-clipboard.html, ipc-surface-probe.html, ...)
  - /sw.js         → đúng Content-Type application/javascript + Service-Worker-Allowed: /
  - /page2         → (được SW chặn ở client; server trả 200 rỗng làm fallback)
  - /r?to=<url>    → 302 Location: <url>  (dựng chuỗi redirect cho C3)
                     A→B:      /r?to=https://example.org
                     A→A→B:    /r?to=<url-encode( /r?to=https://example.org )>
  ACP privileged. Chỉ dùng cho engagement, chỉ trỏ tới host Calif/example.* (RoE).
"""
import sys
import os
from http.server import SimpleHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs

FIX_DIR = os.path.dirname(os.path.abspath(__file__))


class Handler(SimpleHTTPRequestHandler):
    def __init__(self, *a, **k):
        super().__init__(*a, directory=FIX_DIR, **k)

    def do_GET(self):
        u = urlparse(self.path)

        # 302 redirect endpoint (C3 — TG1.4/1.5)
        if u.path == "/r":
            to = parse_qs(u.query).get("to", [""])[0]
            if to:
                self.send_response(302)
                self.send_header("Location", to)
                self.end_headers()
                return
            self.send_error(400, "missing ?to=")
            return

        # sw.js với header đúng (TG1.13)
        if u.path.rstrip("/").endswith("/sw.js") or u.path == "/sw.js":
            p = os.path.join(FIX_DIR, "sw.js")
            if os.path.exists(p):
                with open(p, "rb") as f:
                    body = f.read()
                self.send_response(200)
                self.send_header("Content-Type", "application/javascript")
                self.send_header("Service-Worker-Allowed", "/")
                self.send_header("Content-Length", str(len(body)))
                self.end_headers()
                self.wfile.write(body)
                return

        # /page2 fallback (thực tế bị SW chặn ở client trước khi tới đây)
        if u.path.endswith("/page2"):
            body = b"<!DOCTYPE html><h1>REAL-SERVER-PAGE2</h1><p>Neu ban thay dong nay = SW KHONG chan (chua active?).</p>"
            self.send_response(200)
            self.send_header("Content-Type", "text/html")
            self.send_header("Content-Length", str(len(body)))
            self.end_headers()
            self.wfile.write(body)
            return

        return super().do_GET()

    def log_message(self, fmt, *args):
        host = self.headers.get("Host", "-") if self.headers else "-"
        sys.stderr.write("[batch-b] host=%s %s\n" % (host, fmt % args))


if __name__ == "__main__":
    port = int(sys.argv[1]) if len(sys.argv) > 1 else 8443
    print(f"[batch-b] serving {FIX_DIR} on 0.0.0.0:{port}", file=sys.stderr)
    HTTPServer(("0.0.0.0", port), Handler).serve_forever()
