"""Fetch Sonilo account services and usage as a terminal dashboard.

Run:
    export SONILO_API_KEY=sk_...
    python account-usage-dashboard.py

This example calls GET /v1/account/services and GET /v1/account/usage. It is
safe for integration smoke tests because it does not start generation jobs.
"""

import json
import os
import sys
import time

import requests

API_BASE = "https://api.sonilo.com/v1"
USER_AGENT = "SoniloPythonExample/1.0 (+https://platform.sonilo.com/docs)"


def retry_after_seconds(resp, attempt):
    value = resp.headers.get("Retry-After")
    if value:
        try:
            return max(1, int(value))
        except ValueError:
            return 5
    return min(2**attempt, 30)


def classify_error(resp):
    body = resp.text
    code = f"http_{resp.status_code}"
    message = body
    try:
        payload = resp.json()
        code = payload.get("code", code)
        message = payload.get("message", body)
    except ValueError:
        pass
    if resp.status_code == 402 and code == "payment_required":
        return "insufficient_balance", (
            "insufficient_balance: add balance or use an eval key with enough "
            f"credits. API returned payment_required: {message}"
        )
    return code, f"Sonilo request failed with HTTP {resp.status_code}: {message}"


def get_json(path, headers):
    url = f"{API_BASE}{path}"
    for attempt in range(1, 6):
        resp = requests.get(url, headers=headers, timeout=30)
        if resp.status_code == 429:
            delay = retry_after_seconds(resp, attempt)
            resp.close()
            print(f"Rate limited. Retrying after {delay}s...", file=sys.stderr)
            time.sleep(delay)
            continue
        if not resp.ok:
            _, message = classify_error(resp)
            raise RuntimeError(message)
        return resp.json()
    raise RuntimeError("rate_limit_exceeded: still receiving 429 after retries")


def main():
    api_key = os.environ.get("SONILO_API_KEY")
    if not api_key:
        raise RuntimeError("Set SONILO_API_KEY before running this script")

    headers = {
        "Authorization": f"Bearer {api_key}",
        "User-Agent": USER_AGENT,
    }
    services = get_json("/account/services", headers)  # GET /v1/account/services
    usage = get_json("/account/usage?days=30", headers)  # GET /v1/account/usage

    print("# Sonilo account usage")
    print()
    print("## Services")
    print(json.dumps(services, indent=2, sort_keys=True))
    print()
    print("## Usage")
    print(json.dumps(usage, indent=2, sort_keys=True))


if __name__ == "__main__":
    try:
        main()
    except Exception as exc:
        print(f"Error: {exc}", file=sys.stderr)
        sys.exit(1)
