from panda3d.core import *
from direct.interval.IntervalGlobal import *
from otp.level import BasicEntities
from toontown.toonbase import ToontownGlobals
from direct.directnotify import DirectNotifyGlobal

class BattleBlocker(BasicEntities.DistributedNodePathEntity):
    notify = DirectNotifyGlobal.directNotify.newCategory('BattleBlocker')

    def __init__(self, cr):
        BasicEntities.DistributedNodePathEntity.__init__(self, cr)
        self.suitIds = []
        self.battleId = None
        return

    def setActive(self, active):
        self.active = active

    def announceGenerate(self):
        BasicEntities.DistributedNodePathEntity.announceGenerate(self)
        self.initCollisionGeom()

    def disable(self):
        self.ignoreAll()
        self.unloadCollisionGeom()
        BasicEntities.DistributedNodePathEntity.disable(self)

    def destroy(self):
        BasicEntities.DistributedNodePathEntity.destroy(self)

    def setSuits(self, suitIds):
        self.suitIds = suitIds

    def setBattle(self, battleId):
        self.battleId = battleId

    def setBattleFinished(self):
        self.ignoreAll()

    def initCollisionGeom(self):
        self.cSphere = CollisionSphere(0, 0, 0, self.radius)
        self.cSphereNode = CollisionNode('battleBlocker-%s-%s' % (self.level.getLevelId(), self.entId))
        self.cSphereNode.addSolid(self.cSphere)
        self.cSphereNodePath = self.attachNewNode(self.cSphereNode)
        self.cSphereNode.setCollideMask(ToontownGlobals.WallBitmask)
        self.cSphere.setTangible(0)
        self.enterEvent = 'enter' + self.cSphereNode.getName()
        self.accept(self.enterEvent, self.__handleToonEnter)

    def unloadCollisionGeom(self):
        if hasattr(self, 'cSphereNodePath'):
            self.ignore(self.enterEvent)
            del self.cSphere
            del self.cSphereNode
            self.cSphereNodePath.removeNode()
            del self.cSphereNodePath

    def __handleToonEnter(self, collEntry):
        self.notify.debug('__handleToonEnter, %s' % self.entId)
        self.startBattle()

    def startBattle(self):
        if not self.active:
            return
        callback = None
        if self.battleId != None and self.battleId in base.cr.doId2do:
            battle = base.cr.doId2do.get(self.battleId)
            if battle:
                self.notify.debug('act like we collided with battle %d' % self.battleId)
                callback = battle.handleBattleBlockerCollision
        elif len(self.suitIds) > 0:
            for suitId in self.suitIds:
                suit = base.cr.doId2do.get(suitId)
                if suit:
                    self.notify.debug('act like we collided with Suit %d ( in state %s )' % (suitId, suit.fsm.getCurrentState().getName()))
                    callback = suit.handleBattleBlockerCollision
                    break

        self.showReaction(callback)
        return

    def showReaction(self, callback = None):
        if not base.localAvatar.wantBattles:
            return
        track = Sequence()
        if callback:
            track.append(Func(callback))
        track.start()