import tkinter as tk
import tkinter.filedialog

from PIL import Image, ImageOps, ImageTk

import lumen_profiler


class GuiApp:
    def __init__(self):
        self.tkroot = tk.Tk()
        self.lp = lumen_profiler.LumenProfiler()

    def make_window(self):
        self.tkroot.title("Lumen Profiler")
        self.tkroot.geometry("800x600")
        self.top_frame = tk.Frame(self.tkroot)
        self.top_frame.pack(fill=tk.X)
        self.file_button = tk.Button(
            self.top_frame, text="映像ファイルを開く", command=self.open_movie
        )
        self.file_button.pack(side=tk.LEFT)
        self.file_text = tk.Label(self.top_frame, text="no movie")
        self.file_text.pack(side=tk.LEFT, fill=tk.X)
        self.canvas = tk.Canvas(self.tkroot)
        self.canvas.pack(fill=tk.BOTH, expand=True)
        self.time_slider = tk.Scale(
            self.tkroot,
            from_=0,
            to=0,
            orient=tk.HORIZONTAL,
            command=self.on_time_slider_change,
        )
        self.time_slider.pack(fill=tk.X)

        self.tkroot.mainloop()

    def open_movie(self):
        filename = tk.filedialog.askopenfilename(filetypes=[("mp4", "*.mp4")])
        if filename == "":  # cancel
            return
        self.lp.load_movie(filename)
        self.file_text.config(text=filename)
        self.time_slider.set(0)
        self.time_slider.config(to=self.lp.frame_count - 1)
        self.show_image(self.lp.frames[0])

    def on_time_slider_change(self, event):
        rid = self.time_slider.get()
        self.show_image(self.lp.frames[rid])

    def show_image(self, img):
        pil = Image.fromarray(self.lp.bgr2rgb(img))
        pil = ImageOps.pad(pil, (self.canvas.winfo_width(), self.canvas.winfo_height()))
        self.disp = ImageTk.PhotoImage(pil)
        # self.canvas.delete("all")
        self.canvas.create_image(0, 0, image=self.disp, anchor=tk.NW)


# main
if __name__ == "__main__":
    app = GuiApp()
    app.make_window()
