import math
import RingTrack
import RingAction
center = (0, 0)
up = (0, 1)
down = (0, -1)
left = (-1, 0)
right = (1, 0)
ul = (-1, 1)
ur = (1, 1)
lr = (1, -1)
ll = (-1, -1)

def ringLerp(t, a, b):
    omT = 1.0 - t
    return (float(a[0]) * omT + float(b[0]) * t, float(a[1]) * omT + float(b[1]) * t)


def ringClerp(t, a, b):
    return ringLerp(t * t * (3 - 2 * t), a, b)


def getSquareRingActions():
    return ([RingAction.RingActionFunction(ringClerp, [ul, ur]),
      RingAction.RingActionFunction(ringClerp, [ur, lr]),
      RingAction.RingActionFunction(ringClerp, [lr, ll]),
      RingAction.RingActionFunction(ringClerp, [ll, ul])], [0.25,
      0.25,
      0.25,
      0.25])


def getVerticalSlotActions(x):
    return ([RingAction.RingActionFunction(ringClerp, [(x, 1), (x, -1)]), RingAction.RingActionFunction(ringClerp, [(x, -1), (x, 1)])], [0.5, 0.5])


def getHorizontalSlotActions(y):
    return ([RingAction.RingActionFunction(ringClerp, [(1, y), (-1, y)]), RingAction.RingActionFunction(ringClerp, [(-1, y), (1, y)])], [0.5, 0.5])


def getCircleRingActions():

    def circlePos(t):
        return (math.sin(t * 2.0 * math.pi), math.cos(t * 2.0 * math.pi))

    return ([RingAction.RingActionFunction(circlePos, [])], [1.0])


def getVerticalInfinityRingActions():

    def vertInfPos(t):
        return (0.5 * math.sin(2.0 * t * 2.0 * math.pi), math.cos(t * 2.0 * math.pi))

    return ([RingAction.RingActionFunction(vertInfPos, [])], [1.0])


def getHorizontalInfinityRingActions():

    def horizInfPos(t):
        return (math.sin(t * 2.0 * math.pi), 0.5 * math.sin(2.0 * t * 2.0 * math.pi))

    return ([RingAction.RingActionFunction(horizInfPos, [])], [1.0])


RingOffset = 0.4

def getPlusUpRingActions():
    return ([RingAction.RingActionFunction(ringClerp, [(0, RingOffset), (0, 1)]), RingAction.RingActionFunction(ringClerp, [(0, 1), (0, RingOffset)])], [0.5, 0.5])


def getPlusDownRingActions():
    return ([RingAction.RingActionFunction(ringClerp, [(0, -RingOffset), (0, -1)]), RingAction.RingActionFunction(ringClerp, [(0, -1), (0, -RingOffset)])], [0.5, 0.5])


def getPlusRightRingActions():
    return ([RingAction.RingActionFunction(ringClerp, [(RingOffset, 0), (1, 0)]), RingAction.RingActionFunction(ringClerp, [(1, 0), (RingOffset, 0)])], [0.5, 0.5])


def getPlusLeftRingActions():
    return ([RingAction.RingActionFunction(ringClerp, [(-RingOffset, 0), (-1, 0)]), RingAction.RingActionFunction(ringClerp, [(-1, 0), (-RingOffset, 0)])], [0.5, 0.5])


def getHalfDomeRingActions():

    def halfDome(t):
        return (math.cos(t * math.pi), -math.sin(t * math.pi))

    x1 = -1.0
    x2 = -1.0 / 3.0
    x3 = 1.0 / 3.0
    x4 = 1.0
    return ([RingAction.RingActionFunction(ringClerp, [(x1, 0), (x2, 0)]),
      RingAction.RingActionFunction(ringClerp, [(x2, 0), (x3, 0)]),
      RingAction.RingActionFunction(ringClerp, [(x3, 0), (x4, 0)]),
      RingAction.RingActionFunction(halfDome, [])], [0.25,
      0.25,
      0.25,
      0.25])