from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
from direct.distributed.ClockDelta import *
from toontown.minigame import CannonGameGlobals
from toontown.toonbase import ToontownGlobals
import CannonGlobals

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

    def __init__(self, air):
        DistributedObjectAI.__init__(self, air)
        self.estateId = 0
        self.targetId = 0
        self.posHpr = (0, 0, 0, 0, 0, 0)
        self.bumperPos = ToontownGlobals.PinballCannonBumperInitialPos
        self.active = 0
        self.avId = 0

    def setEstateId(self, estateId):
        self.estateId = estateId

    def getEstateId(self):
        return self.estateId

    def setTargetId(self, targetId):
        self.targetId = targetId

    def getTargetId(self):
        return self.targetId

    def setPosHpr(self, x, y, z, h, p, r):
        self.posHpr = (x, y, z, h, p, r)

    def getPosHpr(self):
        return self.posHpr

    def setActive(self, active):
        self.active = active
        self.sendUpdate("setActiveState", [active])

    def requestEnter(self):
        avId = self.air.getAvatarIdFromSender()
        av = self.air.doId2do.get(avId)
        if not av:
            return

        if not self.avId:
            self.avId = avId
            self.d_setMovie(CannonGlobals.CANNON_MOVIE_LOAD)
            self.acceptOnce(self.air.getAvatarExitEvent(avId), self.__handleUnexpectedExit, extraArgs=[avId])
        else:
            self.air.writeServerEvent('suspicious', avId, 'DistributedCannonAI.requestEnter cannon already occupied')
            self.notify.warning('requestEnter() - cannon already occupied')

    def setMovie(self, mode, avId, extraInfo):
        self.avId = avId
        self.sendUpdate('setMovie', [mode, avId, extraInfo])

    def __handleUnexpectedExit(self, avId):
        self.notify.warning('avatar:' + str(avId) + ' has exited unexpectedly')
        self.__doExit()

    def __doExit(self, movie=CannonGlobals.CANNON_MOVIE_FORCE_EXIT):
        self.ignore(self.air.getAvatarExitEvent(self.avId))
        self.d_setMovie(movie)
        self.avId = 0

    def requestExit(self):
        pass

    def d_setMovie(self, movie):
        self.sendUpdate("setMovie", [movie, self.avId])

    def setCannonPosition(self, zRot, angle):
        self.sendUpdate("updateCannonPosition", [self.avId, zRot, angle])

    def setCannonLit(self, zRot, angle):
        avId = self.air.getAvatarIdFromSender()
        if avId != self.avId:
            return

        fireTime = CannonGameGlobals.FUSE_TIME
        self.sendUpdate('setCannonWillFire', [avId, fireTime, zRot, angle, globalClockDelta.getRealNetworkTime()])

    def setFired(self):
        pass

    def setLanded(self):
        self.__doExit(CannonGlobals.CANNON_MOVIE_CLEAR)
        self.sendUpdate('setCannonExit', [self.avId])

    def setCannonExit(self, todo0):
        pass

    def requestBumperMove(self, x, y, z):
        self.bumperPos = (x, y, z)
        self.sendUpdate('setCannonBumperPos', self.getCannonBumperPos())

    def getCannonBumperPos(self):
        return self.bumperPos