from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
from toontown.racing.KartShopGlobals import KartGlobals
from toontown.racing import RaceGlobals

class DistributedStartingBlockAI(DistributedObjectAI):
    notify = DirectNotifyGlobal.directNotify.newCategory("DistributedStartingBlockAI")
    
    def __init__(self, air):
        DistributedObjectAI.__init__(self, air)
        self.air = air
        self.pad = None
        self.currentMovie = False
        self.avId = 0
        self.posHpr = [0, 0, 0, 0, 0, 0]

    def setPadDoId(self, padDoId):
        self.pad = self.air.doId2do[padDoId]
        
    def getPadDoId(self):
        return self.pad.getDoId()

    def setPosHpr(self, x, y, z, h, p, r):
        self.posHpr = [x, y, z, h, p, r]
    
    def getPosHpr(self):
        return self.posHpr
    
    def setPadLocationId(self, padLocationId):
        self.padLocationId = padLocationId
        
    def getPadLocationId(self):
        return self.padLocationId

    def requestEnter(self):
        avId = self.air.getAvatarIdFromSender()
        av = self.air.doId2do.get(avId)
        if not av:
            return
        if not av.hasKart():
            self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eNoKart])
            return
        if av.getTickets() < RaceGlobals.getEntryFee(self.pad.trackId, self.pad.trackType):
            self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eTickets])
            return        
        if self.pad.state == 'AllAboard' or self.pad.state == 'WaitBoarding' :
            self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eBoardOver])
            return
        if self.avId != 0:
            if self.avId == avId:
                self.air.writeServerEvent('suspicious', avId, 'Toon tried to board the same starting block twice!')
            self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eOccupied])
            return
        self.b_setOccupied(avId)
        self.b_setMovie(KartGlobals.ENTER_MOVIE)
        
    def rejectEnter(self, errCode):
        pass

    def requestExit(self):
        avId = self.air.getAvatarIdFromSender()
        if avId != self.avId:
            self.air.writeServerEvent('suspicious', avId, 'Toon tried to get off a starting block they\'re not on!')
        self.b_setMovie(KartGlobals.EXIT_MOVIE)

    def setOccupied(self, avId):
        self.avId = avId
        self.pad.updateTimer()
        
    def d_setOccupied(self, avId):
        self.sendUpdate('setOccupied', [avId])
        
    def b_setOccupied(self, avId):
        self.setOccupied(avId)
        self.d_setOccupied(avId)
        
    def setMovie(self, movie):
        self.currentMovie = movie
        self.pad.updateMovieState()
    
    def d_setMovie(self, movie):
        self.sendUpdate('setMovie', [movie])
    
    def b_setMovie(self, movie):
        self.setMovie(movie)
        self.d_setMovie(movie)

    def movieFinished(self):
        avId = self.air.getAvatarIdFromSender()
        if self.avId != avId:
            self.air.writeServerEvent('suspicious', avId, 'Toon tried to end movie of another toon!')
            return
        if not self.currentMovie:
            self.air.writeServerEvent('suspicious', avId, 'Toon tried to end non-existent movie!')
            return
        if self.currentMovie == KartGlobals.EXIT_MOVIE:
            self.b_setOccupied(0)
        self.b_setMovie(0)

class DistributedViewingBlockAI(DistributedStartingBlockAI):
    notify = DirectNotifyGlobal.directNotify.newCategory("DistributedViewingBlockAI")
    
    def __init__(self, air):
        DistributedStartingBlockAI.__init__(self, air)
        self.air = air
        
    def requestEnter(self):
        avId = self.air.getAvatarIdFromSender()
        av = self.air.doId2do[avId]
        if not av.hasKart():
            self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eNoKart])
            return
        if self.avId != 0:
            if self.avId == avId:
                self.air.writeServerEvent('suspicious', avId, 'Toon tried to board the same starting block twice!')
            self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eOccupied])
            return
        self.b_setOccupied(avId)
        self.b_setMovie(KartGlobals.ENTER_MOVIE)
        taskMgr.doMethodLater(30, DistributedViewingBlockAI.b_setMovie, 'removePlayer%i' % self.doId, [self, KartGlobals.EXIT_MOVIE])
        
    def requestExit(self):
        DistributedStartingBlockAI.requestExit(self)
        taskMgr.remove('removePlayer%i' % self.doId)