import pyautogui # Enter password window
import hashlib # Create hash of the key
import tkinter #tkinter
from tkinter import filedialog
from . import Crypter
import shutil # Copy folder
import os # rm dir, listdir
import glob # list files
import datetime #Get current datetime
from Crypto.Cipher import AES
# Settings
gInUncryptedExtension = "py" # cry for filename.cry
gOutCryptedExtension = "cry" # cry for filename.cry
gFileMaskToDelete = "pyc" #Remove all .pyc files
# Create process run
def Run():
    print(f"{str(datetime.datetime.now())}: Start to create crypted distr")
    ############# Step 1 - select folder to copy 
    lStep_1_TkinterRoot = tkinter.Tk()
    lStep_1_TkinterRoot.withdraw()
    lStep_1_FolderPath = filedialog.askdirectory(parent=lStep_1_TkinterRoot,title='Please select a source code directory to crypt')
    ############# Step 2 - Select folder to save
    lStep_2_FolderPath = filedialog.askdirectory(parent=lStep_1_TkinterRoot,title='Please select a folder to save the crypted result')	
    # Before delete the folder check if directory is empty - else ask user to confirm the deletion
    if len(os.listdir(lStep_2_FolderPath)) != 0:
        lStep_2_ConfirmDelete = pyautogui.confirm('The destination folder contains some files/folders. The are will be removed. Continue?', buttons=['Yes', 'No'])
        if lStep_2_ConfirmDelete=="No":
            raise Exception("Stop program - user suggestion. Don't want to clear destination folder")
    shutil.rmtree(lStep_2_FolderPath, ignore_errors=False, onerror=None)
    ############# Step 3 - Copy folder
    shutil.copytree(lStep_1_FolderPath, lStep_2_FolderPath)
    ############# Step 3.1 - Remove files to delete 
    lPyFilesToDeleteList = [f for f in glob.glob(os.path.join(lStep_2_FolderPath,f"**/*.{gFileMaskToDelete}"), recursive=True)]
    for lFileItem in lPyFilesToDeleteList:
        #Create right \\ splashes
        lFileItem = os.path.abspath(lFileItem)
        #Remove old file
        os.remove(lFileItem)
    ############# Step 4 - Get file list with extension .py
    lPyFileList = [f for f in glob.glob(os.path.join(lStep_2_FolderPath,f"**/*.{gInUncryptedExtension}"), recursive=True)]
    ############# Step 5 - Ask and confirm the secret word
    lKeyHashStr_1 = hashlib.sha256(pyautogui.password('Please enter the key to protect source code').encode("utf-8")).digest()
    lKeyHashStr_2 = hashlib.sha256(pyautogui.password('Please repeat the key to protect source code').encode("utf-8")).digest()
    if lKeyHashStr_1 == lKeyHashStr_2:
        for lFileItem in lPyFileList:
            #Hotfix - dont encrypt __main__.py to __main__.cry - python dont see it
            if True:#"__main__.py" not in lFileItem:
                #Create right \\ splashes
                lFileItem = os.path.abspath(lFileItem)
                Crypter.encrypt_file(lKeyHashStr_1, lFileItem, f"{lFileItem[0:-2]}{gOutCryptedExtension}")
                #Remove old file
                os.remove(lFileItem)
    else:
        raise Exception("User set different secret key 1 and key 2")
    ############ Step 6 - Final stage
    print(f"{str(datetime.datetime.now())}: Crypted distr is created!")