from otp.level import DistributedEntityAI
from direct.directnotify import DirectNotifyGlobal

class DistributedCrushableEntityAI(DistributedEntityAI.DistributedEntityAI):
    notify = DirectNotifyGlobal.directNotify.newCategory('DistributedCrushableEntityAI')

    def __init__(self, level, entId):
        self.isCrushable = 0
        self.crushCellId = None
        self.crushCell = None
        self.grid = None
        self.width = 1
        DistributedEntityAI.DistributedEntityAI.__init__(self, level, entId)
        return

    def generate(self):
        DistributedEntityAI.DistributedEntityAI.generate(self)
        self.setActiveCrushCell()
        if self.level:
            self.attachToGrid()

    def delete(self):
        self.ignoreAll()
        DistributedEntityAI.DistributedEntityAI.delete(self)

    def destroy(self):
        if self.crushCell != None:
            self.crushCell.unregisterCrushable(self.entId)
            self.crushCell = None
        DistributedEntityAI.DistributedEntityAI.destroy(self)
        return

    def attachToGrid(self):
        if self.gridId is not None:

            def setGrid(gridId = self.gridId, self = self):
                grid = self.level.entities.get(gridId, None)
                if grid:
                    self.grid = grid
                    self.grid.addObjectByPos(self.entId, self.pos, self.width)
                    self.b_setPosition(self.getPosition())
                    self.initGridDependents()
                    return 1
                return 0

            self.level.setEntityCreateCallback(self.gridId, setGrid)
        return

    def initGridDependents(self):
        pass

    def setActiveCrushCell(self):
        if self.crushCellId != None:
            self.notify.debug('setActiveCrushCell, entId: %d' % self.entId)
            self.crushCell = self.level.entities.get(self.crushCellId, None)
            if self.crushCell == None:
                self.accept(self.level.getEntityCreateEvent(self.crushCellId), self.setActiveCrushCell)
            else:
                self.isCrushable = 1
                self.crushCell.registerCrushable(self.entId)
        return

    def b_setPosition(self, pos):
        self.d_setPosition(pos)
        self.setPosition(pos)

    def d_setPosition(self, pos):
        self.sendUpdate('setPosition', [pos[0], pos[1], pos[2]])

    def setPosition(self, pos):
        self.pos = pos

    def getPosition(self):
        return self.grid.getObjPos(self.entId)

    def updateGrid(self):
        pass

    def doCrush(self, crusherId, axis):
        pass

    def setGridId(self, gridId):
        self.gridId = gridId
        self.attachToGrid()

    def setCrushCellId(self, crushCellId):
        self.crushCellId = crushCellId
        self.setActiveCrushCell()