"""Flashscore HTTP client"""
import httpx
import time
from typing import Optional
from app.core.config import settings
import logging

logger = logging.getLogger(__name__)


class FlashscoreClient:
    """HTTP client for Flashscore with rate limiting"""
    
    def __init__(self):
        self.base_url = settings.flashscore_base_url
        self.rate_limit_seconds = settings.flashscore_rate_limit_seconds
        self.user_agent = settings.flashscore_user_agent
        self.last_request_time = 0.0
        self.client = httpx.Client(
            timeout=30.0,
            headers={"User-Agent": self.user_agent},
            follow_redirects=True
        )
    
    def _rate_limit(self):
        """Apply rate limiting"""
        elapsed = time.time() - self.last_request_time
        if elapsed < self.rate_limit_seconds:
            sleep_time = self.rate_limit_seconds - elapsed
            time.sleep(sleep_time)
        self.last_request_time = time.time()
    
    def get(self, url: str, retries: int = 3) -> Optional[httpx.Response]:
        """GET request with retries and rate limiting"""
        full_url = url if url.startswith("http") else f"{self.base_url}{url}"
        
        for attempt in range(retries):
            try:
                self._rate_limit()
                response = self.client.get(full_url)
                response.raise_for_status()
                return response
            except httpx.HTTPError as e:
                logger.warning(f"Request failed (attempt {attempt + 1}/{retries}): {e}")
                if attempt == retries - 1:
                    logger.error(f"Failed to fetch {full_url} after {retries} attempts")
                    return None
                time.sleep(2 ** attempt)  # Exponential backoff
        
        return None
    
    def close(self):
        """Close the client"""
        self.client.close()

