"""정적 전용 LAN 뷰어 서버 — GT 턴 뷰어를 사내망에서 터널 없이 보기 위함.

만든 이유 (2026-08-04): 뷰어 확인 루프에서 localhost 포워딩(VSCode/SSH)이
반복적으로 끊겨 사용자가 8321/8322에 접속하지 못함. server.py는 127.0.0.1
하드코딩인데, 그대로 0.0.0.0에 열면 /api/session(OpenAI 키로 Realtime 토큰
발급)이 사내망 전체에 노출되므로 금지. 본 서버는 server.py의 Handler(정적
경로 라우팅: pseudo-nilotoon 마운트, idle01.vrma)를 재사용하되:
  * POST 전면 403 (/api/* 전부 — 토큰 발급·재빌드 차단)
  * GET /api/* 403
  * 전 요청 로그 (server.py는 /api만 로그 — 진단 불가했음)
  * 0.0.0.0 바인딩 (사내망 읽기 전용)

사용: python lan_viewer_server.py [--port 8323]
"""
import argparse
import os
import sys
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import server as base  # noqa: E402  (import만 — main()은 실행 안 됨)


class StaticOnly(base.Handler):
    def do_POST(self):
        self.send_error(403, "read-only LAN viewer")

    def do_GET(self):
        if (self.path or "").startswith("/api/"):
            self.send_error(403, "read-only LAN viewer")
            return
        super().do_GET()

    def end_headers(self):
        # 캐시 금지 (2026-08-05): 뷰어가 하루에도 여러 번 바뀌는데 브라우저가
        # 옛 viewer.html/importmap을 물고 있으면 모듈 로드가 통째로 실패해
        # **빈 화면**이 된다 — 사용자가 "화면은 뜨는데 비어 있다"로 겪은 증상.
        # 진단 서버라 대역폭보다 최신성이 중요하다.
        self.send_header("Cache-Control", "no-store, no-cache, must-revalidate")
        self.send_header("Pragma", "no-cache")
        self.send_header("Expires", "0")
        super().end_headers()

    def log_message(self, fmt, *args):
        SimpleHTTPRequestHandler.log_message(self, fmt, *args)


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--port", type=int, default=8323)
    a = ap.parse_args()
    print(f"static viewer on http://0.0.0.0:{a.port}/viewer.html "
          f"(/api 차단, 전 요청 로그)", flush=True)
    ThreadingHTTPServer(("0.0.0.0", a.port), StaticOnly).serve_forever()


if __name__ == "__main__":
    main()
