from authlib.common.errors import AuthlibBaseError


class JoseError(AuthlibBaseError):
    pass


class DecodeError(JoseError):
    error = "decode_error"


class MissingAlgorithmError(JoseError):
    error = "missing_algorithm"


class UnsupportedAlgorithmError(JoseError):
    error = "unsupported_algorithm"


class BadSignatureError(JoseError):
    error = "bad_signature"

    def __init__(self, result):
        super().__init__()
        self.result = result


class InvalidHeaderParameterNameError(JoseError):
    error = "invalid_header_parameter_name"

    def __init__(self, name):
        description = f"Invalid Header Parameter Name: {name}"
        super().__init__(description=description)


class InvalidEncryptionAlgorithmForECDH1PUWithKeyWrappingError(JoseError):
    error = "invalid_encryption_algorithm_for_ECDH_1PU_with_key_wrapping"

    def __init__(self):
        description = (
            "In key agreement with key wrapping mode ECDH-1PU algorithm "
            "only supports AES_CBC_HMAC_SHA2 family encryption algorithms"
        )
        super().__init__(description=description)


class InvalidAlgorithmForMultipleRecipientsMode(JoseError):
    error = "invalid_algorithm_for_multiple_recipients_mode"

    def __init__(self, alg):
        description = f"{alg} algorithm cannot be used in multiple recipients mode"
        super().__init__(description=description)


class KeyMismatchError(JoseError):
    error = "key_mismatch_error"
    description = "Key does not match to any recipient"


class MissingEncryptionAlgorithmError(JoseError):
    error = "missing_encryption_algorithm"
    description = "Missing 'enc' in header"


class UnsupportedEncryptionAlgorithmError(JoseError):
    error = "unsupported_encryption_algorithm"
    description = "Unsupported 'enc' value in header"


class UnsupportedCompressionAlgorithmError(JoseError):
    error = "unsupported_compression_algorithm"
    description = "Unsupported 'zip' value in header"


class InvalidUseError(JoseError):
    error = "invalid_use"
    description = "Key 'use' is not valid for your usage"


class InvalidClaimError(JoseError):
    error = "invalid_claim"

    def __init__(self, claim):
        self.claim_name = claim
        description = f"Invalid claim '{claim}'"
        super().__init__(description=description)


class MissingClaimError(JoseError):
    error = "missing_claim"

    def __init__(self, claim):
        description = f"Missing '{claim}' claim"
        super().__init__(description=description)


class InsecureClaimError(JoseError):
    error = "insecure_claim"

    def __init__(self, claim):
        description = f"Insecure claim '{claim}'"
        super().__init__(description=description)


class ExpiredTokenError(JoseError):
    error = "expired_token"
    description = "The token is expired"


class InvalidTokenError(JoseError):
    error = "invalid_token"
    description = "The token is not valid yet"
