from direct.directnotify import DirectNotifyGlobal
from toontown.parties.DistributedPartyActivityAI import DistributedPartyActivityAI
from toontown.parties.DistributedPartyCatchActivityBase import DistributedPartyCatchActivityBase
from direct.task import Task
from direct.distributed.ClockDelta import globalClockDelta
from toontown.toonbase import TTLocalizer
import PartyGlobals

class DistributedPartyCatchActivityAI(DistributedPartyActivityAI, DistributedPartyCatchActivityBase):
    notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPartyCatchActivityAI")

    def __init__(self, air, parent, activityTuple):
        DistributedPartyActivityAI.__init__(self, air, parent, activityTuple)
        self.numGenerations = 1
        self.generations = []
        self.player2catches = {}
        self.startTimestamp = globalClockDelta.getRealNetworkTime(bits=32)
        self.playing = False

    def delete(self):
        taskMgr.remove('newGeneration%d' % self.doId)
        DistributedPartyActivityAI.delete(self)

    def getStartTimestamp(self):
        return self.startTimestamp

    def setStartTimestamp(self, ts):
        self.startTimestamp = ts

    def setGenerations(self, generations):
        self.generations = generations

    def toonJoinRequest(self):
        DistributedPartyActivityAI.toonJoinRequest(self)
        avId = self.air.getAvatarIdFromSender()
        self.player2catches[avId] = 0
        if not self.playing:
            self.__startGame()
            self.sendUpdate('setState', ['Active', globalClockDelta.getRealNetworkTime()])

    def toonExitDemand(self):
        avId = self.air.getAvatarIdFromSender()
        if not avId in self.toonsPlaying:
            self.air.writeServerEvent('suspicious',avId,'Toon tried to exit a party game they\'re not using!')
            return
        catches = self.player2catches[avId]
        del self.player2catches[avId]
        av = self.air.doId2do.get(avId, None)
        if not av:
            self.air.writeServerEvent('suspicious',avId,'Toon tried to award beans while not in district!')
            return
        if catches > PartyGlobals.CatchMaxTotalReward:
            catches = PartyGlobals.CatchMaxTotalReward
        self.sendUpdateToAvatarId(avId, 'showJellybeanReward', [catches, av.getMoney(), TTLocalizer.PartyCatchRewardMessage % (catches, catches)])
        av.addMoney(catches)
        DistributedPartyActivityAI.toonExitDemand(self)

    def __startGame(self):
        self.playing = True
        self.calcDifficultyConstants(len(self.toonsPlaying))
        self.generations.append([self.numGenerations, globalClockDelta.getRealNetworkTime(bits=32), len(self.toonsPlaying)])
        self.numGenerations += 1
        self.sendUpdate('setGenerations', [self.generations])
        taskMgr.doMethodLater(self.generationDuration, self.__newGeneration, 'newGeneration%d' % self.doId, extraArgs=[])

    def __newGeneration(self):
        if len(self.toonsPlaying) > 0:
            self.__startGame()
        else:
            self.playing = False
    def getGenerations(self):
        return self.generations

    def requestActivityStart(self):
        pass

    def startRequestResponse(self, todo0):
        pass

    def claimCatch(self, generation, objNum, objType):
        avId = self.air.getAvatarIdFromSender()
        if not avId in self.toonsPlaying:
            self.air.writeServerEvent('suspicious',avId,'Toon tried to catch while not playing!')
            return
        if PartyGlobals.DOTypeId2Name[objType] != 'anvil':
            self.player2catches[avId] += 1
        self.sendUpdate('setObjectCaught', [avId, generation, objNum])
