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

Modal Python API is the canonical client; this wraps via subprocess
since Modal CLI is the simplest mesh-routable interface.

v0 verbs:
  arq-modal app list                 — list deployed apps
  arq-modal workspace list           — list workspaces
  arq-modal usage [--days N]         — usage rollup (via modal app list)
"""
from __future__ import annotations
import argparse, json, subprocess, sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))
from _arq_provider_base import call_with_audit, handle_meta_flags

PROVIDER = "modal"


REQUIRED_SCOPES: dict[str, list[str]] = {
    "app list": ["unknown"],
    "workspace list": ["unknown"],
    "usage": ["unknown"],
}
def _modal(args: list[str]) -> int:
    try:
        r = subprocess.run(["modal"] + args, capture_output=True, text=True, timeout=60, check=False)
    except FileNotFoundError:
        sys.stderr.write("modal CLI not on PATH\n")
        return 127
    if r.returncode != 0:
        sys.stderr.write(r.stderr)
    print(r.stdout)
    return r.returncode


def _cmd_app_list(args) -> int: return _modal(["app", "list"])
def _cmd_workspace_list(args) -> int: return _modal(["workspace", "list"])
def _cmd_usage(args) -> int:
    # Modal doesn't expose a clean billing API; app list + status is closest proxy
    return _modal(["app", "list"])


def main() -> int:
    handle_meta_flags(PROVIDER, REQUIRED_SCOPES)
    p = argparse.ArgumentParser(prog="arq-modal")
    sub = p.add_subparsers(dest="cmd", required=True)
    s_a = sub.add_parser("app"); s_a_sub = s_a.add_subparsers(dest="action", required=True)
    s_a_l = s_a_sub.add_parser("list"); s_a_l.set_defaults(func=_cmd_app_list, verb="app list")
    s_w = sub.add_parser("workspace"); s_w_sub = s_w.add_subparsers(dest="action", required=True)
    s_w_l = s_w_sub.add_parser("list"); s_w_l.set_defaults(func=_cmd_workspace_list, verb="workspace list")
    s_u = sub.add_parser("usage"); s_u.add_argument("--days", type=int, default=30); s_u.set_defaults(func=_cmd_usage, verb="usage")
    args = p.parse_args()
    return call_with_audit(PROVIDER, args.verb, args.func, args)


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