import hardware
import random
import math
import time

class UIElement():
    def __init__(self,origin=(0,0)):
        self.children = []
        self.origin = origin
        self.ctx = hardware.get_ctx()
    
    def draw(self, offset=(0,0)):
        pos = (self.origin[0]+offset[0],self.origin[1]+offset[1])

        self._draw(pos)
        for child in self.children:
            child.draw(pos)

    def _draw(self,pos):
        #print(pos)
        pass

    def add(self, child):
        self.children.append(child)

class Text(UIElement):
    def __init__(self,s="foo"):
        self.s = s
        super().__init__()

    def _draw(self, pos):
        self.ctx.text_align = self.ctx.CENTER
        self.ctx.text_baseline = self.ctx.MIDDLE
        self.ctx.rgb(1,1,1).move_to(pos[0],pos[1]).text(self.s)

class Icon(UIElement):
    def __init__(self,label="?", size=60):
        self.bg_r = random.random()
        self.bg_g = random.random()
        self.bg_b = random.random()
        self.fg = 0
        self.label=label
        self.size = size
        self.has_highlight = False
        super().__init__()

    def _draw(self,pos):
        x = int(pos[0])
        y = int(pos[1])
        width = 55
        height = 40
        self.ctx.text_align = self.ctx.CENTER
        self.ctx.text_baseline = self.ctx.MIDDLE

        if self.has_highlight:
            hs = self.size+5;
            self.ctx.move_to(x,y-hs/2).rgb(1,1,1).round_rectangle(
                x-hs/2,
                y-hs/2,
                hs,hs,hs//2
            ).fill()
        self.ctx.move_to(x,y-self.size/2).rgb(self.bg_r,self.bg_g,self.bg_b).round_rectangle(
            x-self.size/2,
            y-self.size/2,
            self.size,self.size,self.size//2
        ).fill()
        self.ctx.rgb(1,1,1).move_to(x,y).text(self.label)
class GroupStackedVertical(UIElement):
    pass

        
class GroupRing(UIElement):
    def __init__(self,r=100,origin=(0,0),element_center=None):
        self.r = r
        self.angle_offset = 0
        self.element_center=element_center
        super().__init__(origin)

    def draw(self, offset=(0,0)):
        pos = (self.origin[0]+offset[0],self.origin[1]+offset[1])
        self._draw(pos)
        for index in range(len(self.children)):
            child = self.children[index]
            angle = 2*math.pi/len(self.children)*index+self.angle_offset
            x = math.sin(angle)*self.r+pos[0]
            y = -math.cos(angle)*self.r+pos[1]
            child.draw(offset=(x,y))

    def _draw(self,pos):
        if self.element_center:
            self.element_center._draw(pos)

def test():
    group = UIElement((10,0))
    group.add(UIElement((10,10)))
    group.add(UIElement((20,20)))
    #group.draw()

    ring = GroupRing(r=80)
    ctx = hardware.get_ctx()
    for i in range(12):
        ring.add(Icon(str(i)))
        hardware.display_update()
    while True:
        ctx.rectangle(0,0,240,240).rgb(1,1,1).fill()
        ring.draw()
        hardware.display_update()
        ring.angle_offset+=2*math.pi/60
        time.sleep(0.01)
        hardware.display_update()

#test()