# -*- coding: utf-8 -*-

"""\
© Copyright. All rights reserved.

"""

from __future__ import unicode_literals
from base64 import b64encode, b64decode
import hashlib
import os

from oscrypto.symmetric import aes_cbc_pkcs7_encrypt, aes_cbc_pkcs7_decrypt


class Encryptor:
    __iv_size = 16

    @staticmethod
    def encrypt(plain_text, secret_key):
        iv_bytes = os.urandom(Encryptor.__iv_size)
        plain_text_bytes = bytes(plain_text, "UTF-8")
        secret_key_bytes = bytes(secret_key, "UTF-8")
        hashed_secret_key = hashlib.sha256(secret_key_bytes).digest()
        iv, encrypted = aes_cbc_pkcs7_encrypt(hashed_secret_key, plain_text_bytes, iv_bytes)
        combination = iv + encrypted
        return b64encode(combination)

    @staticmethod
    def decrypt(base64_encoded_combination, secret_key):
        iv_and_encrypted_text = b64decode(base64_encoded_combination)
        iv = iv_and_encrypted_text[0:Encryptor.__iv_size]
        encrypted_text = iv_and_encrypted_text[Encryptor.__iv_size:len(iv_and_encrypted_text)]
        secret_key_bytes = bytes(secret_key, "UTF-8")
        hashed_secret_key = hashlib.sha256(secret_key_bytes).digest()
        decrypted = aes_cbc_pkcs7_decrypt(hashed_secret_key, encrypted_text, iv)
        return decrypted.decode("UTF-8")
