#!/home/puneet/Desktop/cluttermanager/venv/bin/python3

"""
Copyright (C) Puneet Saini
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
"""
import argparse
import os
import shutil
import sys
from collections import defaultdict

from cluttermanager.bindings import (abstract_types, extension_to_type,
                            extension_to_type_abstracted, filetypes)


class ClutterManager:
    def __init__(self, root, abstract):
        self.root = root
        self.index = defaultdict(list)
        self.abstract = abstract

    def sort(self):
        for item in os.listdir(self.root):
            path = os.path.join(self.root, item)
            if os.path.isdir(path):
                continue

            if self.abstract:
                self.index[item] = extension_to_type_abstracted[item.split(
                    '.')[-1]]
            else:
                self.index[item] = extension_to_type[item.split('.')[-1]]

            dest_path = os.path.join(
                self.root, self.index[item].capitalize(), item)

            try:
                if not os.path.isdir(os.path.dirname(dest_path)):
                    os.makedirs(os.path.dirname(dest_path))
                shutil.move(path, dest_path)
                print('{} -> {}'.format(path, dest_path))
            except NotADirectoryError:
                print('A file with name: {} is'.format(item), end='')
                print(' conflicting with directory name.')
                print('Please rename it and try again')
                sys.exit(1)

    def undo(self):
        for item in os.listdir(self.root):
            path = os.path.join(self.root, item)

            if not os.path.isdir(path):
                continue

            if self.abstract:
                folder_names = list(abstract_types.keys())
            else:
                folder_names = list(filetypes.keys())
            folder_names.append('other')

            if item.lower() in folder_names:
                for files in os.listdir(path):
                    shutil.move(os.path.join(path, files), self.root)
                    print('{} -> {}'.format(os.path.join(path, files),
                                            self.root))
                shutil.rmtree(path)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--root", help="relative path to clumsy directory",
                        default=".")
    parser.add_argument("--abstract", help="abstracted folder names",
                        default='True')
    parser.add_argument("--undo", help="make things clumsy again",
                        action='store_true')
    args = parser.parse_args()

    sorter = ClutterManager(os.path.abspath(args.root),
                            args.abstract == 'True')
    if args.undo:
        sorter.undo()
    else:
        sorter.sort()
