def initCAOC(Data,node):
    caocref = CAOC(Data.numDrones,Data.heuristic,node)
    caocref.setConnectionParams(PYRO_HOST, PYRO_PORT)
    print('CAOC initialized')
    return caocref
def main():
    print 'Start'
    
    #x=5
    #a=[2,4,6,8]
    #if x>=a[len(a)-1]:
        #a.append(x)    
    #else:
        #for i in range(len(a)):
            #if x<a[i]:
                #a.insert(i,x)
                #break
    #print a
    #print a.pop()
    
    for i in range(3):
        print ''
        print '############################# Heuristic ' + str(i+1) + ' #############################'
        random.seed(1)
        mapX=50
        mapY=50
        numStreets=10
        numTargets=9
        numDrones=3
        heuristic=i+1
        seedNum=1
        Nuisance=0.8    
        
        print 'Heuristic: ' + str(heuristic)
        
        print '-------------Generate Map-------------'
        Map = GenMap(mapX,mapY)
        Map.map(numStreets,Nuisance)
        randNodes=[]
        for i in range(numTargets+numDrones):
            randNodes.append(Map.RandNode())
        print 'Node List: ' + str(randNodes)
        
        print '-------------Generate HMINT, CAOC, IMINT, Drone-------------'
        
        hmint = HMINT(numTargets, randNodes)
        hmintInQ = LPInputQueue()    
        
        caoc=CAOC(numDrones,heuristic)
        caocInQ = LPInputQueue()    
        
        imint=IMINT(heuristic,numTargets)
        imintInQ = LPInputQueue()
        
        drone=Drone(0,0,heuristic)
        droneInQ=LPInputQueue()
        
        lp=[hmint,caoc,imint]
        
        print '-------------Initialize Target and Drone Data -------------'
        tData=[]
        for i in range(numTargets):
            tData.append([i,10+i,random.random(),'Vehicle',1,1,randNodes[i],10*random.random(),0,0])
        print 'Target Data: ' + str(tData)
        
        dData=[]
        for i in range(numDrones):
            dData.append([i,'Idle',randNodes[numTargets+i]])
        print 'Drone Data: ' + str(dData)          

        print '-------------Generate Messages-------------'
        dMsg=[]
        for i in range(numDrones):
            dMsg.append(Message(3,dData[i],dData[i][0],'CAOC',0))
        print 'Drone Messages: ' + str(dMsg)
        
        tMsg=[]
        for i in range(numTargets):
            tMsg.append(Message(2,tData[i],'HMINT','CAOC',i+1))
        print 'Target Messages: ' + str(tMsg)
        
        print '-------------Send Messages-------------'
        for i in range(numDrones):
            print 'Drone ' + str(dMsg[i].data[0]) + ' Location: ' + str(dMsg[i].data[2].xpos) + ', ' +str(dMsg[i].data[2].ypos)
        
        for i in range(numTargets):
            print 'Tgt ' + str(tMsg[i].data[0]) + ' Location: ' + str(tMsg[i].data[6].xpos) + ', ' +str(tMsg[i].data[6].ypos)
        
        for i in range(numDrones):
            print 'CAOC handling Drone ' + str(dMsg[i].data[0]) + ' Status Msg...'
            caoc.testHandleMessage(dMsg[i])
            print 'CAOC Priority Queue: ' + str(caoc.priorityQueue)
            print 'CAOC Drone Status Queue: ' + str(caoc.drones)
        
        for i in range(numTargets):
            print 'CAOC handling Tgt ' + str(tMsg[i].data[0]) + ' Msg from HMINT...'
            caoc.testHandleMessage(tMsg[i])
            print 'CAOC Priority Queue: ' + str(caoc.priorityQueue)
            print 'CAOC Drone Status Queue: ' + str(caoc.drones)
    
        while (len(caoc.priorityQueue)>0):
            for i in range(numDrones):
                print 'CAOC handling Drone ' + str(dMsg[i].data[0]) + ' Status Msg...'
                caoc.testHandleMessage(dMsg[i])
                print 'CAOC Priority Queue: ' + str(caoc.priorityQueue)
                print 'CAOC Drone Status Queue: ' + str(caoc.drones)    

    print ''
    print 'End'
def main():
    print 'Start'
 
    random.seed(1)
    mapX=300
    mapY=300
    numStreets=50
    numTargets=10
    numDrones=3
    heuristic=1
    seedNum=1
    Nuisance=0.8    
    
    print '---Generate Map---'
    Map = GenMap(mapX,mapY)
    Map.map(numStreets,Nuisance)
    randNodes=[]
    for i in range(numTargets):
        randNodes.append(Map.RandNode())
 
    print '---Generate HMINT, CAOC, IMINT---'
    
    hmint = HMINT(numTargets, randNodes)
    hmintInQ = LPInputQueue()    
    
    caoc=CAOC(numDrones,heuristic)
    caocInQ = LPInputQueue()    
    
    imint=IMINT(heuristic,numTargets)
    imintInQ = LPInputQueue()
    print 'IMINT total value: ' + str(imint.totalValue)
    
    drone=Drone(0,0,1)
    droneInQ=LPInputQueue()
    
    lp=[hmint,caoc,imint]
    
    print '---Generate Messages---'
    m2Data=[0,80,80,'Vehicle',1,1,randNodes[0],30,0,0]
    m2=Message(2,m2Data,'CAOC','IMINT',0)
    m3Data=[0,'Idle',randNodes[1]]
    m3=Message(3,m3Data,'IMINT','CAOC',1)    
    
    print '---Save and Restore State---'
    
    for i in lp:
        i.localTime=0
        drone.LocalSimTime=0
        i.saveState()
        i.localTime=3
        drone.LocalSimTime=3
        i.saveState()
        i.localTime=7
        drone.LocalSimTime=7
        i.saveState()
        i.localTime=12
        drone.LocalSimTime=12
        i.saveState()
        print str(i.LPID) + ' state queue: ' + str(i.stateQueue)
        print str(i.LPID) + ' state queue length: ' + str(len(i.stateQueue))
    

    #for i in drone.stateQueue:
        #print 'Drone LocalSimTime: ' + str(i.LocalSimTime)
    
    hmint.restoreState(6)
    caoc.restoreState(6)
    imint.restoreState(6)
    drone.restoreState(6)

    for i in lp:
        print str(i.LPID) + ' state queue: ' + str(i.stateQueue)
        print str(i.LPID) + ' local time: ' + str(i.localTime)
        print 'Drone actual local time: ' + str(drone.LocalSimTime)
        i.localTime=13
        i.saveState()
        print str(i.LPID) + ' state queue: ' + str(i.stateQueue)        
    
    
    print 'End'