#! /usr/bin/env python3

import sys, datetime, os, re

def expandEnvVar( path ):
    '''Expands environment variables by regex substitution'''

    if path.startswith( '/$' ):
        path = '/' + path
    env_comp = re.compile( r'/\$([^/]+)' )
    if not env_comp.search( path ):
        env_comp = re.compile( r'^\$([^/]+)' )
    var_search = env_comp.search( path )
    if var_search:
        var = var_search[1]
        pathChange = os.environ[ var ]
        path = env_comp.sub( pathChange, path )

    return path


def formatPath( path, isdir = None ):
    '''Goal is to convert all path types to absolute path with explicit dirs'''
   
    if path:
        path = os.path.expanduser( path )
        path = expandEnvVar( path )
        path = os.path.abspath( path )
        if isdir:
            if not path.endswith('/'):
                path += '/'
        else:
            if path.endswith( '/' ):
                if path.endswith( '//' ):
                    path = path[:-1]
                if not os.path.isdir( path ):
                    path = path[:-1]
            elif not path.endswith( '/' ):
                if os.path.isdir( path ):
                    path += '/'

    return path


def masterDB( path = '$MYCODB' ):

    path = path.replace( '$', '' )
    try:
        full_path = formatPath(os.environ[ path ])
        files = [full_path + x for x in os.listdir(full_path) if x.endswith('.db')]
        basenames = [ os.path.basename( x ) for x in files ]
        dates = [ x.replace('.db','') for x in basenames if re.search( r'^\d+\.db$', x ) ]
        master = '19991231'
        for date in dates:
            dtDate = datetime.datetime.strptime( date, "%Y%m%d" )
            dtMast = datetime.datetime.strptime( master, "%Y%m%d" )
            if dtDate > dtMast:
                master = date
        if master == '19991231':
            print('\nERROR: master db not found in ' + path + '. Have you initialized MycoDB?', flush = True,
                file = sys.stderr)
        master_path = formatPath( '$' + path + '/' + master + '.db' )
    except KeyError:
        print('\nERROR: ' + path + ' not in path' , flush = True, file = sys.stderr)
        master_path = None

    return master_path

if __name__ == '__main__':

    description = 'MycotoolsDB utility' + \
        '\n\nDEFAULT: print MycotoolsDB file path and exit' + \
        '\n[-i DBPATH]\t[--init DBPATH]\tAdd MycotoolsDB to PATH and initialize'
    set_argv = set(sys.argv)
    if '-h' in set_argv or '--help' in set_argv:
        print('\n' + description + '\n', flush = True)
        sys.exit(0)
    if '-i' in set_argv or '--init' in set_argv:
        if '-i' in set_argv:
            coord = '-i'
        else:
            coord = '--init'
        mycodb_loc = formatPath(sys.argv[sys.argv.index(coord) + 1])
        if not os.path.isdir(mycodb_loc + 'mycodb'):
            print('\nERROR: invalid mycotoolsdb path.', flush = True)
            sys.exit(1)
        else:
            dPath = mycodb_loc + 'data/'
            updateData = '## MYCOTOOLSDB' + \
                '\nexport MYCODB=' + mycodb_loc + 'mycodb/' + \
                '\nexport MYCOFNA=' + dPath + 'fna' + \
                '\nexport MYCOFAA=' + dPath + 'faa' + \
                '\nexport MYCOGFF3=' + dPath + 'gff3' + \
                '\n## END MYCOTOOLSDB'
            if 'MYCODB' in os.environ:
                print('\nERROR: mycotoolsdb already in path', flush = True)
                sys.exit(2)
            with open(formatPath('$HOME/.bash_profile'), 'a') as raw:
                raw.write('\n' + updateData)
            print('\nMycotoolsDB added to path. Restart shell/environment to finish\n', flush = True)
            os.environ['MYCODB'] = mycodb_loc + 'mycodb/'


    path = masterDB()
    if path:
        print( path )
        sys.exit( 0 )
    else:
        sys.exit(1)
