#!/usr/bin/env python3
"""arq-twilio — Twilio API bridge.
v0: arq-twilio account get · arq-twilio message list [--days N]
"""
import argparse, base64, 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 = "twilio"
REQUIRED_SCOPES: dict[str, list[str]] = {
    # Twilio auth uses AccountSID + AuthToken — single master credential with
    # no scope model. API Keys + KMS scoping is opt-in and not yet adopted here.
    "account get": ["account_master"],
    "message list": ["account_master"],
}
def _creds():
    sid = os.environ.get("TWILIO_ACCOUNT_SID") or sops_extract('["twilio"]["twilio_account_sid"]')
    tok = os.environ.get("TWILIO_AUTH_TOKEN") or sops_extract('["twilio"]["twilio_auth_token"]')
    return sid, tok
def _get(path):
    sid, tok = _creds()
    if not sid or not tok: return 401, "no twilio creds"
    auth = base64.b64encode(f"{sid}:{tok}".encode()).decode()
    req = urllib.request.Request(f"https://api.twilio.com{path}", headers={"Authorization": f"Basic {auth}"})
    try:
        with urllib.request.urlopen(req, timeout=30) as r: return r.status, json.loads(r.read())
    except urllib.error.HTTPError as e: return e.code, e.read().decode("utf-8","ignore")
    except Exception as e: return 500, str(e)

def _acc(a):
    sid, _ = _creds()
    c, d = _get(f"/2010-04-01/Accounts/{sid}.json")
    if c != 200: sys.stderr.write(f"HTTP {c}: {d}\n"); return 1
    return print_json(d)
def _msgs(a):
    sid, _ = _creds()
    start = (datetime.now(UTC) - timedelta(days=a.days)).strftime("%Y-%m-%d")
    c, d = _get(f"/2010-04-01/Accounts/{sid}/Messages.json?DateSent%3E={start}")
    if c != 200: sys.stderr.write(f"HTTP {c}: {d}\n"); return 1
    return print_json(d)

def main():
    handle_meta_flags(PROVIDER, REQUIRED_SCOPES)
    p = argparse.ArgumentParser(prog="arq-twilio"); s = p.add_subparsers(dest="cmd", required=True)
    sa = s.add_parser("account"); sa2 = sa.add_subparsers(dest="action", required=True)
    sa2.add_parser("get").set_defaults(func=_acc, verb="account get")
    sm = s.add_parser("message"); sm2 = sm.add_subparsers(dest="action", required=True)
    sml = sm2.add_parser("list"); sml.add_argument("--days", type=int, default=30); sml.set_defaults(func=_msgs, verb="message list")
    args = p.parse_args()
    return call_with_audit(PROVIDER, args.verb, args.func, args)

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