#!/usr/bin/env python3
"""在指定目录启动简易 HTTP 静态文件服务，供 Nginx Proxy Manager 反代。"""

from __future__ import annotations

import argparse
import os
from functools import partial
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer


def parseArgs() -> argparse.Namespace:
    """解析命令行参数：监听地址、端口与文档根目录。"""
    parser = argparse.ArgumentParser(description="AnyTuck relay static file server")
    parser.add_argument("--host", default="0.0.0.0", help="监听地址")
    parser.add_argument("--port", type=int, default=8088, help="监听端口")
    parser.add_argument(
        "--root",
        default=os.path.dirname(os.path.abspath(__file__)),
        help="静态文件根目录",
    )
    return parser.parse_args()


def createHandler(documentRoot: str) -> type[SimpleHTTPRequestHandler]:
    """基于文档根目录构造请求处理器类。"""

    class StaticHandler(SimpleHTTPRequestHandler):
        """提供静态文件，并关闭目录列表以外的多余功能。"""

        def __init__(self, *args, **kwargs):
            super().__init__(*args, directory=documentRoot, **kwargs)

        def log_message(self, format: str, *args) -> None:
            """统一访问日志格式，便于 journalctl 查看。"""
            print(f"[anytuck-static] {self.address_string()} - {format % args}")

    return StaticHandler


def runServer(listenHost: str, listenPort: int, documentRoot: str) -> None:
    """绑定端口并阻塞运行 HTTP 服务。"""
    handlerClass = createHandler(documentRoot)
    httpServer = ThreadingHTTPServer((listenHost, listenPort), handlerClass)
    print(
        f"[anytuck-static] serving {documentRoot} on http://{listenHost}:{listenPort}"
    )
    httpServer.serve_forever()


def main() -> None:
    """入口：读取参数后启动静态文件服务。"""
    args = parseArgs()
    documentRoot = os.path.abspath(args.root)
    if not os.path.isdir(documentRoot):
        raise SystemExit(f"文档根目录不存在: {documentRoot}")
    runServer(args.host, args.port, documentRoot)


if __name__ == "__main__":
    main()
