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"
