"""
User 모듈 커스텀 예외 정의

인증 및 사용자 관련 에러를 처리하기 위한 예외 클래스들입니다.
"""

from fastapi import HTTPException, status


class AuthException(HTTPException):
    """인증 관련 기본 예외"""

    def __init__(
        self,
        status_code: int,
        code: str,
        message: str,
    ):
        super().__init__(
            status_code=status_code,
            detail={"code": code, "message": message},
        )


# =============================================================================
# 카카오 OAuth 관련 예외
# =============================================================================
class InvalidAuthCodeError(AuthException):
    """유효하지 않은 인가 코드"""

    def __init__(self, message: str = "유효하지 않은 인가 코드입니다."):
        super().__init__(
            status_code=status.HTTP_400_BAD_REQUEST,
            code="INVALID_CODE",
            message=message,
        )


class KakaoAuthFailedError(AuthException):
    """카카오 인증 실패"""

    def __init__(self, message: str = "카카오 인증에 실패했습니다."):
        super().__init__(
            status_code=status.HTTP_400_BAD_REQUEST,
            code="KAKAO_AUTH_FAILED",
            message=message,
        )


class KakaoAPIError(AuthException):
    """카카오 API 호출 오류"""

    def __init__(self, message: str = "카카오 API 호출 중 오류가 발생했습니다."):
        super().__init__(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            code="KAKAO_API_ERROR",
            message=message,
        )


# =============================================================================
# JWT 토큰 관련 예외
# =============================================================================
class TokenExpiredError(AuthException):
    """토큰 만료"""

    def __init__(self, message: str = "토큰이 만료되었습니다. 다시 로그인해주세요."):
        super().__init__(
            status_code=status.HTTP_401_UNAUTHORIZED,
            code="TOKEN_EXPIRED",
            message=message,
        )


class InvalidTokenError(AuthException):
    """유효하지 않은 토큰"""

    def __init__(self, message: str = "유효하지 않은 토큰입니다."):
        super().__init__(
            status_code=status.HTTP_401_UNAUTHORIZED,
            code="INVALID_TOKEN",
            message=message,
        )


class TokenRevokedError(AuthException):
    """취소된 토큰"""

    def __init__(self, message: str = "취소된 토큰입니다. 다시 로그인해주세요."):
        super().__init__(
            status_code=status.HTTP_401_UNAUTHORIZED,
            code="TOKEN_REVOKED",
            message=message,
        )


class MissingTokenError(AuthException):
    """토큰 누락"""

    def __init__(self, message: str = "인증 토큰이 필요합니다."):
        super().__init__(
            status_code=status.HTTP_401_UNAUTHORIZED,
            code="MISSING_TOKEN",
            message=message,
        )


# =============================================================================
# 사용자 관련 예외
# =============================================================================
class UserNotFoundError(AuthException):
    """사용자 없음"""

    def __init__(self, message: str = "사용자를 찾을 수 없습니다."):
        super().__init__(
            status_code=status.HTTP_404_NOT_FOUND,
            code="USER_NOT_FOUND",
            message=message,
        )


class UserInactiveError(AuthException):
    """비활성화된 계정"""

    def __init__(self, message: str = "비활성화된 계정입니다. 관리자에게 문의하세요."):
        super().__init__(
            status_code=status.HTTP_403_FORBIDDEN,
            code="USER_INACTIVE",
            message=message,
        )


class AdminRequiredError(AuthException):
    """관리자 권한 필요"""

    def __init__(self, message: str = "관리자 권한이 필요합니다."):
        super().__init__(
            status_code=status.HTTP_403_FORBIDDEN,
            code="ADMIN_REQUIRED",
            message=message,
        )
