from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
from direct.distributed.ClockDelta import *
import ButterflyGlobals
import random

class DistributedButterflyAI(DistributedObjectAI):
    notify = DirectNotifyGlobal.directNotify.newCategory("DistributedButterflyAI")

    def __init__(self, air):
        DistributedObjectAI.__init__(self, air)
        self.area = 0
        self.playground = 0
        self.stateIndex = 0
        self.curIndex = 0
        self.destIndex = 0
        self.time = 0
        self.timestamp = 0
    
    def generate(self):
        ButterflyGlobals.generateIndexes(self.doId, self.playground)
        fr = ButterflyGlobals.getFirstRoute(self.playground, self.area, self.doId)
        self.b_setState(ButterflyGlobals.FLYING, fr[1], fr[3], fr[4], globalClockDelta.getRealNetworkTime())
        taskMgr.doMethodLater(fr[4], self.__land, 'landButterfly%i' % self.doId, [])
    
    def __land(self):
        ttl = random.uniform(0, ButterflyGlobals.MAX_LANDED_TIME)
        self.b_setState(ButterflyGlobals.LANDED, self.curIndex, self.destIndex, ttl, globalClockDelta.getRealNetworkTime())
        taskMgr.doMethodLater(ttl, self.__fly, 'flyButterfly%i' % self.doId, [])
        
    def __fly(self):
        next = ButterflyGlobals.getNextPos(ButterflyGlobals.ButterflyPoints[self.playground][self.area][self.destIndex], self.playground, self.area, self.doId)
        
        self.b_setState(ButterflyGlobals.FLYING, self.destIndex, next[1], next[2], globalClockDelta.getRealNetworkTime())
        taskMgr.doMethodLater(next[2], self.__land, 'landButterfly%i' % self.doId, [])
    
    def setArea(self, playground, area):
        self.area = area
        self.playground = playground
        
    def d_setArea(self, playground, area):
        self.sendUpdate('setArea', [playground, area])
        
    def b_setArea(self, playground, area):
        self.setArea(playground, area)
        self.d_setArea(playground, area)
        
    def getArea(self):
        return [self.playground, self.area]

    def setState(self, stateIndex, curIndex, destIndex, time, timestamp):
        self.stateIndex = stateIndex
        self.curIndex = curIndex
        self.destIndex = destIndex
        self.time = time
        self.timestamp = timestamp
        
    def d_setState(self, stateIndex, curIndex, destIndex, time, timestamp):
        self.sendUpdate('setState', [stateIndex, curIndex, destIndex, time, timestamp])
        
    def b_setState(self, stateIndex, curIndex, destIndex, time, timestamp):
        self.setState(stateIndex, curIndex, destIndex, time, timestamp)
        self.d_setState(stateIndex, curIndex, destIndex, time, timestamp)
        
    def getState(self):
        return [self.stateIndex, self.curIndex, self.destIndex, self.time, self.timestamp]

    def avatarEnter(self):
        pass

