from panda3d.core import *
from direct.fsm.FSM import FSM
from direct.showbase import PythonUtil
from direct.interval.MetaInterval import Sequence
from toontown.parties.PartyGlobals import DanceReverseLoopAnims, ToonDancingStates

class PartyDanceActivityToonFSM(FSM):
    notify = directNotify.newCategory('PartyDanceActivityToonFSM')

    def __init__(self, avId, activity, h):
        FSM.__init__(self, self.__class__.__name__)
        self.notify.debug('init : avId = %s, activity = %s ' % (avId, activity))
        self.avId = avId
        self.activity = activity
        self.isLocal = avId == base.localAvatar.doId
        self.toon = self.activity.getAvatar(self.avId)
        self.toonH = h
        self.danceNode = None
        self.danceMoveSequence = None
        self.lastAnim = None
        self.defaultTransitions = {'Init': ['Run', 'DanceMove', 'Cleanup'],
         'DanceMove': ['Run', 'DanceMove', 'Cleanup'],
         'Run': ['Run', 'DanceMove', 'Cleanup'],
         'Cleanup': []}
        self.enteredAlready = False
        return

    def destroy(self):
        self.toon = None
        if self.danceNode is not None:
            self.danceNode.removeNode()
            self.danceNode = None
        self.activity = None
        self.avId = None
        return

    def enterInit(self, *args):
        if not self.enteredAlready:
            self.danceNode = NodePath('danceNode-%s' % self.avId)
            self.danceNode.reparentTo(render)
            self.danceNode.setPos(0, 0, 0)
            self.danceNode.setH(self.toonH)
            pos = self.toon.getPos(self.danceNode)
            self.toon.reparentTo(self.danceNode)
            self.toon.setPos(pos)
            self.enteredAlready = True

    def exitInit(self):
        pass

    def enterCleanup(self, *args):
        if hasattr(base.cr.playGame.hood, 'loader'):
            pos = self.toon.getPos(self.activity.getParentNodePath())
            hpr = self.toon.getHpr(self.activity.getParentNodePath())
            self.toon.reparentTo(self.activity.getParentNodePath())
            self.toon.setPos(pos)
            self.toon.setHpr(hpr)
        if self.danceNode is not None:
            self.danceNode.removeNode()
            self.danceNode = None
        self.enteredAlready = False
        return

    def exitCleanup(self):
        pass

    def enterDanceMove(self, anim = ''):
        if self.lastAnim is None and anim == '':
            self.toon.loop('victory', fromFrame=98, toFrame=122)
        else:
            if anim == '':
                anim = self.lastAnim
            if anim in DanceReverseLoopAnims:
                self.danceMoveSequence = Sequence(self.toon.actorInterval(anim, loop=0), self.toon.actorInterval(anim, loop=0, playRate=-1.0))
                self.danceMoveSequence.loop()
            else:
                self.toon.loop(anim)
            self.lastAnim = anim
        return

    def exitDanceMove(self):
        if self.danceMoveSequence and self.danceMoveSequence.isPlaying():
            self.danceMoveSequence.pause()
            self.danceMoveSequence = None
        return

    def enterRun(self, *args):
        if self.toon.getCurrentAnim() != 'run':
            self.toon.loop('run')

    def exitRun(self):
        pass