import mcrfpy

scene = mcrfpy.Scene("gui")
mcrfpy.current_scene = scene

tick_id = 0

class Draggable(mcrfpy.Frame):
    """a frame GUI that can be dragged around the screen"""
    def __init__(self, pos=(0, 0), size=(400, 150)):
        global tick_id
        super().__init__(pos, size, fill_color = (64, 64, 255), outline=2, opacity=0.9)

        # close button
        close_btn = mcrfpy.Frame((size[0]-32-5, 5), (32, 32), children=[mcrfpy.Caption((8, 0), text="X", font=mcrfpy.default_font, font_size=24)])
        self.children.append(close_btn)
        close_btn.on_click = self.close

        # minimize button
        self.minimize_btn = mcrfpy.Frame((size[0]-74, 5), (32, 32), children=[mcrfpy.Caption((8, 0), text="-", font=mcrfpy.default_font, font_size=24)])
        self.children.append(self.minimize_btn)
        self.minimize_btn.on_click = self.minmax
        self.minimized = False

        # grab / title bar
        grab_bar = mcrfpy.Frame((5,5), (size[0]-84, 32), fill_color=(32, 32, 128))
        grab_bar.on_click = self.toggle_move
        self.dragging = False
        self.drag_start_pos = None
        self.children.append(grab_bar)

        # stopwatch
        self.tick = mcrfpy.Timer(f"tick{tick_id}", self.tick, 1000, start=True)
        tick_id += 1
        self.clock = mcrfpy.Caption((50, 42), font=mcrfpy.default_font, text="00:00", font_size=48)
        self.time = 0
        self.children.append(self.clock)

    def close(self, *args):
        self.parent = None
        self.tick.stop()

    def minmax(self, pos, btn, event):
        if event != mcrfpy.InputState.PRESSED: return
        self.minimized = not self.minimized
        self.minimize_btn.children[0].text = "+" if self.minimized else "-"
        self.clock.visible = not self.minimized
        self.h = 40 if self.minimized else 150

    def toggle_move(self, *args):
        if not self.dragging and args[-1] == mcrfpy.InputState.PRESSED:
            self.dragging = True
            self.drag_start_pos = args[0]
            self.on_move = self.update_pos
        else:
            self.dragging = False
            self.on_move = None

    def update_pos(self, *args):
        cursor_pos = args[0]
        self.pos += (cursor_pos - self.drag_start_pos)
        self.drag_start_pos = cursor_pos

    def tick(self, *args):
        self.time += 1
        self.clock.text = f"{str(self.time//60).zfill(2)}:{str(self.time%60).zfill(2)}"

def spawn(*args):
    if args[-1] != mcrfpy.InputState.PRESSED: return
    scene.children.append(Draggable((50, 100)))

add_btn = mcrfpy.Frame((5, 5), (32, 32), fill_color = (64, 12, 12), children=[mcrfpy.Caption((8, 0), text="+", font=mcrfpy.default_font, font_size=24)])
add_btn.on_click = spawn
add_btn.parent = scene
