import logging

logger = logging.getLogger(__name__)

class RateLimitExceededError(Exception):
    """Custom exception for rate limit exceeded."""
    pass


def handle_rate_limit_error(error):
    """Handles rate limit exceeded errors gracefully."""
    error_message = str(error)
    # Log the error (important for monitoring).
    logger.error(f"Rate limit exceeded: {error_message}")

    # Return a user-friendly error message (avoid exposing internal details).
    # This allows the client to understand the issue and retry later.
    return {"error": "Rate limit exceeded. Please try again later.", "status_code": 429}


class ServiceDegradedError(Exception):
    """Custom exception for service degradation."""
    pass


def handle_service_degradation(error, partial_result=None):
    """Handles service degradation gracefully, returning partial results when possible."""
    error_message = str(error)
    logger.warning(f"Service degraded: {error_message}")

    if partial_result:
        # Return a partial result with a warning message.
        return {"warning": "Service degraded, returning partial results.", "results": partial_result, "status_code": 200}
    else:
        # Return a generic error message.
        return {"error": "Service temporarily unavailable.  Service is degraded.", "status_code": 503}


# Example Usage (for testing):
if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)

    # Rate Limit Example
    try:
        raise RateLimitExceededError("Rate limit reached.")
    except RateLimitExceededError as e:
        error_response = handle_rate_limit_error(e)
        print(f"Rate Limit Error Response: {error_response}")

    # Service Degradation Example
    try:
        # Simulate a partial result (e.g., some data was fetched before the service degraded).
        partial_data = [{"id": 1, "name": "Item 1"}, {"id": 2, "name": "Item 2"}]
        raise ServiceDegradedError("Database connection lost.")
    except ServiceDegradedError as e:
        degradation_response = handle_service_degradation(e, partial_data)
        print(f"Service Degradation Response: {degradation_response}")

    try:
        raise ServiceDegradedError("Cache unavailable.")
    except ServiceDegradedError as e:
        degradation_response = handle_service_degradation(e)
        print(f"Service Degradation Response (no partial data): {degradation_response}")