from panda3d.core import *
from direct.interval.IntervalGlobal import *
from otp.level import BasicEntities
from . import MovingPlatform

class PlatformEntity(BasicEntities.NodePathEntity):

    def __init__(self, level, entId):
        BasicEntities.NodePathEntity.__init__(self, level, entId)
        self.start()

    def destroy(self):
        self.stop()
        BasicEntities.NodePathEntity.destroy(self)

    def start(self):
        model = loader.loadModel(self.modelPath)
        if model is None:
            return
        if len(self.floorName) == 0:
            return
        model.setScale(self.modelScale)
        model.flattenMedium()
        self.platform = MovingPlatform.MovingPlatform()
        self.platform.setupCopyModel(self.getParentToken(), model, self.floorName)
        self.platform.reparentTo(self)
        startPos = Point3(0, 0, 0)
        endPos = self.offset
        distance = Vec3(self.offset).length()
        waitDur = self.period * self.waitPercent
        moveDur = self.period - waitDur
        self.moveIval = Sequence(WaitInterval(waitDur * 0.5), LerpPosInterval(self.platform, moveDur * 0.5, endPos, startPos=startPos, name='platformOut%s' % self.entId, blendType=self.motion, fluid=1), WaitInterval(waitDur * 0.5), LerpPosInterval(self.platform, moveDur * 0.5, startPos, startPos=endPos, name='platformBack%s' % self.entId, blendType=self.motion, fluid=1), name=self.getUniqueName('platformIval'))
        self.moveIval.loop()
        self.moveIval.setT(globalClock.getFrameTime() - self.level.startTime + self.period * self.phaseShift)
        return

    def stop(self):
        if hasattr(self, 'moveIval'):
            self.moveIval.pause()
            del self.moveIval
        if hasattr(self, 'platform'):
            self.platform.destroy()
            del self.platform

    if __dev__:

        def attribChanged(self, *args):
            self.stop()
            self.start()