from __future__ import annotations

import logging
import time
from typing import Any

import requests


class HttpClient:
    def __init__(self, timeout: int = 15, retries: int = 3, backoff: float = 1.5):
        self.timeout = timeout
        self.retries = retries
        self.backoff = backoff
        self.session = requests.Session()
        self.log = logging.getLogger(self.__class__.__name__)

    def get(self, url: str, **kwargs: Any) -> requests.Response:
        last_error: Exception | None = None
        for attempt in range(1, self.retries + 1):
            try:
                response = self.session.get(url, timeout=self.timeout, **kwargs)
                response.raise_for_status()
                return response
            except requests.RequestException as exc:
                last_error = exc
                self.log.warning("GET failed attempt=%s url=%s error=%s", attempt, url, exc)
                if attempt < self.retries:
                    time.sleep(self.backoff ** (attempt - 1))
        raise last_error or RuntimeError(f"GET failed: {url}")

    def get_json(self, url: str, **kwargs: Any) -> dict[str, Any]:
        return self.get(url, **kwargs).json()

