#!/usr/bin/env python3
import argparse
import json
import os
import sys
import urllib.request
import urllib.error
import urllib.parse


def load_config():
    candidates = [
        os.environ.get("OPENCLAW_CONFIG"),
        "/opt/openclaw/.openclaw/openclaw.json",
        os.path.expanduser("~/.openclaw/openclaw.json"),
    ]
    for path in candidates:
        if path and os.path.exists(path):
            with open(path, "r", encoding="utf-8") as f:
                return json.load(f)
    raise RuntimeError("openclaw config not found")


def resolve_provider(cfg):
    providers = cfg.get("models", {}).get("providers", {}) or {}
    if "clawkai" in providers:
        provider = providers["clawkai"]
    elif providers:
        provider = next(iter(providers.values()))
    else:
        raise RuntimeError("no providers configured")
    base_url = provider.get("baseUrl") or provider.get("base_url")
    api_key = provider.get("apiKey") or provider.get("api_key")
    if not base_url or not api_key:
        raise RuntimeError("provider baseUrl or apiKey missing")
    return base_url.rstrip("/"), api_key


def build_url(base_url, path):
    base = base_url.rstrip("/")
    if base.endswith("/v1"):
        return f"{base}{path}"
    return f"{base}/v1{path}"


def request_json(url, api_key, method="GET", payload=None):
    data = None
    headers = {"Authorization": f"Bearer {api_key}", "User-Agent": "curl/8.5.0"}
    if payload is not None:
        data = json.dumps(payload).encode("utf-8")
        headers["Content-Type"] = "application/json"
    req = urllib.request.Request(url, data=data, headers=headers, method=method)
    with urllib.request.urlopen(req, timeout=300) as resp:
        return json.loads(resp.read().decode("utf-8"))


def main():
    parser = argparse.ArgumentParser()
    sub = parser.add_subparsers(dest="command", required=True)

    list_cmd = sub.add_parser("list")
    list_cmd.add_argument("--query", default="")
    list_cmd.add_argument("--max", type=int, default=5)

    get_cmd = sub.add_parser("get")
    get_cmd.add_argument("--id", required=True)

    send_cmd = sub.add_parser("send")
    send_cmd.add_argument("--to", required=True)
    send_cmd.add_argument("--subject", required=True)
    send_cmd.add_argument("--body", required=True)
    send_cmd.add_argument("--from", dest="from_addr")

    args = parser.parse_args()

    cfg = load_config()
    base_url, api_key = resolve_provider(cfg)

    if args.command == "list":
        query = urllib.parse.quote(args.query)
        url = build_url(base_url, f"/mail/list?query={query}&max={args.max}")
        payload = request_json(url, api_key)
        print(json.dumps(payload))
        return

    if args.command == "get":
        msg_id = urllib.parse.quote(args.id)
        url = build_url(base_url, f"/mail/message/{msg_id}")
        payload = request_json(url, api_key)
        print(json.dumps(payload))
        return

    url = build_url(base_url, "/mail/send")
    body = {
        "to": args.to,
        "subject": args.subject,
        "body": args.body,
    }
    if args.from_addr:
        body["from"] = args.from_addr
    payload = request_json(url, api_key, method="POST", payload=body)
    print(json.dumps(payload))


if __name__ == "__main__":
    try:
        main()
    except Exception as exc:
        sys.stderr.write(str(exc) + "\n")
        sys.exit(1)
