#!/usr/bin/python3
app_svnid = '$HeadURL$ $LastChangedRevision$'
import sys
import subprocess
#  python3's subprocess.Popen() returns a byte sequence, so to append the string '/include' we need to convert
#  one to the other. sys.path.append() expects a list of strings, not byte sequences. Therefore it makes most
#  sense to convert subprocess.Popen()'s output to a string or to get it to return a string directly. The latter
#   can be done by use of 'universal_newlines=True'
sys.path.append(subprocess.Popen(["ade-config", "ade_lib_prefix"], stdout=subprocess.PIPE, universal_newlines=True).communicate()[0][:-1] + '/include')
import ade
import os
import time			#  to allow me to test interrupt routines

adepyf_defined_errors = {
    "adepyf_err_misc":{"fmt":"%s"},
}

def adepyf(errstack):
    ###########################################################################
    #
    #  Set ADE options
    #
    ###########################################################################

    #  Register application-specific errors
    ade.ade_err_registerdefderrs(adepyf_defined_errors)

    ##########################################################################
    #
    #  Process options
    #
    ##########################################################################

    #  Defaults for options
   
    #  Register options
    ade.ade_err_debug(errstack, 10, "adepyf: registering options ...")
    rc = ade.ade_opt_register(errstack, None, None, globals(), "adepyf_opt_handler_%s")
    if rc != ade.ade_err_ok:
        return rc

    #  Register handler functions
    ade.ade_err_debug(errstack, 10, "adepyf: registering message handlers ...")
    rc = ade.ade_msg_register(errstack, adepyf_usage, adepyf_version, adepyf_listpaths)
    if rc != ade.ade_err_ok:
        return rc

    #  Process options
    ade.ade_err_debug(errstack, 10, "adepyf: processing options ...")
    rc = ade.ade_opt_process(errstack)
    if rc != ade.ade_err_ok:
        return rc

    ##########################################################################
    #
    #  Process arguments
    #
    ##########################################################################

    if len(sys.argv) != 1:
        ade.ade_msg_usage(errstack)
    
    namespace = { 'errstack':errstack }
    pythoncode = 'def adepyf_code_wrapper():\n    %s\nrc=adepyf_code_wrapper()' % (sys.argv[0])
    try:
        exec(pythoncode, namespace)
    except:
        e = sys.exc_info()[1]
        ade.ade_err_error(errstack, "adepyf_err_misc", "code failed to run; the error was: " + str(e))
        return ade.ade_err_fail
    rc = namespace['rc']

    if rc == ade.ade_err_ok:
        return rc
    elif rc == ade.ade_err_fail:
        ade.ade_err_error(errstack, "adepyf_err_misc", "code ran but returned failure")
        return rc
    else:
        ade.ade_err_error(errstack, "adepyf_err_misc", "code ran but returned a non-compliant return code; the return code was: %s" % (rc))
        return ade.ade_err_fail

def adepyf_version(errstack):
    return ade.ade_smf_extractversionfromsvnstring(errstack, app_svnid)

def adepyf_listpaths(errstack):
    return (ade.ade_err_ok, None)

def adepyf_usage(errstack, passno):
    if passno == 1:
        return(ade.ade_err_ok, "<code>")
    elif passno == 2:
        return(ade.ade_err_ok, None)
    else:
        ade.ade_err_internal(errstack, "adepyf_usage: %d: bad passnumber" % (passno))

ade.ade_gep_main(adepyf)
