from fastapi import HTTPException, status

from app.utils.messages import Message


class AlreadyExistsException(HTTPException):
    def __init__(
            self,
            class_name: str,
            message: str = None,
            status_code: int = status.HTTP_400_BAD_REQUEST
    ):
        super().__init__(
            status_code=status_code,
            detail=message or Message.Error.ALREADY_EXIST % class_name
        )

class InvalidException(HTTPException):
    def __init__(
            self,
            class_name: str = None,
            message: str = None,
            status_code: int = status.HTTP_400_BAD_REQUEST
    ):
        super().__init__(
            status_code=status_code,
            detail=message or Message.Error.INVALID % class_name
        )


class NotFoundException(HTTPException):
    def __init__(
            self,
            class_name: str,
            entity_id: int = None,
            message: str = None,
            status_code: int = status.HTTP_404_NOT_FOUND
    ):
        super().__init__(
            status_code=status_code,
            detail=message or (
                Message.Error.NOT_FOUND % class_name if not entity_id else f"{class_name} {entity_id} {Message.Error.NOT_FOUND_WITH_ID}")
        )


class UnauthorizedException(HTTPException):
    def __init__(
            self,
            message: str = Message.Error.AUTHORIZATION_FAIL,
            status_code: int = status.HTTP_401_UNAUTHORIZED
    ):
        super().__init__(
            status_code=status_code,
            detail=message
        )


class AuthenticationError(HTTPException):
    def __init__(
            self,
            message: str = Message.Error.JWT_WRONG_TOKEN_ERROR,
            status_code: int = status.HTTP_401_UNAUTHORIZED
    ):
        super().__init__(
            status_code=status_code,
            detail=message
        )


class AuthorizationException(HTTPException):
    def __init__(
            self,
            message: str = Message.Error.UNAUTHORIZED,
            status_code: int = status.HTTP_403_FORBIDDEN
    ):
        super().__init__(
            status_code=status_code,
            detail=message
        )


class AccountLockedError(HTTPException):
    def __init__(
            self,
            message: str = Message.Error.ACCOUNT_LOCKED,
            status_code: int = status.HTTP_423_LOCKED
    ):
        super().__init__(
            status_code=status_code,
            detail=message
        )


class DatabaseError(HTTPException):
    def __init__(
            self,
            message: str = Message.Error.DB_OPERATION_FAILED,
            status_code: int = status.HTTP_500_INTERNAL_SERVER_ERROR
    ):
        super().__init__(
            status_code=status_code,
            detail=message
        )


class ValidationError(HTTPException):
    def __init__(
            self,
            message: str = Message.Error.VALIDATION_ERROR,
            status_code: int = status.HTTP_422_UNPROCESSABLE_ENTITY
    ):
        super().__init__(
            status_code=status_code,
            detail=message
        )
