import hashlib
from cryptography.fernet import Fernet


def generate_key():
    return Fernet.generate_key().decode("utf-8")


def encrypt_data(key, content):
    is_str_data = isinstance(content, str)
    if is_str_data:
        content = content.encode("utf-8")
    fernet = Fernet(key.encode("utf-8"))
    encrypted_data = fernet.encrypt(content)
    if is_str_data:
        encrypted_data = encrypted_data.decode("utf-8")
    return encrypted_data


def decrypt_data(key, content):
    is_str_data = isinstance(content, str)
    if is_str_data:
        content = content.encode("utf-8")
    fernet = Fernet(key.encode("utf-8"))
    decrypted_data = fernet.decrypt(content)
    if is_str_data:
        decrypted_data = decrypted_data.decode("utf-8")
    return decrypted_data


def md5_hash(filename):
    hash_md5 = hashlib.md5()
    with open(filename, "rb") as source_file:
        for chunk in iter(lambda: source_file.read(512*1024), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()


def md5_hash_bytes(bytes_obj):
    hash_md5 = hashlib.md5()
    for chunk in iter(lambda: bytes_obj.read(512*1024), b""):
        hash_md5.update(chunk)
    return hash_md5.hexdigest()


def md5_hash_str(string_data):
    hash_md5 = hashlib.md5()
    hash_md5.update(string_data)
    return hash_md5.hexdigest()