"""
Start CLI for CHOTestMonkey
Author: you@onlab.us
"""
from multiprocessing.connection import Client

commandMap = {}
paramNum = {}

def triggerEvent( debugMode, name, scheduleMethod, args ):
    """
    This function inserts an event from CLI to CHOTestMonkey
    """
    host = "localhost"
    port = 6000
    address = ( host, port )
    conn = Client( address )
    request = []
    if debugMode:
        request.append( 2 )
    else:
        request.append( 1 )
    request.append( name )
    request.append( scheduleMethod )
    for arg in args:
        request.append( arg )
    conn.send( request )
    response = conn.recv()
    return response

def startCLI():
    debugMode = False
    while 1:
        try:
            if debugMode:
                cmd = raw_input("CHOTestMonkey-debug>")
            else:
                cmd = raw_input("CHOTestMonkey>")
        except EOFError:
            print "exit"
            return
        except Exception:
            print "Uncaught exception!"
            return

        if cmd == 'help':
            print 'Supported commands:'
            print 'help'
            print 'debug'
            print 'exit'
            for command in commandMap.keys():
                print command
        elif cmd == '':
            pass
        elif cmd == 'debug':
            debugMode = True
        elif cmd == 'exit':
            if debugMode:
                debugMode = False
            else:
                return
        else:
            cmdList = cmd.split( ' ' )
            if cmdList[ 0 ] in commandMap.keys():
                num = paramNum[ cmdList[ 0 ] ]
                name = commandMap[ cmdList[ 0 ] ]
                '''
                if len( cmdList ) < num + 1:
                    print 'not enough arguments'
                elif len( cmdList ) > num + 1:
                    print 'Too many arguments'
                else:
                '''
                result = triggerEvent( debugMode, name, 'RUN_BLOCK', cmdList[ 1: ] )
                if result == 10:
                    pass
                elif result == 11:
                    print "Scheduler busy...Try later or use debugging mode by entering \'debug\'"
                elif result == 20:
                    print "Unknown message to server"
                elif result == 21:
                    print "Unknown event type to server"
                elif result == 22:
                    print "Unknown schedule method to server"
                elif result == 23:
                    print "Not enough argument"
                else:
                    print "Unknown response from server"
            else:
                print 'Unknown command'

if __name__ == '__main__':
    import xml.etree.ElementTree
    try:
        root = xml.etree.ElementTree.parse( '../CHOTestMonkey.params' ).getroot()
    except Exception:
        print "Uncaught exception!"
    for child in root:
        if child.tag == 'EVENT':
            for event in child:
                for item in event:
                    if item.tag == 'CLI':
                        CLI = str( item.text )
                    if item.tag == 'typeString':
                        name = str( item.text )
                    if item.tag == 'CLIParamNum':
                        num = int( item.text )
                commandMap[ CLI ] = name
                paramNum[ CLI ] = num
    startCLI()

