#!/usr/bin/env python3

'''call ACEDB. This script is meant to be called from a wrapper which provides ACEDB, 
the path to the appropriate ACEDB database. So for any new database, all you need 
to write is a wrapper, and this script does everything else.'''
import birchenv
import copy
import os
import subprocess

def call_ace(ACEDB):

    # ------------------- Set enviroment variables -----------------------------
    ACEENV = copy.copy(os.environ)

    if not ACEENV.get('BIRCH') or not ACEENV.get('BIRCH_PLATFORM'):
        print("ERROR - BIRCH environment not properly set")
        exit()

    # Top directory for your lab database
    BINDIR = os.path.join(ACEDB, 'bin')

    # Top directory for your lab database
    ACEENV['ACEDB'] = ACEDB
    ACEENV['ACEDB_COMMON'] = ACEDB

    # Directory to contain the binary database file
    ACEENV['DBDIR'] = os.path.join(ACEDB, 'database')

    # Directory for executable code specific for your database
    # eg. this script
    ACEENV['BINDIR'] = BINDIR

    if ACEENV.get('PATH'):
        ACEENV['PATH'] = BINDIR + os.pathsep + str(ACEENV['PATH'])
    else:
        ACEENV['PATH'] = BINDIR



    #Used by birchdb, lbirchdb, l-gbirchdb
    ACEENV['ACE_FILE_LAUNCHER'] = os.path.join(birchenv.BIRCH, "script", 'chooseviewer.py')
    #Used by acedemo
    ACEENV['ACE_VIEW_COMMAND'] = os.path.join(birchenv.BIRCH, "script", 'chooseviewer.py')

    ACEENV['local'] = str(os.path.join(birchenv.BIRCH, "local"))

    # ------------------- Set LD_LIBRARY_PATH -----------------------------
    print(birchenv.BIRCHLIBS)
    if (birchenv.BIRCHLIBS != ''):
        if ACEENV.get('LD_LIBRARY_PATH'):
            ACEENV['LD_LIBRARY_PATH'] = str(ACEENV['LD_LIBRARY_PATH']) + os.pathsep + birchenv.BIRCHLIBS
        else:
            ACEENV['LD_LIBRARY_PATH'] = birchenv.BIRCHLIBS

    if (birchenv.BIRCH_PLATFORM == 'osx-x86_64'):
        ACEENV['DYLD_LIBRARY_PATH'] = str(ACEENV['LD_LIBRARY_PATH'])
    elif (birchenv.BIRCH_PLATFORM == 'macos-arm64'):
        ACEENV['DYLD_LIBRARY_PATH'] = str(ACEENV['LD_LIBRARY_PATH'])

    
    # -------------------- Set X11 fonts for use by xace --------------------------------
    # Not all systems have the old X11 fonts, so we provide them for use by xace.
    if (birchenv.BIRCH_PLATFORM == 'solaris-sparc'):
        ACEFONTS=""
    elif (birchenv.BIRCH_PLATFORM == 'solaris-amd64'):
        ACEFONTS=""
    elif (birchenv.BIRCH_PLATFORM == 'linux-intel'):
        ACEFONTS=os.path.join(birchenv.BIRCH, 'lib-' + birchenv.BIRCH_PLATFORM, 'gde.fonts', 'misc')
    elif (birchenv.BIRCH_PLATFORM == 'linux-x86_64'):
        ACEFONTS=os.path.join(birchenv.BIRCH, 'lib-' + birchenv.BIRCH_PLATFORM, 'gde.fonts', 'misc')        
    elif (birchenv.BIRCH_PLATFORM == 'osx-x86_64'):
        ACEFONTS=os.path.join(birchenv.BIRCH, 'lib-' + birchenv.BIRCH_PLATFORM, 'gde.fonts', 'misc')   
    elif (birchenv.BIRCH_PLATFORM == 'macos-arm64'):
        ACEFONTS=os.path.join(birchenv.BIRCH, 'lib-' + birchenv.BIRCH_PLATFORM, 'gde.fonts', 'misc') 
    #print('ACEFONTS=' + ACEFONTS + '\n')
    if ACEFONTS != "" :
        subprocess.call(['xset', '+fp', ACEFONTS], env=ACEENV) 
    
    
    # -------------------- Run xace and then cleanup --------------------------------
    if (birchenv.BIRCH_PLATFORM == 'solaris-sparc'):
        subprocess.call(['xace'], env=ACEENV) 
    elif (birchenv.BIRCH_PLATFORM == 'solaris-amd64'):
        subprocess.call(['xace'], env=ACEENV) 
    elif (birchenv.BIRCH_PLATFORM == 'linux-intel'):
        # Many recent Linux distros don't have ld-linux.so.2, and the compiled version of xace is
        # expecting that /usr/lib/ld-linux.so.2 exists. So the following works, but it's not pretty.
        # See BIRCH Bugzilla bugs 1139 and 1156 for further details.
        # COMMAND: $BIRCH/lib-linux-intel/acedb32/ld-linux.so.2 --library-path $LD_LIBRARY_PATH $BIRCH/bin-linux-intel/xace
        # need to have fully-qualified paths to ld-linux.so.2 and xace
        ACELIB=os.path.join(birchenv.BIRCH, 'lib-' + birchenv.BIRCH_PLATFORM, 'acedb32')
        #ACEENV['LD_LIBRARY_PATH'] = str(ACEENV['LD_LIBRARY_PATH']) + ACELIB
        ACEENV['LD_LIBRARY_PATH'] =  ACELIB
        #print('LD_LIBRARY_PATH= ' + ACEENV['LD_LIBRARY_PATH'] + '\n')
        COMMAND = os.path.join(birchenv.BIRCH, 'lib-linux-intel/acedb32/ld-linux.so.2')
        COMMAND = COMMAND + ' --library-path ' + ACEENV['LD_LIBRARY_PATH'] 
        COMMAND = COMMAND + ' ' + os.path.join(birchenv.BIRCH, 'bin-linux-intel','xace')
        #print('COMMAND= ' + COMMAND + '\n')
        subprocess.call([COMMAND], env=ACEENV, shell=True)          
    elif (birchenv.BIRCH_PLATFORM == 'linux-x86_64'):
        # Many recent Linux distros don't have ld-linux.so.2, and the compiled version of xace is
        # expecting that /usr/lib/ld-linux.so.2 exists. So the following works, but it's not pretty.
        # See BIRCH Bugzilla bugs 1139 and 1156 for further details.
        # COMMAND: $BIRCH/lib-linux-x86_64/acedb32/ld-linux.so.2 --library-path $LD_LIBRARY_PATH $BIRCH/bin-linux-x86_64/xace
        # need to have fully-qualified paths to ld-linux.so.2 and xace
        ACELIB=os.path.join(birchenv.BIRCH, 'lib-' + birchenv.BIRCH_PLATFORM, 'acedb32')
        #ACEENV['LD_LIBRARY_PATH'] = str(ACEENV['LD_LIBRARY_PATH']) + ACELIB
        ACEENV['LD_LIBRARY_PATH'] =  ACELIB
        print('LD_LIBRARY_PATH= ' + ACEENV['LD_LIBRARY_PATH'] + '\n')
        COMMAND = os.path.join(birchenv.BIRCH, 'lib-linux-x86_64/acedb32/ld-linux.so.2')
        COMMAND = COMMAND + ' --library-path ' + ACEENV['LD_LIBRARY_PATH'] 
        COMMAND = COMMAND + ' ' + os.path.join(birchenv.BIRCH, 'bin-linux-x86_64','xace')
        print('COMMAND= ' + COMMAND + '\n')
        subprocess.call([COMMAND], env=ACEENV, shell=True)        
    elif (birchenv.BIRCH_PLATFORM == 'linux-arm64'):
        # Many recent Linux distros don't have ld-linux.so.2, and the compiled version of xace is
        # expecting that /usr/lib/ld-linux.so.2 exists. So the following works, but it's not pretty.
        # See BIRCH Bugzilla bugs 1139 and 1156 for further details.
        # COMMAND: $BIRCH/lib-linux-x86_64/acedb32/ld-linux.so.2 --library-path $LD_LIBRARY_PATH $BIRCH/bin-linux-x86_64/xace
        # need to have fully-qualified paths to ld-linux.so.2 and xace
        ACELIB=os.path.join(birchenv.BIRCH, 'lib-' + birchenv.BIRCH_PLATFORM, 'acedb32')
        #ACEENV['LD_LIBRARY_PATH'] = str(ACEENV['LD_LIBRARY_PATH']) + ACELIB
        ACEENV['LD_LIBRARY_PATH'] =  ACELIB
        print('LD_LIBRARY_PATH= ' + ACEENV['LD_LIBRARY_PATH'] + '\n')
        COMMAND = os.path.join(birchenv.BIRCH, 'lib-linux-x86_64/acedb32/ld-linux.so.2')
        COMMAND = COMMAND + ' --library-path ' + ACEENV['LD_LIBRARY_PATH'] 
        COMMAND = COMMAND + ' ' + os.path.join(birchenv.BIRCH, 'bin-linux-x86_64','xace')
        print('COMMAND= ' + COMMAND + '\n')
        subprocess.call([COMMAND], env=ACEENV, shell=True)  
    elif (birchenv.BIRCH_PLATFORM == 'osx-x86_64'):
        subprocess.call(['xace'], env=ACEENV)
    elif (birchenv.BIRCH_PLATFORM == 'macos-arm64'):
        subprocess.call(['xace'], env=ACEENV)
  
    subprocess.call([os.path.join(BINDIR, 'cleanup.sh')], env=ACEENV) # &

