import time
import gc

from picographics import PicoGraphics, DISPLAY_TUFTY_2040, PEN_RGB332
from picovector import PicoVector, Polygon, RegularPolygon, Rectangle, ANTIALIAS_X4


display = PicoGraphics(DISPLAY_TUFTY_2040, pen_type=PEN_RGB332)

vector = PicoVector(display)
vector.set_antialiasing(ANTIALIAS_X4)

RED = display.create_pen(200, 0, 0)
BLACK = display.create_pen(0, 0, 0)
GREY = display.create_pen(200, 200, 200)
WHITE = display.create_pen(255, 255, 255)

"""
# Redefine colours for a Blue clock
RED = display.create_pen(200, 0, 0)
BLACK = display.create_pen(135, 159, 169)
GREY = display.create_pen(10, 40, 50)
WHITE = display.create_pen(14, 60, 76)
"""

WIDTH, HEIGHT = display.get_bounds()

hub = RegularPolygon(int(WIDTH / 2), int(HEIGHT / 2), 24, 5)

face = RegularPolygon(int(WIDTH / 2), int(HEIGHT / 2), 48, int(HEIGHT / 2))

print(time.localtime())

last_second = None

while True:
    t_start = time.ticks_ms()
    year, month, day, hour, minute, second, _, _ = time.localtime()

    if last_second == second:
        continue

    last_second = second

    display.set_pen(0)
    display.clear()

    display.set_pen(BLACK)
    display.circle(int(WIDTH / 2), int(HEIGHT / 2), int(HEIGHT / 2))
    display.set_pen(WHITE)
    display.circle(int(WIDTH / 2), int(HEIGHT / 2), int(HEIGHT / 2) - 4)

    display.set_pen(GREY)

    for a in range(60):
        tick_mark = Rectangle(int(WIDTH / 2) - 3, 10, 6, int(HEIGHT / 48))
        vector.rotate(tick_mark, 360 / 60.0 * a, int(WIDTH / 2), int(HEIGHT / 2))
        vector.translate(tick_mark, 0, 2)
        vector.draw(tick_mark)

    for a in range(12):
        hour_mark = Rectangle(int(WIDTH / 2) - 5, 10, 10, int(HEIGHT / 10))
        vector.rotate(hour_mark, 360 / 12.0 * a, int(WIDTH / 2), int(HEIGHT / 2))
        vector.translate(hour_mark, 0, 2)
        vector.draw(hour_mark)

    angle_second = second * 6
    second_hand_length = int(HEIGHT / 2) - int(HEIGHT / 8)
    second_hand = Polygon((-2, -second_hand_length), (-2, int(HEIGHT / 8)), (2, int(HEIGHT / 8)), (2, -second_hand_length))
    vector.rotate(second_hand, angle_second, 0, 0)
    vector.translate(second_hand, int(WIDTH / 2), int(HEIGHT / 2) + 5)

    angle_minute = minute * 6
    angle_minute += second / 10.0
    minute_hand_length = int(HEIGHT / 2) - int(HEIGHT / 24)
    minute_hand = Polygon((-5, -minute_hand_length), (-10, int(HEIGHT / 16)), (10, int(HEIGHT / 16)), (5, -minute_hand_length))
    vector.rotate(minute_hand, angle_minute, 0, 0)
    vector.translate(minute_hand, int(WIDTH / 2), int(HEIGHT / 2) + 5)

    angle_hour = (hour % 12) * 30
    angle_hour += minute / 2
    hour_hand_length = int(HEIGHT / 2) - int(HEIGHT / 8)
    hour_hand = Polygon((-5, -hour_hand_length), (-10, int(HEIGHT / 16)), (10, int(HEIGHT / 16)), (5, -hour_hand_length))
    vector.rotate(hour_hand, angle_hour, 0, 0)
    vector.translate(hour_hand, int(WIDTH / 2), int(HEIGHT / 2) + 5)

    display.set_pen(GREY)

    vector.draw(minute_hand)
    vector.draw(hour_hand)
    vector.draw(second_hand)

    display.set_pen(BLACK)

    for a in range(60):
        tick_mark = Rectangle(int(WIDTH / 2) - 3, 10, 6, int(HEIGHT / 48))
        vector.rotate(tick_mark, 360 / 60.0 * a, int(WIDTH / 2), int(HEIGHT / 2))
        vector.draw(tick_mark)

    for a in range(12):
        hour_mark = Rectangle(int(WIDTH / 2) - 5, 10, 10, int(HEIGHT / 10))
        vector.rotate(hour_mark, 360 / 12.0 * a, int(WIDTH / 2), int(HEIGHT / 2))
        vector.draw(hour_mark)

    vector.translate(minute_hand, 0, -5)
    vector.translate(hour_hand, 0, -5)
    vector.draw(minute_hand)
    vector.draw(hour_hand)

    display.set_pen(RED)
    vector.translate(second_hand, 0, -5)
    vector.draw(second_hand)
    vector.draw(hub)

    display.update()
    gc.collect()

    t_end = time.ticks_ms()
    print(f"Took {t_end - t_start}ms")
