#!/usr/bin/env python3
"""One-shot test charge: GET balance → POST charge 1 token → GET balance again.

Uses real airminal API. Charges 1 token for real.
Key from .env (AIRMINAL_BILLING_KEY), never printed.
"""

from __future__ import annotations

import sys
import time
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "src"))

from agent_samochodowy.billing.client import AirminalClient, InsufficientTokensError
from agent_samochodowy.config import Settings


def main() -> int:
    settings = Settings()

    if not settings.airminal_billing_key:
        print("ERROR: AIRMINAL_BILLING_KEY not set in .env")
        return 1

    client = AirminalClient(settings.airminal_billing_url, settings.airminal_billing_key)
    reference = f"test-charge-{int(time.time())}"

    print(f"Endpoint:  {settings.airminal_billing_url}")
    print(f"Reference: {reference}")
    print()

    # --- Step 1: GET balance BEFORE ---
    print("=== 1. GET balance (BEFORE) ===")
    try:
        bal = client.check_balance()
        print(f"  Success:  {bal.success}")
        print(f"  Balance:  {bal.balance}")
        print(f"  Locked:   {bal.locked}")
        balance_before = bal.balance
    except Exception as e:
        print(f"  ERROR: {e}")
        client.close()
        return 1

    print()

    # --- Step 2: POST charge 1 token ---
    print("=== 2. POST charge (1 token) ===")
    try:
        result = client.charge(
            tokens=1,
            task="Test integracji agent FB",
            reference=reference,
        )
        print(f"  Success:       {result.success}")
        print(f"  Charged:       {result.charged}")
        print(f"  Balance after: {result.balance_after}")
        print(f"  Error:         {result.error or '(none)'}")
    except InsufficientTokensError as e:
        print(f"  INSUFFICIENT TOKENS: {e}")
        client.close()
        return 1
    except Exception as e:
        print(f"  ERROR: {e}")
        client.close()
        return 1

    print()

    # --- Step 3: GET balance AFTER ---
    print("=== 3. GET balance (AFTER) ===")
    try:
        bal2 = client.check_balance()
        print(f"  Balance: {bal2.balance}")
        balance_after = bal2.balance
    except Exception as e:
        print(f"  ERROR: {e}")
        client.close()
        return 1

    print()

    # --- Step 4: Verify ---
    print("=== 4. Verification ===")
    diff = balance_before - balance_after
    print(f"  Balance before: {balance_before}")
    print(f"  Balance after:  {balance_after}")
    print(f"  Difference:     {diff}")
    if abs(diff - 1.0) < 0.01:
        print("  RESULT: OK — saldo spadlo dokladnie o 1 token")
    elif diff > 0:
        print(f"  RESULT: WARNING — spadlo o {diff}, oczekiwano 1.0")
    else:
        print(f"  RESULT: UNEXPECTED — saldo nie spadlo (diff={diff})")

    client.close()
    return 0


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