from panda3d.core import *
from direct.distributed import ClockDelta
from otp.nametag.NametagConstants import CFSpeech, CFTimeout
from toontown.toonbase import TTLocalizer, ToontownGlobals
from toontown.toontowngui import TTDialog
from toontown.toon import NPCToons
from DistributedNPCToonBase import DistributedNPCToonBase
import LaffRestockGlobals
from LaffShopGui import *

class DistributedNPCLaffRestock(DistributedNPCToonBase):

    zone2id = {
        10000: 0,
        13000: 1,
        12000: 2,
        11000: 3,
    }

    def __init__(self, cr):
        DistributedNPCToonBase.__init__(self, cr)
        self.isLocalToon = 0
        self.av = None
        self.laffGui = None

    def disable(self):
        self.ignoreAll()
        if self.laffGui:
            self.laffGui.destroy()
            self.laffGui = None
        self.av = None
        DistributedNPCToonBase.disable(self)

    def initToonState(self):
        self.setAnimState('neutral', 0.9, None, None)
        if self.name in NPCToons.LaffRestockPositions:
            pos = NPCToons.LaffRestockPositions[self.name]
            self.setPos(*pos[0])
            self.setH(pos[1])
        self.putOnSuit(self.zone2id.get(self.zoneId, -1), rental=True)

    def getCollSphereRadius(self):
        return 3.0

    def handleCollisionSphereEnter(self, collEntry):
        base.cr.playGame.getPlace().fsm.request('purchase')
        self.sendUpdate('avatarEnter', [])

    def __handleUnexpectedExit(self):
        self.notify.warning('unexpected exit')
        self.av = None

    def resetLaffClerk(self):
        self.ignoreAll()
        if self.laffGui:
            self.laffGui.destroy()
            self.laffGui = None
        self.show()
        self.startLookAround()
        self.detectAvatars()
        if self.isLocalToon:
            self.showNametag2d()
            self.freeAvatar()
        return Task.done

    def setMovie(self, mode, npcId, avId, extraArgs, timestamp):
        timeStamp = ClockDelta.globalClockDelta.localElapsedTime(timestamp)
        self.remain = NPCToons.CLERK_COUNTDOWN_TIME - timeStamp
        self.npcId = npcId
        self.isLocalToon = avId == base.localAvatar.doId
        if mode == NPCToons.SELL_MOVIE_CLEAR:
            return
        if mode == NPCToons.SELL_MOVIE_TIMEOUT:
            if self.isLocalToon:
                if self.laffGui:
                    self.laffGui.destroy()
                    self.laffGui = None
            self.setChatAbsolute(TTLocalizer.STOREOWNER_TOOKTOOLONG, CFSpeech | CFTimeout)
            self.resetLaffClerk()
        elif mode == NPCToons.SELL_MOVIE_START:
            self.av = base.cr.doId2do.get(avId)
            if self.av is None:
                self.notify.warning('Avatar %d not found in doId' % avId)
                return
            else:
                self.accept(self.av.uniqueName('disable'), self.__handleUnexpectedExit)
            self.setupAvatars(self.av)
            if self.isLocalToon:
                self.hideNametag2d()
                laff = self.av.getMaxHp() - self.av.getHp()
                cost = laff * ToontownGlobals.CostPerLaffRestock
                self.popupLaffGUI(laff, cost)
        elif mode == NPCToons.SELL_MOVIE_COMPLETE:
            self.setChatAbsolute(TTLocalizer.RestockLaffMessage, CFSpeech | CFTimeout)
            self.resetLaffClerk()
        elif mode == LaffRestockGlobals.FullLaff:
            self.setChatAbsolute(TTLocalizer.RestockFullLaffMessage, CFSpeech | CFTimeout)
            self.resetLaffClerk()
        elif mode == LaffRestockGlobals.NoMoney:
            self.setChatAbsolute(TTLocalizer.RestockNoMoneyMessage, CFSpeech | CFTimeout)
            self.resetLaffClerk()
        elif mode == NPCToons.SELL_MOVIE_CHEATER:
            self.setChatAbsolute(TTLocalizer.RestockCheaterMessage, CFSpeech | CFTimeout)
            self.resetLaffClerk()

    def __handleRestock(self, laff, cost):
        self.sendUpdate('restock', [self.av.doId, laff, cost])

    def __handleGuiDone(self, bTimedOut=False):
        self.ignoreAll()
        if self.laffGui:
            self.laffGui.destroy()
            self.laffGui = None
        if not bTimedOut:
            self.sendUpdate('transactionDone')

    def popupLaffGUI(self, laff, cost):
        self.setChatAbsolute('', CFSpeech)
        self.accept('restockLaff', self.__handleRestock)
        self.acceptOnce('guiDone', self.__handleGuiDone)
        self.laffGui = LaffShopGui(text=TTLocalizer.RestockAskMessage % (laff, cost))
