#

from base64 import urlsafe_b64decode, urlsafe_b64encode

from django.core import signing
from django.utils.encoding import force_bytes, force_str


def get_encrypter(max_age=None, key=None):
    return Enrypter(max_age=max_age, key=key)


class Enrypter(object):
    def __init__(self, max_age=None, key=None):
        self.max_age = max_age
        if self.max_age:
            self.signer = signing.TimestampSigner(key=key)
        else:
            self.signer = signing.Signer(key=key)

    def encrypt(self, value):
        # wT: add a character to first of encrypted string to not let it easily base64decode-able.
        enc = self.signer.sign(value)
        res = force_str(urlsafe_b64encode(force_bytes(enc)))
        result = '{}{}'.format(res[-5], res)
        return result

    def decrypt(self, value):
        try:
            signed_value = force_str(urlsafe_b64decode(force_bytes(value[1:])))
        except TypeError:
            raise signing.BadSignature()
        if self.max_age:
            return self.signer.unsign(signed_value, max_age=self.max_age)
        else:
            return self.signer.unsign(signed_value)
