"""Small Aura sandbox API client. Requires Python 3.10+, uses only stdlib."""
import json
import os
import uuid
from urllib.request import Request, urlopen
from urllib.error import HTTPError

class Client:
    def __init__(self, api_key=None, base_url="http://localhost:2000/api/v1"):
        self.api_key = api_key or os.environ["AURA_API_KEY"]
        self.base_url = base_url.rstrip("/")

    def _request(self, endpoint, payload=None, request_key=None):
        headers = {"Authorization": "Bearer " + self.api_key}
        data = None
        if payload is not None:
            data = json.dumps(payload).encode()
            headers.update({"Content-Type": "application/json", "Idempotency-Key": request_key or str(uuid.uuid4())})
        request = Request(self.base_url + endpoint, data=data, headers=headers)
        try:
            with urlopen(request, timeout=15) as response:
                return json.load(response)
        except HTTPError as exc:
            message = exc.read().decode()
            raise RuntimeError(f"Aura API {exc.code}: {message}") from exc

    def accounts(self):
        return self._request("/accounts")["accounts"]

    def quotes(self):
        return self._request("/quotes")["quotes"]

    def order(self, *, request_key, **order):
        """Use the same request_key and order for a retry after a network failure."""
        return self._request("/orders", order, request_key)

    def close(self, account_id, position_id, quantity, *, request_key):
        return self._request("/close", {"accountId": account_id, "positionId": position_id, "quantity": quantity}, request_key)

    def sync(self, account_id):
        return self._request("/sync", {"accountId": account_id})
