# standard imports
import logging
import argparse
import os
import sys

default_config_dir = os.environ.get('CONFINI_DIR')
full_template = { 
        # (long arg and key name, short var, type, default, help,)
        'provider': ('p', str, None, 'RPC provider url',),
        'registry_address': ('r', str, None, 'CIC registry address',),
        'keystore_file': ('y', str, None, 'Keystore file',),
        'config_dir': ('c', str, default_config_dir, 'Configuration directory',),
        'queue': ('q', str, 'cic-eth', 'Celery task queue',),
        'chain_spec': ('i', str, None, 'Chain spec string',),
        'abi_dir': (None, str, None, 'Smart contract ABI search path',),
        'env_prefix': (None, str, os.environ.get('CONFINI_ENV_PREFIX'), 'Environment prefix for variables to overwrite configuration',),
        }
default_include_args = [
    'config_dir',
    'provider',
    'env_prefix',
    ]

sub = None

def create(caller_dir, include_args=default_include_args):

    argparser = argparse.ArgumentParser()

    for k in include_args:
        a = full_template[k]
        long_flag = '--' + k.replace('_', '-')
        short_flag = None
        dest = None
        if a[0] != None:
            short_flag = '-' + a[0]
            dest = a[0]
        else:
            dest = k
        default = a[2]
        if default == None and k == 'config_dir':
            default = os.path.join(caller_dir, 'config')
        
        if short_flag == None:
            argparser.add_argument(long_flag, dest=dest, type=a[1], default=default, help=a[3])
        else:
            argparser.add_argument(short_flag, long_flag, dest=dest, type=a[1], default=default, help=a[3])

    argparser.add_argument('-v', action='store_true', help='Be verbose')
    argparser.add_argument('-vv', action='store_true', help='Be more verbose')

    return argparser


def add(argparser, processor, name, description=None):
    processor(argparser)

    return argparser


def parse(argparser, logger=None):

    args = argparser.parse_args(sys.argv[1:])

    # handle logging input
    if logger != None:
        if args.vv:
            logger.setLevel(logging.DEBUG)
        elif args.v:
            logger.setLevel(logging.INFO)

    return args