from otp.ai.AIBaseGlobal import *
from direct.task.Task import Task
from pandac.PandaModules import *
from DistributedNPCToonBaseAI import *
from toontown.estate import BankGlobals

class DistributedNPCBankerAI(DistributedNPCToonBaseAI):

    def __init__(self, air, npcId, questCallback = None, hq = 0):
        DistributedNPCToonBaseAI.__init__(self, air, npcId, questCallback)
        self.hq = hq
        self.tutorial = 0
        self.pendingAvId = None
        self.task = ''

    def avatarEnter(self):
        avId = self.air.getAvatarIdFromSender()
        if self.busy:
            self.sendClearMovie(av=avId)
            return

        self.busy = avId
        self.sendGUIMovie()
        self.acceptOnce(self.air.getAvatarExitEvent(avId),
                self.__handleUnexpectedExit, extraArgs=[avId])
        DistributedNPCToonBaseAI.avatarEnter(self)

    def transferMoney(self, transactionAmount):
        av = self.air.doId2do.get(self.busy)
        if not av:
            return

        money = min(av.getMoney() - transactionAmount, 10000)
        av.b_setMoney(money)

        if transactionAmount != 0:
            self.air.bankManager.setMoney(self.busy,
                av.getBankMoney() + transactionAmount)

        self.clearTasks()
        self.sendDoneMovie()

    def sendGUIMovie(self):
        if self.task:
            taskMgr.remove(self.task)

        self.task = self.uniqueName('timeoutMovie')
        taskMgr.doMethodLater(60, self.sendTimeoutMovie,
                              self.task)
        self.sendUpdate('setMovie', [BankGlobals.BANK_MOVIE_GUI,
         self.busy,
         ClockDelta.globalClockDelta.getRealNetworkTime()])

    def sendTimeoutMovie(self, task=None):
        self.pendingAvId = None
        self.sendUpdate('setMovie', [BankGlobals.BANK_MOVIE_TIMEOUT,
         self.busy,
         ClockDelta.globalClockDelta.getRealNetworkTime()])
        self.busy = 0

        if self.task:
            taskMgr.remove(self.task)

        self.task = self.uniqueName('clearMovie')
        taskMgr.doMethodLater(5.5, self.sendClearMovie,
            self.task)

        if task is not None:
            return task.done

    def sendClearMovie(self, task=None, av=0):
        self.sendUpdate('setMovie', [BankGlobals.BANK_MOVIE_CLEAR,
         av,
         ClockDelta.globalClockDelta.getRealNetworkTime()])

        if task is not None:
            return task.done

    def sendDoneMovie(self):
        self.sendUpdate('setMovie', [BankGlobals.BANK_MOVIE_DEPOSIT,
         self.busy,
         ClockDelta.globalClockDelta.getRealNetworkTime()])
        self.busy = 0

        if self.task:
            taskMgr.remove(self.task)

        self.task = self.uniqueName('clearMovie')
        taskMgr.doMethodLater(5.5, self.sendClearMovie, self.task)

    def rejectAvatar(self, avId):
        self.busy = avId
        self.sendUpdate('setMovie', [BankGlobals.BANK_MOVIE_REJECT,
         avId,
         ClockDelta.globalClockDelta.getRealNetworkTime()])

    def __handleUnexpectedExit(self, avId):
        self.notify.warning('avatar:' + str(avId) + ' has exited unexpectedly')
        self.clearTasks()
        self.sendTimeoutMovie()

    def clearTasks(self):
        if self.task:
            taskMgr.remove(self.task)

        self.task = None