import time
import logging
from functools import wraps
import requests

logger = logging.getLogger(__name__)

def retry_with_backoff(max_retries=3, base_delay=1):
    """
    Retry decorator with exponential backoff for API calls.
    
    Args:
        max_retries (int): Maximum number of retry attempts
        base_delay (int): Base delay in seconds for exponential backoff
    """
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for attempt in range(max_retries + 1):
                try:
                    response = func(*args, **kwargs)
                    
                    # Check if response is a requests.Response object
                    if isinstance(response, requests.Response):
                        response.raise_for_status()
                    return response
                    
                except Exception as e:
                    if attempt == max_retries:
                        logger.error(f"Failed after {max_retries} retries: {str(e)}")
                        raise
                    
                    # Calculate exponential delay
                    delay = base_delay * (2 ** attempt)
                    logger.warning(f"Attempt {attempt + 1} failed: {str(e)}. Retrying in {delay} seconds...")
                    time.sleep(delay)
            
            return None  # Should never reach here
        return wrapper
    return decorator