from typing import Dict, Any, Optional


class ServiceException(Exception):
    """Base exception for all service errors"""

    def __init__(
        self,
        message: str,
        error_code: str,
        status_code: int = 500,
        details: Optional[Dict[str, Any]] = None
    ):
        self.message = message
        self.error_code = error_code
        self.status_code = status_code
        self.details = details or {}
        super().__init__(message)


class ValidationException(ServiceException):
    """Validation errors (400)"""
    def __init__(self, message: str, details: Optional[Dict] = None):
        super().__init__(message, "VALIDATION_ERROR", 400, details)


class AuthenticationException(ServiceException):
    """Authentication errors (401)"""
    def __init__(self, message: str = "Unauthorized"):
        super().__init__(message, "AUTHENTICATION_ERROR", 401)


class NotFoundException(ServiceException):
    """Not found errors (404)"""
    def __init__(self, message: str, details: Optional[Dict] = None):
        super().__init__(message, "NOT_FOUND", 404, details)


class ExternalServiceException(ServiceException):
    """External service errors (502)"""
    def __init__(self, service: str, message: str, details: Optional[Dict] = None):
        super().__init__(
            f"{service} error: {message}",
            "EXTERNAL_SERVICE_ERROR",
            502,
            {"service": service, **(details or {})}
        )


class RateLimitException(ServiceException):
    """Rate limit errors (429)"""
    def __init__(self, retry_after: Optional[int] = None):
        super().__init__(
            "Rate limit exceeded",
            "RATE_LIMIT_EXCEEDED",
            429,
            {"retry_after": retry_after}
        )


class TranslationException(ServiceException):
    """Translation service errors"""
    def __init__(self, message: str, details: Optional[Dict] = None):
        super().__init__(message, "TRANSLATION_ERROR", 500, details)


class WinePairingException(ServiceException):
    """Wine pairing service errors"""
    def __init__(self, message: str, details: Optional[Dict] = None):
        super().__init__(message, "WINE_PAIRING_ERROR", 500, details)


class BeerPairingException(ServiceException):
    """Beer pairing service errors"""
    def __init__(self, message: str, details: Optional[Dict] = None):
        super().__init__(message, "BEER_PAIRING_ERROR", 500, details)


class MenuExtractionException(ServiceException):
    """Menu extraction service errors"""
    def __init__(self, message: str, details: Optional[Dict] = None):
        super().__init__(message, "MENU_EXTRACTION_ERROR", 500, details)
