#!/usr/bin/env python3
"""arq-openai — OpenAI API adapter for ARQERA mesh.

v0 verbs:
  arq-openai usage [--days N]   — usage rollup
  arq-openai key list            — list API keys (admin scope)
"""
from __future__ import annotations
import argparse, json, os, sys, urllib.request, urllib.error
from datetime import UTC, datetime, timedelta
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))
from _arq_provider_base import sops_extract, call_with_audit, print_json, handle_meta_flags

PROVIDER = "openai"
REQUIRED_SCOPES: dict[str, list[str]] = {
    "usage": ["unknown"],
    "key list": ["unknown"],
}
API_BASE = "https://api.openai.com"


def _api_key() -> str | None:
    return (os.environ.get("OPENAI_API_KEY") or
            sops_extract('["arqera_twin_admin"]["openai"]["value"]') or
            sops_extract('["openai"]["openai_api_key"]'))


def _api_get(path: str, params: dict | None = None) -> tuple[int, dict | str]:
    key = _api_key()
    if not key:
        return 401, "no openai key in env/SOPS"
    if params:
        from urllib.parse import urlencode
        path = f"{path}?{urlencode(params)}"
    req = urllib.request.Request(f"{API_BASE}{path}", headers={"Authorization": f"Bearer {key}"})
    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            return resp.status, json.loads(resp.read())
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode("utf-8", errors="ignore")
    except Exception as e:
        return 500, str(e)


def _cmd_usage(args) -> int:
    end = datetime.now(UTC).date()
    start = end - timedelta(days=args.days)
    code, data = _api_get("/v1/organization/usage/completions", {
        "start_time": int(datetime.combine(start, datetime.min.time(), UTC).timestamp()),
        "end_time": int(datetime.combine(end, datetime.max.time(), UTC).timestamp()),
    })
    if code != 200:
        sys.stderr.write(f"HTTP {code}: {data}\n")
        return 1
    return print_json(data)


def _cmd_key_list(args) -> int:
    code, data = _api_get("/v1/organization/admin_api_keys")
    if code != 200:
        sys.stderr.write(f"HTTP {code}: {data}\n")
        return 1
    return print_json(data)


def main() -> int:
    handle_meta_flags(PROVIDER, REQUIRED_SCOPES)
    p = argparse.ArgumentParser(prog="arq-openai")
    sub = p.add_subparsers(dest="cmd", required=True)
    s_u = sub.add_parser("usage"); s_u.add_argument("--days", type=int, default=30); s_u.set_defaults(func=_cmd_usage, verb="usage")
    s_k = sub.add_parser("key"); s_k_sub = s_k.add_subparsers(dest="action", required=True)
    s_k_l = s_k_sub.add_parser("list"); s_k_l.set_defaults(func=_cmd_key_list, verb="key list")
    args = p.parse_args()
    return call_with_audit(PROVIDER, args.verb, args.func, args)


if __name__ == "__main__":
    sys.exit(main())
