"""Minimal dependency-free starter client for the NumberHub API."""
import json
from urllib import error, parse, request


class NumberHubError(Exception):
    def __init__(self, status, data):
        super().__init__(data.get("message") or data.get("error") or f"HTTP {status}")
        self.status = status
        self.data = data


class NumberHub:
    def __init__(self, api_key, base_url="https://api.numberhub.io/v1"):
        if not api_key:
            raise ValueError("api_key is required")
        self.api_key = api_key
        self.base_url = base_url.rstrip("/")

    def _request(self, method, path, body=None, idempotency_key=None):
        payload = json.dumps(body).encode() if body is not None else None
        headers = {"Authorization": f"Bearer {self.api_key}"}
        if payload is not None:
            headers["Content-Type"] = "application/json"
        if idempotency_key:
            headers["Idempotency-Key"] = idempotency_key
        req = request.Request(self.base_url + path, data=payload, headers=headers, method=method)
        try:
            with request.urlopen(req, timeout=30) as response:
                return json.loads(response.read())
        except error.HTTPError as exc:
            try:
                data = json.loads(exc.read())
            except (ValueError, TypeError):
                data = {"error": f"HTTP {exc.code}"}
            raise NumberHubError(exc.code, data) from exc

    def balance(self):
        return self._request("GET", "/balance")

    def services(self):
        return self._request("GET", "/services")

    def countries(self, service):
        return self._request("GET", "/countries?service=" + parse.quote(service))

    def buy_number(self, service, country, idempotency_key=None, **options):
        return self._request(
            "POST", "/numbers", {"service": service, "country": country, **options},
            idempotency_key=idempotency_key,
        )

    def get_number(self, order_id):
        return self._request("GET", f"/numbers/{int(order_id)}")

    def webhooks(self):
        return self._request("GET", "/webhooks")

    def create_webhook(self, url, events=None):
        return self._request("POST", "/webhooks", {"url": url, "events": events or ["order.*"]})

    def test_webhook(self, webhook_id):
        return self._request("POST", f"/webhooks/{int(webhook_id)}/test")

    def delete_webhook(self, webhook_id):
        return self._request("DELETE", f"/webhooks/{int(webhook_id)}")
