# Imports
import os
import json
import shutil


# Main
if __name__ == "__main__":
    ext = 0
    def folder_manager(path,exception_file,extensions):
        global ext
# Doing intial checks whether  all inputs are valid or not.
#----------------------------------------------------------------------------------------------------------------
        # Importing content of Exception file into a set.
        with open(exception_file,'r',encoding='utf-8') as exct_file:
            execptions = exct_file.read()
        execptions = set(execptions.split('\n'))

        # Changing directory to give path.
        if os.path.isdir(path):
            os.chdir(path)

        # Checking if input  extension is list or not.
        if type( extensions) is not list:
            raise Exception('Expected a list object.')
        extensions = set( extensions)

# Capitalizing all files except the Exceptions. (Folders remains untouched)
#----------------------------------------------------------------------------------------------------------------
        # Generating a list of all files in path folder except Exceptions.
        all_files = {file.lower() for file in os.listdir(path) if os.path.isfile(file)}
        all_files = all_files - execptions

        # Capitalizing all file names in all_files list.
        for file in all_files:
            _name, _ext = os.path.splitext(file)
            os.rename(os.path.join(path,file),('.'.join([_name.title(),_ext[1:]])))


#----------------------------------------------------------------------------------------------------------------
        # Generating a list of files which needs to be renamed as numbers. (i.e. is input  extensions)
        rename_files = {file for file in all_files if file.split('.')[1] in  extensions}

        # Creating a folder named according to the file  extensions and dumping the files in the folder.
        for file_ in rename_files:
            # Needed Variables
            name, ext = os.path.splitext(file_)
            ext = ext[1:]
            folder_name = ext 


            # Code that creates a folder and dump the files in it.
            if ext == '':
                continue

            if os.path.exists(os.path.join(path,ext)):
                os.rename(os.path.join(path,ext),os.path.join(path,ext))
                shutil.move(os.path.join(path,file_),os.path.join(path,ext,file_))
                
            else:
                if os.path.exists(os.path.join(path,folder_name)):
                    shutil.move(os.path.join(path,file_),os.path.join(path,folder_name,file_))

                else:
                    os.makedirs(os.path.join(path,folder_name))
                    shutil.move(os.path.join(path,file_),os.path.join(path,folder_name,file_))

# Deleting Empty Folders, Non-empty Folders are untouched and clearing up some mess created earlier.
#----------------------------------------------------------------------------------------------------------------------

        for folder in os.listdir(path):
            # Deleted Empty folders
            if os.path.isdir(folder):
                if len(os.listdir(os.path.join(path,folder))) == 0:
                    os.rmdir(os.path.join(path,folder))
                    continue


#----------------------------------------------------------------------------------------------------------------------


    def code_runner():

    # Taking user input for Path.
    #----------------------------------------------------------------------------------------------------------------------
        path = input('\nEnter the Path of folder you want to Manage.\nPlease make sure what this script does by reading the Readme.md file.\nEnter Here : ')
        while os.path.isdir(path) == False:
            print('The given path is not valid! Please enter a correct Path.')
            path = input('\nEnter the Path of folder you want to Manage.\nPlease make sure what this script does by reading the Readme.md\nEnter Here : ')
            if os.path.isdir(path) == True:
                break

    # Taking user input for Exception file.
    #----------------------------------------------------------------------------------------------------------------------
        exception_file = input('\nEnter the path of Exception file.\nEnter here : ')
        while os.path.isfile(exception_file) == False:
            print('The given path is not valid! Please enter a correct Path.')
            exception_file = input('\nEnter the path of Exception file.\nEnter here : ')
            if os.path.isfile(exception_file) == True:
                break

    # Taking user input for  extensions.
    #----------------------------------------------------------------------------------------------------------------------
        with open('all-file-extensions.json','r') as json_pointer:
            json_file_exts = json.load(json_pointer)

        extensions = input('\nEnter  extensions of files you want to dump.\nExample - \"dll,exe,txt\" .Don\'t enclose in Inverted commas and seperate  extensions with comma.\nEnter here : ')
        extensions =  extensions.replace(' ','')
        extensions =  extensions.split(',')

        for ext in  extensions:
            ext_json = ext.upper()
            while ext_json not in json_file_exts:
                print(f'{ext} is a Invalid  extension! Please Enter a valid  extension.')
                extensions = input('\nEnter  extensions of files you want to dump.\nExample - \"dll,exe,txt\" .Don\'t enclose in Inverted commas and seperate  extensions with comma.\nEnter here : ')
                extensions =  extensions.replace(' ','')
                extensions =  extensions.split(',')
                for ext in  extensions:
                    ext_json = ext.upper()
                    if ext_json in json_file_exts:
                        break


        folder_manager(path=path,exception_file=exception_file, extensions= extensions)
        print('\nCompleted! Thanks for using this script.')

    code_runner()