from __future__ import annotations

import json
import urllib.parse
import urllib.request
from dataclasses import dataclass
from typing import Any


@dataclass
class ApiClient:
    base_url: str
    token: str = ""
    timeout: int = 15

    def get(self, action: str, params: dict[str, Any] | None = None) -> dict[str, Any]:
        query = urllib.parse.urlencode({"action": action, **(params or {})})
        request = urllib.request.Request(f"{self.base_url}?{query}", headers=self._headers())
        return self._send(request)

    def post(self, action: str, data: dict[str, Any]) -> dict[str, Any]:
        body = json.dumps(data, ensure_ascii=False).encode("utf-8")
        request = urllib.request.Request(
            f"{self.base_url}?{urllib.parse.urlencode({'action': action})}",
            data=body,
            headers={"Content-Type": "application/json; charset=utf-8", **self._headers()},
        )
        return self._send(request)

    def _headers(self) -> dict[str, str]:
        return {"X-API-Token": self.token} if self.token else {}

    def _send(self, request: urllib.request.Request) -> dict[str, Any]:
        try:
            with urllib.request.urlopen(request, timeout=self.timeout) as response:
                text = response.read().decode("utf-8")
                return json.loads(text)
        except Exception as exc:
            return {"success": False, "error": str(exc)}

