import configparser
import os
import argparse

def readConfig(configFilePath):
    config = configparser.ConfigParser()
    
    if os.path.isfile(configFilePath):
        config.read(configFilePath)

    return config

class ArgParser:
    def __init__(self):
        self.__flags = {}
        self.__parser = argparse.ArgumentParser()
        self.__instanceDirArgSet = False
        self.__config = None
        self.__parsedArgs = {}
        
    def addArg(self, alias,
                     shortFlag,
                     longFlag,
                     help,
                     type,
                     default=None,
                     ignoreDatabaseConfig=False):
                         
        self.__flags[alias] = {"longFlag": longFlag,
                               "hasDefault": False,
                               "ignoreDatabaseConfig": ignoreDatabaseConfig,
                               "type": type}
        
        if default != None:
            self.__flags[alias]["hasDefault"] = True
            
        self.__parser.add_argument("-%s" % shortFlag,
                                   "--%s" % longFlag,
                                   help=help,
                                   type=type,
                                   default=default)
    
    def addInstanceDirArg(self):
        self.__instanceDirArgSet = True
        
        self.addArg(alias="datasetDir", shortFlag="d", longFlag="dataset_dir",
                    help="the base direcotry of the dataset; if this flag is given the others can be omitted",
                    type=str, ignoreDatabaseConfig=True)
        
    
    def parse(self):
        self.__parsedArgs = {}
        args = vars(self.__parser.parse_args())
        
        if self.__instanceDirArgSet:
            self.__config = readConfig(os.path.join(args["dataset_dir"],
                                                    "dataset.config"))
            self.__parseDatasetConfig()
        
        for alias, flag in self.__flags.items():
            self.__parsedArgs[alias] = self.__processFlag(args, flag)
        
        self.__config = None
        
        return self.__parsedArgs
    
    def __parseDatasetConfig(self):
        for flag, value in self.__config["STRUCTURE"].items():
            self.__parsedArgs[flag] = value
    
    def __processFlag(self, args, flag):
        longFlag = flag["longFlag"]
        
        tmpValue = self.__parsedArgs[longFlag] if longFlag in self.__parsedArgs else None
        
        if flag["ignoreDatabaseConfig"] == True:
            tmpValue = None
        
        if args[longFlag]:
            tmpValue = args[longFlag]
        
        if tmpValue == None:
            tmpValue = flag["type"](input("pass arguement %s: " % longFlag))

        
        return tmpValue
        
