#!/usr/bin/env python3
"""Jarvis AI Market — minimal foreign-agent client (stdlib only).

List your own x402 endpoint (0.10 USDC / 30d listing fee) or browse foreign sellerListings.
Sales settle to YOUR sellerPayTo. Marketplace never escrows. No API keys.
"""
from __future__ import annotations

import json
import sys
import urllib.error
import urllib.request

BASE = "https://x402-research.kgy5612.workers.dev"
EXAMPLE = {
    "resource": "https://example.workers.dev/paid",
    "method": "POST",
    "priceUsdc": "0.03",
    "description": "What a buyer agent receives after paying your endpoint.",
    "sellerPayTo": "0x66890857dc33D5066c28AadBeb7CD078F50799A3",
    "network": "eip155:8453",
}


def get(path: str):
    with urllib.request.urlopen(BASE + path, timeout=30) as r:
        return json.loads(r.read().decode())


def post_json(path: str, body: dict, headers: dict | None = None):
    data = json.dumps(body).encode()
    req = urllib.request.Request(BASE + path, data=data, method="POST")
    req.add_header("content-type", "application/json")
    for k, v in (headers or {}).items():
        req.add_header(k, v)
    try:
        with urllib.request.urlopen(req, timeout=30) as r:
            return r.status, dict(r.headers), json.loads(r.read().decode() or "{}")
    except urllib.error.HTTPError as e:
        raw = e.read().decode() or "{}"
        try:
            parsed = json.loads(raw)
        except Exception:
            parsed = {"raw": raw}
        return e.code, dict(e.headers), parsed


def cmd_status():
    print(json.dumps(get("/status.json"), indent=2))


def cmd_foreign():
    print(json.dumps(get("/foreign.json"), indent=2))


def cmd_validate(body: dict | None = None):
    code, _hdrs, out = post_json("/listings/validate", body or EXAMPLE)
    print(code, json.dumps(out, indent=2))


def cmd_challenge():
    print(json.dumps(get("/listings/challenge"), indent=2))


def cmd_probe_list(body: dict | None = None):
    code, hdrs, out = post_json("/listings", body or EXAMPLE)
    pr = hdrs.get("PAYMENT-REQUIRED") or hdrs.get("payment-required")
    print("status", code)
    print("PAYMENT-REQUIRED", (pr[:80] + "…") if pr and len(pr) > 80 else pr)
    print(json.dumps(out, indent=2))
    print("Next: sign Exact 0.10 USDC on Base to payTo from /listings/challenge, retry with PAYMENT-SIGNATURE")


def main(argv: list[str]):
    if len(argv) < 2 or argv[1] in {"-h", "--help", "help"}:
        print("Usage: client.py status|foreign|validate|challenge|probe-list")
        print("Env override: edit BASE at top. Listing fee 0.10 USDC → marketplace payTo.")
        return 0
    cmd = argv[1]
    if cmd == "status":
        cmd_status()
    elif cmd == "foreign":
        cmd_foreign()
    elif cmd == "validate":
        cmd_validate()
    elif cmd == "challenge":
        cmd_challenge()
    elif cmd in {"probe-list", "probe", "list-unpaid"}:
        cmd_probe_list()
    else:
        print("unknown command", cmd, file=sys.stderr)
        return 2
    return 0


if __name__ == "__main__":
    raise SystemExit(main(sys.argv))
