#!/usr/bin/env python3
"""quickhost — ephemeral doc hosting (https://quickhost.my)"""
import argparse, json, os, re, sys, urllib.error, urllib.request

API = "https://quickhost.my/api/publish"
EXTS = {
    ".md": "markdown", ".markdown": "markdown", ".mdx": "markdown",
    ".html": "html", ".htm": "html",
}
MIN_TTL = 60
MAX_TTL = 30 * 86400


def parse_expiry(s):
    m = re.fullmatch(r"\s*(\d+)\s*([mhd])\s*", s, re.I)
    if not m:
        raise argparse.ArgumentTypeError("use e.g. 45m, 12h, 30d")
    mult = {"m": 60, "h": 3600, "d": 86400}[m.group(2).lower()]
    sec = int(m.group(1)) * mult
    if sec < MIN_TTL or sec > MAX_TTL:
        raise argparse.ArgumentTypeError(f"must be between 1m and 30d")
    return sec


def main():
    p = argparse.ArgumentParser(prog="quickhost", description="host an ephemeral doc on quickhost.my")
    p.add_argument("file", nargs="?", help="file to publish (defaults to stdin)")
    p.add_argument("-t", "--type", choices=["markdown", "html", "slides"], help="document type (auto from extension)")
    p.add_argument("-e", "--expiry", type=parse_expiry, default=86400, help="e.g. 45m, 12h, 30d (default: 24h)")
    p.add_argument("-p", "--password", help="optional password protection")
    args = p.parse_args()

    if args.file:
        try:
            with open(args.file, encoding="utf-8") as f:
                content = f.read()
        except OSError as e:
            sys.exit(f"quickhost: {e}")
        doc_type = args.type or EXTS.get(os.path.splitext(args.file)[1].lower(), "markdown")
    else:
        if sys.stdin.isatty():
            p.error("no input — pass a file or pipe content via stdin")
        content = sys.stdin.read()
        doc_type = args.type or "markdown"

    body = {"type": doc_type, "content": content, "expiry": args.expiry}
    if args.password:
        body["password"] = args.password

    api = os.environ.get("QUICKHOST_API", API)
    req = urllib.request.Request(
        api,
        data=json.dumps(body).encode(),
        headers={"content-type": "application/json", "user-agent": "quickhost-cli"},
    )
    try:
        res = urllib.request.urlopen(req)
        out = json.loads(res.read())
        print(out["url"])
        if doc_type == "html" and "editUrl" in out:
            print(f"edit in place: {out['editUrl']}", file=sys.stderr)
    except urllib.error.HTTPError as e:
        try:
            msg = json.loads(e.read()).get("error", str(e))
        except Exception:
            msg = str(e)
        sys.exit(f"quickhost: {msg}")
    except urllib.error.URLError as e:
        sys.exit(f"quickhost: {e.reason}")


if __name__ == "__main__":
    main()
