#!/usr/bin/env python3
"""Quick test of the API server endpoints."""
import json
import subprocess
import sys
import time
import urllib.request
import urllib.error

API = "http://127.0.0.1:14195/api"

def post(path, data):
    req = urllib.request.Request(
        f"{API}/{path}",
        data=json.dumps(data).encode(),
        headers={"Content-Type": "application/json"},
    )
    try:
        with urllib.request.urlopen(req, timeout=5) as resp:
            return json.loads(resp.read())
    except urllib.error.HTTPError as e:
        body = e.read().decode()
        try:
            return json.loads(body)
        except Exception:
            return {"error": f"HTTP {e.code}: {body[:200]}"}
    except urllib.error.URLError as e:
        return {"error": str(e)}

# Start server in background
print("Starting API server...")
srv = subprocess.Popen(
    [sys.executable, "wallet-engine/api_server.py"],
    cwd="/home/vincent/projects/btc-wallet",
    env={**__import__("os").environ, "VIRTUAL_ENV": "/home/vincent/projects/btc-wallet/.venv"},
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)
time.sleep(1.5)

try:
    # Test 1: Generate seed
    print("\n1. generate_seed:")
    r = post("generate_seed", {"strength": 128})
    print(f"   seed: {r.get('seed', r.get('error', 'MISSING'))}")

    # Test 2: Get block count
    print("\n2. get_block_count:")
    r = post("get_block_count", {})
    print(f"   block_count: {r.get('block_count', r.get('error', 'MISSING'))}")

    # Test 3: Get network info
    print("\n3. get_network_info:")
    r = post("get_network_info", {})
    if "error" in r:
        print(f"   error: {r['error']}")
    else:
        print(f"   version: {r.get('version')}")
        print(f"   connections: {r.get('connections')}")

    # Test 4: Create wallet
    seed = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
    print(f"\n4. create_wallet:")
    r = post("create_wallet", {"seed": seed, "wallet_name": "Test", "password": ""})
    if "error" in r:
        print(f"   error: {r['error']}")
    else:
        w = r.get("wallet", {})
        print(f"   name: {w.get('name')}")
        print(f"   fingerprint: {w.get('fingerprint')}")
        print(f"   addresses: {len(r.get('addresses', []))}")
        if r.get("addresses"):
            print(f"   first addr: {r['addresses'][0].get('address')}")

    # Test 5: Derive more addresses
    print("\n5. derive_addresses:")
    r = post("derive_addresses", {
        "wallet": r.get("wallet", {}),
        "count": 3,
        "derivation_type": "bech32",
    })
    if "error" in r:
        print(f"   error: {r['error']}")
    else:
        print(f"   addresses: {len(r.get('addresses', []))}")

finally:
    srv.terminate()
    srv.wait(timeout=3)
    print("\nServer stopped.")
