# Show a campaign's status and every recipient's result. Python 3.9+ with requests.
import json
import os
import sys

import requests

base = os.environ.get("RELATIONSAI_API_BASE", "https://voice-api.relationsai.com/v1")
campaign_id = os.environ.get("CAMPAIGN_ID") or sys.exit("Set CAMPAIGN_ID to a campaign id (cmp_...)")
headers = {"Authorization": f"Bearer {os.environ['RELATIONSAI_API_KEY']}"}


def get(path, params=None):
    r = requests.get(f"{base}{path}", params=params, headers=headers, timeout=30)
    body = r.json()
    if not r.ok:
        err = body["error"]
        sys.exit(f"{err['code']}: {err['message']} (request {err['request_id']})")
    return body


campaign = get(f"/campaigns/{campaign_id}")
allowed = [action for action, ok in campaign["capabilities"].items() if ok]
print(f"{campaign['id']} {campaign['status']} run={campaign['run_number']} allowed: {', '.join(allowed) or 'none'}")
print(f"progress {json.dumps(campaign['progress'])} spend {campaign['spend']['amount']} {campaign['spend']['currency']}")

cursor = None
while True:
    params = {"limit": 100, **({"cursor": cursor} if cursor else {})}
    page = get(f"/campaigns/{campaign_id}/recipients", params)
    for r in page["data"]:
        why = f" ({r['suppression_reason']})" if r["suppression_reason"] else ""
        print(f"  {r['phone_number']} {r['status']}{why} attempts={r['attempts']} outcome={r['outcome']} call={r['last_call_id']}")
    if not page["has_more"]:
        break
    cursor = page["next_cursor"]
