# File: D (Python 2.4)

from otp.ai.AIBaseGlobal import *
from direct.distributed.ClockDelta import *
from otp.avatar import DistributedAvatarAI
from direct.directnotify import DirectNotifyGlobal
from toontown.toonbase import ToontownGlobals

class DistributedCCharBaseAI(DistributedAvatarAI.DistributedAvatarAI):
    notify = DirectNotifyGlobal.directNotify.newCategory('DistributedCCharBaseAI')

    def __init__(self, air, name):
        DistributedAvatarAI.DistributedAvatarAI.__init__(self, air)
        self.setName(name)
        self.exitOff()
        self.transitionToCostume = 0
        self.diffPath = None


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


    def exitOff(self):
        self._DistributedCCharBaseAI__initAttentionSpan()
        self._DistributedCCharBaseAI__clearNearbyAvatars()


    def avatarEnter(self):
        avId = self.air.getAvatarIdFromSender()
        self.notify.debug('adding avatar ' + str(avId) + ' to the nearby avatar list')
        if avId not in self.nearbyAvatars:
            self.nearbyAvatars.append(avId)
        else:
            self.air.writeServerEvent('suspicious', avId, 'CCharBase.avatarEnter')
            self.notify.warning('Avatar %s already in nearby avatars!' % avId)
        self.nearbyAvatarInfoDict[avId] = { }
        self.nearbyAvatarInfoDict[avId]['enterTime'] = globalClock.getRealTime()
        self.nearbyAvatarInfoDict[avId]['lastChatTime'] = 0
        self.sortNearbyAvatars()
        self._DistributedCCharBaseAI__interestingAvatarEventOccured()
        avExitEvent = self.air.getAvatarExitEvent(avId)
        self.acceptOnce(avExitEvent, self._DistributedCCharBaseAI__handleExitedAvatar, [
            avId])
        self.avatarEnterNextState()


    def avatarExit(self):
        avId = self.air.getAvatarIdFromSender()
        self._DistributedCCharBaseAI__doAvatarExit(avId)


    def _DistributedCCharBaseAI__doAvatarExit(self, avId):
        avId = self.air.getAvatarIdFromSender()
        self.notify.debug('removing avatar ' + str(avId) + ' from the nearby avatar list')
        if avId not in self.nearbyAvatars:
            self.notify.debug('avatar ' + str(avId) + ' not in the nearby avatar list')
        else:
            avExitEvent = self.air.getAvatarExitEvent(avId)
            self.ignore(avExitEvent)
            del self.nearbyAvatarInfoDict[avId]
            self.nearbyAvatars.remove(avId)
            self.avatarExitNextState()


    def avatarEnterNextState():
        pass


    def avatarExitNextState():
        pass


    def _DistributedCCharBaseAI__clearNearbyAvatars(self):
        self.nearbyAvatars = []
        self.nearbyAvatarInfoDict = { }


    def sortNearbyAvatars(self):

        def nAv_compare(a, b, nAvIDict = self.nearbyAvatarInfoDict):
            tsA = nAvIDict[a]['enterTime']
            tsB = nAvIDict[b]['enterTime']
            if tsA == tsB:
                return 0
            elif tsA < tsB:
                return -1
            else:
                return 1

        self.nearbyAvatars.sort(nAv_compare)


    def getNearbyAvatars(self):
        return self.nearbyAvatars


    def _DistributedCCharBaseAI__avatarSpoke(self, avId):
        now = globalClock.getRealTime()
        if avId in self.nearbyAvatarInfoDict:
            self.nearbyAvatarInfoDict[avId]['lastChatTime'] = now
            self._DistributedCCharBaseAI__interestingAvatarEventOccured()



    def _DistributedCCharBaseAI__initAttentionSpan(self):
        self._DistributedCCharBaseAI__avatarTimeoutBase = 0


    def _DistributedCCharBaseAI__interestingAvatarEventOccured(self, t = None):
        if t == None:
            t = globalClock.getRealTime()

        self._DistributedCCharBaseAI__avatarTimeoutBase = t


    def lostInterest(self):
        now = globalClock.getRealTime()
        if now > self._DistributedCCharBaseAI__avatarTimeoutBase + 50.0:
            return 1

        return 0


    def _DistributedCCharBaseAI__handleExitedAvatar(self, avId):
        self._DistributedCCharBaseAI__doAvatarExit(avId)


    def setNearbyAvatarChat(self, msg):
        avId = self.air.getAvatarIdFromSender()
        self.notify.debug('setNearbyAvatarChat: avatar ' + str(avId) + ' said ' + str(msg))
        self._DistributedCCharBaseAI__avatarSpoke(avId)
        self.air.doFind('DistributedSmartNPC').sendUpdate('talkMessage', [avId, msg])


    def setNearbyAvatarSC(self, msgIndex):
        avId = self.air.getAvatarIdFromSender()
        self.notify.debug('setNearbyAvatarSC: avatar %s said SpeedChat phrase %s' % (avId, msgIndex))
        self._DistributedCCharBaseAI__avatarSpoke(avId)


    def setNearbyAvatarSCCustom(self, msgIndex):
        avId = self.air.getAvatarIdFromSender()
        self.notify.debug('setNearbyAvatarSCCustom: avatar %s said custom SpeedChat phrase %s' % (avId, msgIndex))
        self._DistributedCCharBaseAI__avatarSpoke(avId)


    def setNearbyAvatarSCToontask(self, taskId, toNpcId, toonProgress, msgIndex):
        avId = self.air.getAvatarIdFromSender()
        self.notify.debug('setNearbyAvatarSCToontask: avatar %s said %s' % (avId, (taskId, toNpcId, toonProgress, msgIndex)))
        self._DistributedCCharBaseAI__avatarSpoke(avId)


    def getWalk(self):
        return ('', '', 0)


    def walkSpeed(self):
        return 0.10000000000000001


    def handleHolidays(self):
        self.CCChatter = 0
        if hasattr(simbase.air, 'holidayManager'):
            if ToontownGlobals.CRASHED_LEADERBOARD in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.CRASHED_LEADERBOARD
            elif ToontownGlobals.CIRCUIT_RACING_EVENT in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.CIRCUIT_RACING_EVENT
            elif ToontownGlobals.WINTER_CAROLING in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.WINTER_CAROLING
            elif ToontownGlobals.WINTER_DECORATIONS in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.WINTER_DECORATIONS
            elif ToontownGlobals.VALENTINES_DAY in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.VALENTINES_DAY
            elif ToontownGlobals.APRIL_FOOLS_COSTUMES in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.APRIL_FOOLS_COSTUMES
            elif ToontownGlobals.SILLY_CHATTER_ONE in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.SILLY_CHATTER_ONE
            elif ToontownGlobals.SILLY_CHATTER_TWO in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.SILLY_CHATTER_TWO
            elif ToontownGlobals.SILLY_CHATTER_THREE in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.SILLY_CHATTER_THREE
            elif ToontownGlobals.SILLY_CHATTER_FOUR in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.SILLY_CHATTER_FOUR
            elif ToontownGlobals.SILLY_CHATTER_FIVE in simbase.air.holidayManager.currentHolidays:
                self.CCChatter = ToontownGlobals.SILLY_CHATTER_FOUR




    def getCCLocation(self):
        return 0


    def getCCChatter(self):
        self.handleHolidays()
        return self.CCChatter


    def fadeAway(self):
        self.sendUpdate('fadeAway', [])


    def transitionCostume(self):
        self.transitionToCostume = 1