#!/usr/bin/env python3

import sys
import os.path

from xdg.BaseDirectory import xdg_cache_home, xdg_config_home

class AliasRC:

    def __init__(self):
        #self.cachefile = os.path.join(xdg_cache_home, 'alias.map')
        #AliasRC.__filesanity(self.cachefile)
        
        self.aliasrc = os.path.join(xdg_config_home, 'mkalias.source')
        AliasRC.__filesanity(self.aliasrc)

        self.map = {}
        self.__readMap()

    
    @staticmethod
    def __filesanity(file):
        if not os.path.exists(file):  # touch
            with open(file,'w') as f:
                f.write("")
        

    def __readMap(self):
        with open(self.aliasrc, 'r') as f:
            for line in f:
                alias, command = line.splitlines()[0].split('="')

                alias = alias.split('alias ')[-1]
                command = command[:-1]                                # last character will always be '"'
                self.map[alias] = command
            f.close()


    def __writeMap(self):
        with open(self.aliasrc, 'w') as f:
            for alias, command in self.map.items():
                f.write('alias %s="%s"\n' % (alias, command))
            f.close()


    def insertAlias(self, alias, command):
        if alias in self.map:
            print("[Error] ", alias, "already defined. Overwrite? [Y/n]:", file=sys.stderr, end="")

            ans = input().strip()
            if ans[0].lower() == 'y' or len(ans) == 0:
                del self.map[alias]
                self.insertAlias(alias, command)
                return 0

            print("Cancelled.", file=sys.stderr)
            return 1

        self.map[alias] = command
        self.__writeMap()
        
        print("Inserted.", file=sys.stderr)
        print("alias %s=\"%s\"" % (alias, alias_command))


    
    def removeAlias(self, alias, write=False):
        try:
            del self.map[alias]
            if write:
                self.__writeMap()
            print("Removed", file=sys.stderr)
            print("unalias %s" % alias)


        except KeyError:
            print("Unable to find alias:", alias, file=sys.stderr)




def _help():
    title = sys.argv[0].split(os.path.sep)[-1]
    padd  = "".join([" " for x in title])

    print('''
     %s insert rmf "rm -rf"
 or  %s remove rmf

An alias management tool that preserves across shells/boots''' % (title, padd),
          file=sys.stderr)
    exit(-1)


if __name__ == "__main__":

    try:
        command = sys.argv[1]                           # insert, remove
        alias= sys.argv[2]

        al = AliasRC()

        if command == "insert":
            alias_command = sys.argv[3]
            al.insertAlias(alias, alias_command)
        elif command == "remove":
            al.removeAlias(alias, True)
        else:
            _help()

    except IndexError:
        _help()


