# social_insights/utils.py
import time
import json
from typing import Dict, Any, Optional
import requests

class HttpError(Exception):
    def __init__(self, status: int, payload: Any):
        super().__init__(f"HTTP {status}: {payload}")
        self.status = status
        self.payload = payload

def http_get(url: str, headers: Dict[str, str], params: Dict[str, Any], retries: int = 3) -> Dict[str, Any]:
    for i in range(retries):
        r = requests.get(url, headers=headers, params=params, timeout=30)
        if r.status_code == 429 or 500 <= r.status_code < 600:
            time.sleep(2 ** i)
            continue
        if not r.ok:
            raise HttpError(r.status_code, safe_json(r))
        return safe_json(r)
    raise HttpError(r.status_code, safe_json(r))

def http_post(url: str, headers: Dict[str, str], data: Dict[str, Any], json_body: Optional[Dict[str, Any]]=None) -> Dict[str, Any]:
    r = requests.post(url, headers=headers, data=data if json_body is None else None, json=json_body, timeout=30)
    if not r.ok:
        raise HttpError(r.status_code, safe_json(r))
    return safe_json(r)

def safe_json(resp) -> Any:
    try:
        return resp.json()
    except Exception:
        return resp.text

def clamp_int(x) -> int:
    try:
        return int(x)
    except:
        return 0
