from rest_framework import status
from rest_framework.exceptions import APIException as _default_APIException


class APIException(_default_APIException):

    status_code = status.HTTP_400_BAD_REQUEST
    default_detail = {
        'status': 'error',
        'code': 'unknown',
        'detail': 'Unknown error occurred',
    }


class ArmaIndustrialFirewallException(APIException):

    status_code = status.HTTP_400_BAD_REQUEST
    default_detail = {
        'status': 'error',
        'code': 'unknown',
        'detail': 'Unknown error occurred',
    }


class InvalidCredentialException(ArmaIndustrialFirewallException):

    default_detail = {
        'status': 'error',
        'code': 'unauthorized',
        'detail': 'Invalid credentials provided to connect to firewall',
    }


class ConnectionException(ArmaIndustrialFirewallException):

    default_detail = {
        'status': 'error',
        'code': 'connection_error',
        'detail': 'There was a problem connecting to the firewall',
    }


class IncompatibilityVersionException(ArmaIndustrialFirewallException):

    default_detail = {
        'status': 'error',
        'code': 'incompatible',
        'detail': 'The firewall version is incompatible with the current console version'
    }


class InvalidRequestException(ArmaIndustrialFirewallException):

    default_detail = {
        'status': 'warning',
        'code': 'request_error',
        'detail': 'Firewall was reconfigured and caused internal error. Auto FW health check initiated. Please try again'
    }


class RemoteException(ArmaIndustrialFirewallException):

    default_detail = {
        'status': 'error',
        'code': 'remote_error',
        'detail': 'Unknown error occurred. Auto FW health check initiated. Please try again'
    }


class NoContentDispositionException(ArmaIndustrialFirewallException):

    default_detail = {
        'status': 'error',
        'code': 'no_content',
        'detail': 'No content disposition during downloading file from ARMA IF'
    }


class InvalidFileException(ArmaIndustrialFirewallException):

    default_detail = {
        'status': 'error',
        'code': 'invalid',
        'detail': 'Invalid file uploaded'
    }


class FailedUploadException(ArmaIndustrialFirewallException):

    default_detail = {
        'status': 'error',
        'code': 'failed',
        'detail': 'Failed to upload file to firewall'
    }


class InvalidResponseException(ArmaIndustrialFirewallException):

    default_detail = {
        'status': 'error',
        'code': 'invalid_response',
        'detail': 'Unable to read firewall response'
    }

