from main import Controller, Lane, OutType, OutAngle, Unit
from time import sleep

interval = 0.2


def suite(controller: Controller):
    lines(controller)
    direction(controller)
    distance(controller)
    speed(controller)
    time(controller)
    control(controller)
    compass(controller)


def lines(controller: Controller):
    print("Lines")
    controller.set_lines([Lane.DotsLeft], [])
    controller.set_lines([Lane.OuterRight], [Lane.OuterLeft])
    controller.set_lines([Lane.MiddleRight], [Lane.MiddleLeft])
    controller.set_lines([Lane.InnerRight], [Lane.InnerLeft])
    controller.set_lines([Lane.InnerLeft], [Lane.InnerRight])
    controller.set_lines([Lane.MiddleLeft], [Lane.MiddleRight])
    controller.set_lines([Lane.OuterLeft], [Lane.OuterRight])
    controller.set_lines(
        [Lane.DotsRight],
        [Lane.OuterRight, Lane.MiddleRight, Lane.InnerRight, Lane.InnerLeft, Lane.MiddleLeft, Lane.OuterLeft]
    )
    controller.set_lines([], [])


def direction(controller: Controller):
    print("Direction")
    controller.set_direction(OutAngle.SharpRight)
    controller.set_direction(OutAngle.Right)
    controller.set_direction(OutAngle.EasyRight)
    controller.set_direction(OutAngle.Straight)
    controller.set_direction(OutAngle.EasyLeft)
    controller.set_direction(OutAngle.Left)
    controller.set_direction(OutAngle.SharpLeft)
    controller.set_direction(OutAngle.LeftDown)
    controller.set_direction(OutAngle.RightDown)
    controller.set_direction(OutAngle.Down)
    controller.set_direction(OutAngle.SharpRight, OutType.LongerLane)
    controller.set_direction(OutAngle.Right, OutType.LongerLane)
    controller.set_direction(OutAngle.EasyRight, OutType.LongerLane)
    controller.set_direction(OutAngle.Straight, OutType.LongerLane)
    controller.set_direction(OutAngle.EasyLeft, OutType.LongerLane)
    controller.set_direction(OutAngle.Left, OutType.LongerLane)
    controller.set_direction(OutAngle.SharpLeft, OutType.LongerLane)
    roundabout(controller)
    controller.set_direction(OutAngle.Left, OutType.Flag)
    controller.set_direction(OutAngle.Right, OutType.Flag)


def roundabout(controller: Controller):
    controller.set_direction(OutAngle.SharpRight, OutType.RightRoundabout)
    controller.set_direction(OutAngle.Right, OutType.RightRoundabout)
    controller.set_direction(OutAngle.EasyRight, OutType.RightRoundabout)
    controller.set_direction(OutAngle.Straight, OutType.RightRoundabout)
    controller.set_direction(OutAngle.EasyLeft, OutType.RightRoundabout)
    controller.set_direction(OutAngle.Left, OutType.RightRoundabout)
    controller.set_direction(OutAngle.SharpLeft, OutType.RightRoundabout)
    controller.set_direction(OutAngle.Down, OutType.RightRoundabout)


def distance(controller: Controller):
    print("Distance")
    controller.set_distance(555.5)
    controller.set_distance(6666)
    controller.set_distance(777.7)
    controller.set_distance(888, Unit.Kilometres)
    controller.set_distance(999, Unit.Metres)
    controller.set_distance(999, Unit.Foot)
    controller.set_distance(999, Unit.Miles)


def speed(controller: Controller):
    print("Speed")
    controller.set_gps(True)
    controller.set_speed(50)
    controller.set_speed(50, 100)
    controller.set_speed(150, 100)
    controller.set_speed(50, 100, True)


def time(controller: Controller):
    print("Time")
    controller.set_time(22, 22)
    controller.set_time(22, 22, traffic=True)
    controller.set_time(22, 22, flag=True)


def control(controller: Controller):
    print("Speed Control")
    controller.set_speed_control()
    controller.set_speed_control(False)


def compass(controller: Controller):
    print("Compass")
    controller.set_compass(22.5)
    controller.set_compass(67.5)
    controller.set_compass(112.5)
    controller.set_compass(157.5)
    controller.set_compass(202.5)
    controller.set_compass(247.5)
    controller.set_compass(292.5)
    controller.set_compass(337.5)


def route(controller: Controller):
    print("Route")
    controller.set_direction(OutAngle.Left)
    controller.set_gps(True)
    controller.set_speed(50, 50)
    controller.set_distance(1.2, Unit.Kilometres)
    sleep(1)
    controller.set_distance(1.1, Unit.Kilometres)
    sleep(1)
    controller.set_distance(1, Unit.Kilometres)
    sleep(1)
    remaining = 900
    while remaining > 0:
        controller.set_distance(remaining, Unit.Metres)
        sleep(1)
        remaining -= 100
    controller.set_direction(OutAngle.Right, OutType.Flag)
    remaining = 900
    while remaining > 0:
        controller.set_distance(remaining, Unit.Metres)
        sleep(1)
        remaining -= 100


if __name__ == '__main__':
    import os
    name = '/dev/rfcomm0' if os.name != 'nt' else 'COM8'
    instance = Controller(name)
    suite(instance)