import display, touchpads, random, virtualtimers as vt

ONE_THIRD = 1.0/3.0
ONE_SIXTH = 1.0/6.0
TWO_THIRD = 2.0/3.0

def _v(m1, m2, hue):
    hue = hue % 1.0
    if hue < ONE_SIXTH:
        return m1 + (m2-m1)*hue*6.0
    if hue < 0.5:
        return m2
    if hue < TWO_THIRD:
        return m1 + (m2-m1)*(TWO_THIRD-hue)*6.0
    return m1

def hls_to_rgb(h, l, s):
    if s == 0.0:
        return l, l, l
    if l <= 0.5:
        m2 = l * (1.0+s)
    else:
        m2 = l+s-(l*s)
    m1 = 2.0*l - m2
    return (_v(m1, m2, h+ONE_THIRD), _v(m1, m2, h), _v(m1, m2, h-ONE_THIRD))

def hls_to_color(h, l, s):
    r, g, b = hls_to_rgb(h, l, s)
    return (int(r * 255) << 16) | (int(g * 255) << 8) | int(b * 255)

def random_color():
    h = random.random()
    return hls_to_color(h, 0.5, 1)

mode = 0
fill_h = 0
buf = [random_color() for i in range(0, 16)]

def on_touch(pressed):
    global mode
    if pressed == touchpads.LEFT:
        if mode > 0:
            mode = mode - 1
    elif pressed == touchpads.RIGHT:
        if mode < 4:
            mode = mode + 1
            
    print("Key:", pressed, "mode =", mode)

def update():
    global mode, fill_h, buf
    if mode == 0:
        for x in range(0, 4):
            for y in range(0, 4):
                display.drawPixel(x, y, random_color())
        display.flush()
        return 600
    elif mode == 1:
        x = random.randint(0, 4)
        y = random.randint(0, 4)
        display.drawPixel(x, y, random_color())
        display.flush()
        return 50
    elif mode == 2:
        buf = buf[4:] + [random_color() for i in range(0, 4)]
        for x in range(0, 4):
            for y in range(0, 4):
                display.drawPixel(x, y, buf[ y + x * 4])
        display.flush()
        return 400
    elif mode == 3:
        c = random_color()
        display.drawFill(c)
        display.flush()
        return 300
    elif mode == 4:
        fill_h += 0.01
        if fill_h > 1.0:
            fill_h = 0
            
        c = hls_to_color(fill_h, 0.6, 1.0)
        display.drawFill(c)
        display.flush()
        return 16
    
    return 1000

touchpads.on(touchpads.LEFT, on_touch)
touchpads.on(touchpads.RIGHT, on_touch)

vt.begin()
vt.new(50, update)