import os, sys, argparse
sys.path.append(os.path.join(__file__, '..', '..'))
from src.cmd import Cmd as cmd
from src.util import *
from src.segment import *
from src.configuration import dir_map, config
import src

def _router(args):
    c = cmd(args)
    c.run()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Run the CCHRRD conversion programs.")
    subparsers = parser.add_subparsers(help='sub-command help')
   
    """Create new project argparser"""   
    h = src.cmd.help.new_project
    c = config
    new_project = subparsers.add_parser('new_project', help=h['help'])
    new_project.add_argument('-n', '--name', help=h['name'])
    new_project.add_argument('--project_dir', help=h['project_dir'])
    new_project.add_argument('-i', '--in_dir', help=h['in_dir'])
    new_project.add_argument('-m', '--metadata_dir', help=h['metadata_dir'])
    new_project.add_argument('-r', '--rule_dir', help=h['rule_dir'])
    new_project.add_argument('-f', '--follow_period', help=h['follow_period'])
    new_project.add_argument('-t', '--threads', default='250',help=h['threads'])
    new_project.add_argument('-c', '--cores', help=h['cores'], default='4')
    new_project.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    new_project.add_argument('--host', default='localhost', help=h['host'])
    new_project.add_argument('-p', '--port', default='3306', help=h['port'])
    new_project.add_argument('--db_stand_name', help=h['db_stand_name'])
    new_project.add_argument('--db_recid_name', help=h['db_recid_name'])
    new_project.set_defaults(cmd='new_project', func=_router)
    
    """Create add_user argparser"""   
    h = src.cmd.help.add_user
    add_user = subparsers.add_parser('add_user', help=h['help'])
    add_user.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    add_user.set_defaults(cmd='add_user', func=_router)
    
    """Create update_user argparser"""
    h = src.cmd.help.update_user
    update_user = subparsers.add_parser('update_user', help=h['help'])
    update_user.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    update_user.set_defaults(cmd='update_user', func=_router)
    
    """Create drop_user argparser"""
    h = src.cmd.help.drop_user
    drop_user = subparsers.add_parser('drop_user', help=h['help'])
    drop_user.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    drop_user.set_defaults(cmd='drop_user', func=_router)
    
    """Create activate argparser"""   
    h = src.cmd.help.activate
    activate = subparsers.add_parser('activate', help=h['help'])
    activate.add_argument('-n', '--name', help=h['name'])
    activate.add_argument('-r', '--root_dir', help=h['root'], default=os.path.join(config.root_dir, 'project_data'))
    activate.add_argument('-v', '--verbose', help=h['verbose'])
    activate.set_defaults(cmd='activate', func=_router)
    
    """Create cleanup argparser"""   
    h = src.cmd.help.cleanup
    cleanup = subparsers.add_parser('cleanup', help=h['help'])
    cleanup.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    cleanup.set_defaults(cmd='cleanup', func=_router)
    
    """Create convert argparser"""   
    h = src.cmd.help.convert
    convert = subparsers.add_parser('convert', help = 'convert help')
    convert.add_argument('-o', '--out_dir', default=config.out_dir, help=h['out_dir'])
    convert.add_argument('-i', '--in_dir', default=config.in_dir, help=h['in_dir'])
    convert.add_argument('-m', '--metadata_dir', default=config.meta_dir, help=h['metadata_dir'])
    convert.add_argument('--out_format', default='del', help=h['out_format'])
    convert.add_argument('--in_format', default='del', help=h['in_format'])
    convert.add_argument('--in_delimiter', default='|', help=h['in_delimiter'])
    convert.add_argument('--out_delimiter', default='|', help=h['out_delimiter'])
    convert.add_argument('--original', default=False, action='store_true', help=h['original'])
    convert.add_argument('-w', '--max_width', default=1300, help=h['max_width'])
    convert.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    convert.add_argument( '-s', '--segments', default='a|c|s|d|p', help=h['segments'])
    convert.set_defaults(cmd='convert', func=_router)
    
    """Create stage argparser"""   
    h = src.cmd.help.stage
    stage = subparsers.add_parser('stage', help = 'stage help')
    stage.add_argument('-n', '--name', help=h['name'])
    stage.add_argument('-i', '--in_dir', default=config.in_dir, help=h['in_dir'])
    stage.add_argument('-u', '--username', default=c.db_stand_user, help=h['username'])
    stage.add_argument('-p', '--password', default=c.db_stand_pass, help=h['password'])
    stage.add_argument('-no_db', action='store_true', default=False, help=h['no_db'])
    stage.add_argument('-v', '--verbose', default=c.debug_verbose, action='store_true', help=h['verbose'])
    stage.add_argument('-s', '--segments', default='su|a|c|s|d|p', help=h['segments'])
    stage.set_defaults(cmd='stage', func=_router)
    
    """Create pre_process argparser"""   
    h = src.cmd.help.pre_process
    pre_process = subparsers.add_parser('pre_process', help='pre_process help')
    pre_process.add_argument('-l', '--limit', default=None, help=h['limit'])
    pre_process.add_argument('-u', '--username', default=c.db_stand_user, help=h['username'])
    pre_process.add_argument('-p', '--password', default=c.db_stand_pass, help=h['password'])
    pre_process.add_argument('-c', '--cores', default=c.cores, help=h['cores'])
    pre_process.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    pre_process.add_argument('-s', '--segments', default='a|c|s|d|p', help=h['segments'])
    pre_process.set_defaults(cmd='pre_process', func=_router)
    
    """Create process argparser"""   
    h = src.cmd.help.process
    process = subparsers.add_parser('process', help='process help')
    process.add_argument('-s', '--segments', default='a|c|s|d|p', help=h['segments'])
    process.add_argument('-o', '--out_dir', default=config.out_dir, help=h['out_dir'])
    process.add_argument('-m', '--metadata',default=config.meta_dir, help=h['metadata_dir'])
    process.add_argument('-rd', '--rules', default=config.rule_dir, help=h['rules'])
    process.add_argument('--out_format', default='spss', help=h['out_format'])
    process.add_argument('-l', '--limit', default=None, help=h['limit'])
    process.add_argument('-v', '--verbose', action='store_true', default=False, help=h['verbose'])
    process.add_argument('-w', '--where', default=None, help=h['where'])
    process.add_argument('-r', '--regions', default=[], action='append', help=h['regions'])
    process.add_argument('-p', '--parallel', default=False, action='store_true')
    process.add_argument('-c', '--cores', default=c.cores, help=h['cores'])
    process.add_argument('-i', '--include_rules', default=[], action='append', help=h['include_rules'])
    process.add_argument('-e', '--exclude_rules', default=[], action='append', help=h['exclude_rules']) 
    process.set_defaults(cmd='process', func=_router)
    
    """Create transform argparser""" 
    h = src.cmd.help.transform  
    transform = subparsers.add_parser('transform', help = 'transform help')
    transform.add_argument('-o', '--out_dir', default = config.out_dir, help=h['out_dir'])
    transform.add_argument('-m', '--metadata', default = config.meta_dir, help=h['metadata_dir'])
    transform.add_argument('-c', '--cores', default = config.cores, help=h['cores'])
    transform.add_argument('-t', '--thread', default = config.transform_threads, help=h['thread'])
    transform.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    transform.add_argument('-j', '--juv_flag', default=False, action='store_true', help=h['juv_flag']) 
    transform.add_argument('-d', '--offense_deletion_flags', default=[550], action='append', help=h['offense_deletion_flags'])
    transform.add_argument('-f', '--follow_period', default=config.follow_period, help=h['follow_period'])
    transform.set_defaults(cmd='transform', func=_router)
    
    """Create load_recid_db argparser"""   
    h = src.cmd.help.load_recid_db
    load_recid_db = subparsers.add_parser('load_recid_db', help = 'load_recid_db help')
    load_recid_db.add_argument('-i', '--in_dir', default = config.tmp_out_dir, help=h['in_dir'])
    load_recid_db.add_argument('-o', '--out_format', default='spss', help=h['out_format'])
    load_recid_db.add_argument('-m', '--metadata', default = config.meta_dir, help=h['metadata_dir'])
    load_recid_db.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    load_recid_db.set_defaults(cmd='load_recid_db', func=_router)
    
    """Create load_recid_flat argparser"""   
    h = src.cmd.help.load_recid_flat
    load_recid_flat = subparsers.add_parser('load_recid_flat', help = 'load_recid_flat help')
    load_recid_flat.add_argument('-o', '--out_dir', default = config.out_dir, help=h['out_dir'])
    load_recid_flat.add_argument('-c', '--cores', default = config.cores, help=h['cores'])
    load_recid_flat.add_argument('-t', '--thread', default=None, help=h['thread'])
    load_recid_flat.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])    
    load_recid_flat.add_argument('-f', '--follow_period', default=config.follow_period, help=h['follow_period'])
    load_recid_flat.add_argument('-s', '--sort', default=True, action='store_false')
    load_recid_flat.set_defaults(cmd='load_recid_flat', func=_router)
    
    """Create predict argparser"""  
    h = src.cmd.help.predict
    predict = subparsers.add_parser('predict', help = 'predict help')
    predict.add_argument('-s', '--sample', default=None, help=h['sample'])
    predict.add_argument('-v', '--verbose', default=0, help=h['verbose'])
    predict.set_defaults(cmd='predict', func=_router)
    
    """Create compare argparser"""  
    h = src.cmd.help.compare  
    compare = subparsers.add_parser('compare', help = 'compare help')
    compare.add_argument('-o', '--out_dir', default=config.log_dir, help=h['out_dir'])
    compare.add_argument('-v', '--verbose', action='store_true', default=False, help=h['verbose'])
    compare.add_argument('-s', '--segments', default='a|c', help=h['segments'])
    compare.add_argument('-r', '--region', help=h['region'])
    compare.add_argument('--set', default=str(config.current_set), help=h['set'])
    compare.add_argument('--round', default=-1, help=h['round'])
    compare.set_defaults(cmd='compare', func=_router)
    
    """Create datadump argparser"""
    h = src.cmd.help.datadump_sub
    datadump_sub = subparsers.add_parser('datadump', help='datadump help')
    datadump_sub.add_argument('-s', '--segments', default='a|c', help=h['segments'])
    datadump_sub.add_argument('-d', '--delimiter', default='|', help=h['delimiter'])
    datadump_sub.add_argument('--in_dir', default=config.out_dir, help=h['in_dir'])
    datadump_sub.set_defaults(cmd='datadump', func=_router)
    
    """Create validate argparser"""
    h = src.cmd.help.validate
    validate = subparsers.add_parser('validate_rules', help='Rule validation help')
    validate.add_argument('-m', '--meta_dir', default=config.meta_dir, help=h['metadata_dir'])
    validate.add_argument('-r', '--rules', default=dir_map['process_rules_dir'], help=h['rules'])
    validate.add_argument('-e', '--halt_on_error', default=False, help=h['halt_on_error'])
    validate.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose']) 
    validate.set_defaults(cmd='validate_rules', func=_router)
    
    """Create report argparser"""   
    h = src.cmd.help.report
    report = subparsers.add_parser('run_reports', help='Rule validation help')
    report.add_argument('-l', '--log_dir', default=config.log_dir, help=h['log_dir'])
    report.add_argument('-r', '--report_dir', default=config.report_dir, help=h['report_dir'])
    report.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    report.set_defaults(cmd='report', func=_router)
    
    """Create test argparser"""   
    h = src.cmd.help.test
    test = subparsers.add_parser('test', help = 'test help')
    test.add_argument('-v', '--verbose', default=2, help=h['verbosity'])
    test.set_defaults(cmd='test', func=_router)
    
    "Create update_metadata argparser"
    h = src.cmd.help.update_metadata
    update_metadata = subparsers.add_parser('update_metadata', help='update metadata help')
    update_metadata.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    update_metadata.set_defaults(cmd='update_metadata', func=_router)
    
    """Create load_rules argparser"""   
    h = src.cmd.help.load_rules
    load_rules = subparsers.add_parser('load_rules', help='load_rules help')
    load_rules.add_argument('-r', '--region', default=[], action='append', help=h['region'])
    load_rules.add_argument('-R', '--all_regions', default=False, action='store_true', help=h['all_regions'])
    load_rules.add_argument('--no_replace', default=False, action='store_true', help=h['no_replace'])
    load_rules.add_argument('--wvfbi', default=False, action='store_true', help=h['wvfbi'])
    load_rules.add_argument('-v', '--verbose', default=False, action='store_true', help=h['verbose'])
    load_rules.add_argument('--sentence', default=False, action='store_true', help=h['sentence'])
    load_rules.add_argument('--offense', default=False, action='store_true', help=h['offense'])
    load_rules.set_defaults(cmd='load_rules', func=_router)
    
    """Create copy_rules argparser"""
    h = src.cmd.help.copy_rules
    copy_rules = subparsers.add_parser('copy_rules', help='copy_rules help')
    copy_rules.add_argument('--src_project', help=h['src_project'])
    copy_rules.add_argument('--src', help=h['src'])
    copy_rules.add_argument('--dst_project', help=h['src_project'])
    copy_rules.add_argument('--dst', help=h['src'])
    copy_rules.add_argument('-v', '--verbose', default=False, help=h['verbose'])
    copy_rules.set_defaults(cmd='copy_rules', func=_router)
    
    args = parser.parse_args()
    args.func(args)