from PySTAF import *
from PySTAFMon import *
from PySTAFLog import *

def main():
    
    global handle, monitor, STAXJobID, STAXJobHandleNumber, STAXMachine, STAXService

    # Continue looping until receive a 'CLEAN-UP" message on it's
    # handle queue or an error occurs waiting for a message

    while 1:
 
        logSendMessage('[PyInt] Waiting for a message')

        # Wait to receive a message on PyInt's queue

        request = 'GET WAIT 10s'
        res = handle.submit('local', 'QUEUE', request)

        if (res.rc != 0):
            logSendMessage('[PyInt] Error: STAF local QUEUE %s failed, ' % (request) + \
               'RC: %s, Result: %s\n' % (res.rc, res.result))
            return
    
        messageMap = res.resultObj

        logSendMessage('[PyInt] Received message "%s"' % (messageMap['message']))

        result = handle.submit('local', 'DELAY', 'DELAY 3s')
        
        if messageMap['message'] == 'WAIT':
            # Send message "OK" to the STAX job handle's queue

            message = 'OK'
            logSendMessage('[PyInt] Sending message "%s"' % (message))
            request = 'QUEUE HANDLE %s MESSAGE %s' % (STAXJobHandleNumber, wrapData(message))
            res = handle.submit(STAXMachine, 'QUEUE', request)

            if (res.rc != 0):
                logSendMessage('[PyInt] Error: STAF %s QUEUE %s failed, RC: %s Result: %s' % \
                               (STAXMachine, request, RC, STAFResult))

        elif messageMap['message'] == 'CLEAN-UP':
            # Send message "Clean-up Done" to the STAX job handle's queue

            message = 'Clean-up Done'
            logSendMessage('[PyInt] Sending message "%s"' % (message))
            request = 'QUEUE HANDLE %s MESSAGE %s' % (STAXJobHandleNumber, wrapData(message))
            res = handle.submit(STAXMachine, 'QUEUE', request)

            if (res.rc != 0):
                logSendMessage('[PyInt] Error: STAF %s QUEUE %s failed, RC: %s Result: %s' % \
                               (STAXMachine, request, RC, STAFResult))
            else:
                break

    print 'Complete'
    logSendMessage('[PyInt] Complete')

def logSendMessage(message):
    global handle, monitor, STAXJobID, STAXMachine

    # Update the Monitor information for this process's handle
    updateMonitor(message)

    # Log a message in the STAX Job User log and send it to the STAX Monitor's Messages panel
    request = 'LOG SEND JOB %s LEVEL Info MESSAGE %s' % (STAXJobID, wrapData(message)) 
    result = handle.submit(STAXMachine, STAXService, request)

    if (result.rc != 0):
        logSendMessage('[PyInt] Error: STAF %s %s %s failed, RC: %s, Result: %s' % \
              (STAXMachine, STAXService, request, result.rc, result.result))

# Update the Monitor information for this process's handle
def updateMonitor(message):
    global monitor

    result = monitor.log(message)

    if (result.rc != STAFResult.Ok):
        logSendMessage('[PyInt] Error on STAFMonitor log of message %s, RC: %s Result: %s' % \
                       (message, result.rc, result.result))

if __name__ == "__main__":
    import sys
    
    try:
        handle = STAFHandle("MyTest")
    except STAFException, e:
        print 'Error registering with STAF, RC: %s\n' % e.rc
        sys.exit(e.rc)
    
    print 'MyTest Handle#: %s' %(handle.handle)

    request = 'RESOLVE STRING {MyTest/STAXJobHandleNumber} ' + \
              'STRING {MyTest/STAXJobID} STRING {MyTest/STAXMachine} ' + \
              'STRING {MyTest/STAXService}'
    res = handle.submit('local', 'VAR', request)

    if (res.rc != 0):
        print '\nError: STAF local VAR %s failed, RC: %s, Result: %s\n' % \
             (request, res.rc, res.result)
        sys.exit(res.rc)
    
    STAXJobHandleNumber = res.resultObj[0]['result'] # StaticHandle
    STAXJobID = res.resultObj[1]['result'] # STAXJobID
    STAXMachine = res.resultObj[2]['result'] # STAXMachine 
    STAXService = res.resultObj[3]['result'] # STAXService
    
    print 'PyInt is receiving messages on handle %s' % (handle.handle)
    print 'STAXJobHandleNumber: %s' % (STAXJobHandleNumber)
    print 'STAXJobID: %s' % (STAXJobID) 
    print 'STAXMachine: %s' % (STAXMachine)
    print 'STAXService: %s' % (STAXService)
  
    # Set up a monitor for this process's handle
    monitor = STAFMonitor(handle)

    main()

    rc = handle.unregister()
