from django.core.exceptions import ValidationError as DjangoValidationError
from utils.data import response_codes


response_codes = {
    "validation": {
        "Code": "some_value",  
        "Message": "Validation error occurred"
    },
    "bad_request": {
        "Code": "400",
        "Message": "Bad request"
    },
    
}


class CustomException(Exception):
    def __init__(self, code=None, message=None):
        self.code = code
        self.message = message
        super().__init__(message)

class ValidationError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("validation", {}).get("Code", "422")
        message = message or response_codes.get("validation", {}).get("Message", "Default validation error message")
        super().__init__(code=code, message=message)

class BadRequestError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("bad_request", {}).get("Code", "400")
        message = message or response_codes.get("bad_request", {}).get("Message", "Default bad request message")
        super().__init__(code=code, message=message)

class UnauthorizedError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("unauthorized", {}).get("code","403")
        message = message or response_codes.get("unauthorized", {}).get("desc","No permission to view or access the content")
        super().__init__(code=code, message=message)

class NotFoundError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("not_found", {}).get("code","404")
        message = message or response_codes.get("not_found", {}).get("desc","Resource not found")
        super().__init__(code=code, message=message)

class ConflictError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("conflict", {}).get("code", "409")
        message = message or response_codes.get("conflict", {}).get("desc", "Conflict")
        super().__init__(code=code, message=message)

class HTTPVersionNotSupportedError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("http_version_not_supported", {}).get("code", "505")
        message = message or response_codes.get("http_version_not_supported", {}).get("desc", "HTTP Version Not Supported")
        super().__init__(code=code, message=message)

class FailedDependencyError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("failed_dependency", {}).get("code", "424")
        message = message or response_codes.get("failed_dependency", {}).get("desc", "Failed Dependency")
        super().__init__(code=code, message=message)

class UnauthenticatedError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("unauthenticated", {}).get("code", "401")
        message = message or response_codes.get("unauthenticated", {}).get("desc", "The user is unauthenticated")
        super().__init__(code=code, message=message)

class RedundancyError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("redundancy", {}).get("code", "405")
        message = message or response_codes.get("redundancy", {}).get("desc", "File or data already exists")
        super().__init__(code=code, message=message)

class InvalidRequestError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("invalid_request", {}).get("code", "406")
        message = message or response_codes.get("invalid_request", {}).get("desc", "Invalid request type")
        super().__init__(code=code, message=message)

class DuplicateError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("duplicate", {}).get("code", "407")
        message = message or response_codes.get("duplicate", {}).get("desc", "Data already exists")
        super().__init__(code=code, message=message)

class LockedError(CustomException):
    def __init__(self, message=None):
        code = response_codes.get("locked", {}).get("code", "423")
        message = message or response_codes.get("locked", {}).get("desc", "Locked")
        super().__init__(code=code, message=message)
