from direct.directnotify import DirectNotifyGlobal
from . import RingAction

class RingTrack:
    notify = DirectNotifyGlobal.directNotify.newCategory('RingTrack')

    def __init__(self, actions, actionDurations = None, reverseFlag = 0):
        if actionDurations == None:
            actionDurations = [1.0 / float(len(actions))] * len(actions)
        sum = 0.0
        for duration in actionDurations:
            sum += duration

        if sum != 1.0:
            self.notify.warning('action lengths do not sum to 1.; sum=' + str(sum))
        self.actions = actions
        self.actionDurations = actionDurations
        self.reverseFlag = reverseFlag
        return

    def eval(self, t):
        t = float(t)
        if self.reverseFlag:
            t = 1.0 - t
        actionStart = 0.0
        for action, duration in zip(self.actions, self.actionDurations):
            actionEnd = actionStart + duration
            if t < actionEnd:
                actionT = (t - actionStart) / duration
                return action.eval(actionT)
            else:
                actionStart = actionEnd

        if t == actionStart:
            self.notify.debug('time value is at end of ring track: ' + str(t) + ' == ' + str(actionStart))
        else:
            self.notify.debug('time value is beyond end of ring track: ' + str(t) + ' > ' + str(actionStart))
        lastAction = self.actions[len(self.actions) - 1]
        return lastAction.eval(1.0)