#!/usr/bin/python3

import os
import time

import tkinter
tk = tkinter

import __main__ as MAIN
from lib.cprint import *

import lib.libwin as libwin


class on_focus():
    def __init__(self,name,mode):
        self.name = name
        self.mode = mode
    def cb(self,event=None):
        #print("on_focus",event,self.name,self.mode)
        try:
            e = MAIN.master.commands.elem["."]
        except:pass

        if self.mode == "Out":
            cmd="xset -display :0.0 r rate 240 20"
            #print(cmd)
            os.system(cmd)
            try:
                e["bg"] = "#aaa"
                e["activebackground"] = "#aaa"
            except:pass
        if self.mode == "In":
            cmd = "xset -display :0.0 r off"
            #print(cmd)
            os.system(cmd)
            try:
                e["bg"] = "#fff"
                e["activebackground"] = "#fff"
            except:pass

class DummyCallback():
    def __init__(self,name="name"):
        self.name = name
    def cb(self,event=None):
        cprint("DummyCallback.cb",[self.name,event])

class Window():
    def __init__(self,args): #title="title",master=0,width=100,height=100,left=None,top=None,exit=0,cb=None,resize=1):
        global MAIN #lf_nr
        self.args = {"title":"title","master":0,"width":100,"height":100,"left":None,"top":None,"exit":0,"cb":None,"resize":1}
        self.args.update(args)
        
        cprint("Window.init()",self.args["title"],color="yellow")
        #cprint("Window.init()",id(self.args),color="yellow")
        #cprint("  ",self.args,color="yellow")

        ico_path="./icon/"
        self.cb = MAIN.cb

        if self.args["master"]: 
            self.tk = tkinter.Tk()
            self.tk.protocol("WM_DELETE_WINDOW", self.close_app_win)
            self.tk.withdraw() # do not draw
            self.tk.resizable(self.args["resize"],self.args["resize"])
            self.tk.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")

            defaultFont = tkinter.font.nametofont("TkDefaultFont")
            cprint(defaultFont)
            defaultFont.configure(family="FreeSans",
                                   size=10,
                                   weight="bold")
            # MAIN MENUE
            try:
                self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"main.png"))
            except Exception as e:
                cprint(" Exception GUIWindow.__init__",e)
        else:
            # addtional WINDOW
            self.tk = tkinter.Toplevel()
            self.tk.iconify()
            #self.tk.withdraw() # do not draw
            self.tk.protocol("WM_DELETE_WINDOW", self.close_app_win)
            self.tk.resizable(self.args["resize"],self.args["resize"])
            
            try:
                if "COLORPICKER" in self.args["title"]:
                    self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"picker.png"))
                elif "ENCODER" in self.args["title"]:
                    self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"enc.png"))
                elif "EXEC" in self.args["title"]:
                    self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"exec.png"))
                elif "FX" in self.args["title"]:
                    self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"fx.png"))
                else:
                    self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"scribble.png"))
            except Exception as e:
                cprint(" Exception on load window icon",self.args["title"])
                cprint(" Exception:",e)
            #time.sleep(3)
            self.tk.deiconify()



        self.tk["bg"] = "black"
        self.tk.bind("<Button>",self.callback)
        self.tk.bind("<Key>",self.callback)
        self.tk.bind("<KeyRelease>",self.callback)
        self.tk.bind("<FocusIn>", on_focus(self.args["title"],"In").cb)
        self.tk.bind("<FocusOut>", on_focus(self.args["title"],"Out").cb)

        self.tk.title(""+str(self.args["title"])+" "+str(MAIN.lf_nr)+":"+str(MAIN.rnd_id))
        MAIN.lf_nr+=1
        #self.tk.geometry("270x600+0+65")
        geo ="{}x{}".format(self.args["width"],self.args["height"])
        if self.args["left"] is not None:
            geo += "+{}".format(self.args["left"])
            if self.args["top"] is not None:
                geo += "+{}".format(self.args["top"])

        #self._event_clear = Xevent(fix=0,elem=None,attr="CLEAR",data=self,mode="ROOT").cb
        self.tk.geometry(geo)
        self.show()

    def update_idle_task(self):
        if MAIN.INIT_OK:
            tkinter.Tk.update_idletasks(MAIN.gui_menu_gui.tk)

    def close_app_win(self,event=None):
        cprint("close_app_win",event,self.args["title"],color="red")
        cprint("  ",self.title)
        cprint("  ",self.args)

        if self.args["title"] == "MAIN":
            MAIN.save_show()
            self.tk.destroy()
        try:
            self.tk.destroy()
        except Exception as e:
            cprint("close_app_win exc",e,color="red")

    def title(self,title=None):
        if title is None:
            return self.tk.title()
        else:
            #return self.tk.title(title)
            self.args["title"] = title
            return self.tk.title(""+str(self.args["title"])+" "+str(MAIN.lf_nr)+":"+str(MAIN.rnd_id))
    def show(self):
        self.tk.deiconify()
        pass
    def mainloop(self):
        #save_window_position_loop() #like autosave
        try:
            self.tk.mainloop()
        finally:
            self.tk.quit()
            cmd="xset -display :0.0 r rate 240 15"
            #print(cmd)
            os.system(cmd)

    def callback(self,event,data={}):#value=255):
        #global MAIN._global_short_key
        sstart = time.time()
        #time.sleep(0.1)
        if not MAIN._global_short_key:
            return 1

        #global MAIN #_shift_key
        #cprint("<GUI>",event,color="yellow")
        value = 255
        if "Release" in str(event.type) or str(event.type) == '5' or str(event.type) == '3':
            value = 0
        cprint("<GUI>",event.state,data,value,[event.type,event.keysym],color="yellow")
        #print(event)
        if "state" in dir(event) and "keysym" in dir(event):
            #print([event.state,event.keysym,event.type])
            if event.state == 4  and str(2) == str(event.type): # strg + s
                if str(event.keysym) == "s":
                    MAIN.save_show()

                    e = MAIN.master.setup_elem["SAVE\nSHOW"]
                    b = MAIN.BLINKI(e)
                    b.blink()
                if str(event.keysym) == "c":
                    if MAIN.save_show():
                        MAIN.LOAD_SHOW_AND_RESTART("").cb(force=1)

                return

        if "keysym" in dir(event):
            if "Escape" == event.keysym:
                MAIN.FIXTURES.clear()
                MAIN.modes.val("ESC",1)
                MAIN.master.refresh_fix()
            elif event.keysym in ["Shift_L","Shift_R"]:
                #cprint(event.type)
                if "KeyRelease" in str(event.type) or str(event.type) in ["3"]:
                    MAIN._shift_key = 0
                else:
                    MAIN._shift_key = 1
                #cprint("SHIFT_KEY",_shift_key,"??????????")
                #cprint("SHIFT_KEY",_shift_key,"??????????")
                #global MAIN #_ENCODER_WINDOW
                try:
                    if MAIN._shift_key:
                        MAIN._ENCODER_WINDOW.title("SHIFT/FINE ")
                    else:
                        MAIN._ENCODER_WINDOW.title("ENCODER") 
                except Exception as e:
                    cprint("exc9800",e)
                    #raise e

            elif event.keysym in "ebfclrmsRx" and value: 
                if "e" == event.keysym:
                    MAIN.modes.val("EDIT",1)
                elif "b" == event.keysym:
                    MAIN.modes.val("BLIND",1)
                elif "f" == event.keysym:
                    MAIN.modes.val("FLASH",1)
                elif "c" == event.keysym:
                    MAIN.modes.val("CFG-BTN",1)
                elif "l" == event.keysym:
                    MAIN.modes.val("LABEL",1)
                elif "r" == event.keysym:
                    MAIN.modes.val("REC",1)
                elif "R" == event.keysym:
                    MAIN.modes.val("REC-FX",1)
                elif "x" == event.keysym:
                    MAIN.modes.val("REC-FX",1)
                elif "m" == event.keysym:
                    x=MAIN.modes.val("MOVE",1)
                    if not x:
                        MAIN.PRESETS.clear_move()
                elif "s" == event.keysym:
                    MAIN.modes.val("SELECT",1)
            elif event.keysym in ["F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12"]:
                nr = int( event.keysym[1:]) # F:1-12
                nr = nr-1+81  
                cprint("F-KEY",value,nr,event.keysym)
                #print(event)
                MAIN.master.preset_go(nr-1,xfade=None,val=value)
            elif event.keysym in ["1","2","3","4","5","6","7","8","9","0"]:
                nr = int( event.keysym)
                if nr == 0:
                    nr = 10
                nr = nr-1+161  
                cprint("NUM-KEY",value,nr)
                MAIN.master.preset_go(nr-1,xfade=None,val=value)
            elif "numbersign" == event.keysym and value: # is char "#"
                cprint("numbersign !!")
                MAIN.save_show()

                for e in MAIN.master.setup_cmd:
                    cprint(e)
                e =  MAIN.master.setup_elem["SAVE\nSHOW"]
                cprint(e)
                b = MAIN.BLINKI(e)
                b.blink()
                #e = Xevent(fix=0,elem=None,attr="SAVE\nSHOW",mode="SETUP")
                #e.cb(event=event)
            elif "End" == event.keysym:
                MAIN.FIXTURES.fx_off("all")
                CONSOLE.fx_off("all")
                CONSOLE.flash_off("all")
            elif "Delete" == event.keysym:
                #MAIN.PRESETS.delete(nr)
                if value:
                    MAIN.modes.val("DEL",1)

        #cprint("oipo "*10,round(int(time.time()-sstart)*1000,2))
 

class PopupList():
    def __init__(self,name="<NAME>",master=0,width=400,height=450,exit=1,left=MAIN._POS_LEFT+400,top=MAIN._POS_TOP+100,cb=None,bg="black"):
        self.name = name
        self.frame = None
        self.bg=bg
        self.cb = cb
        if cb is None: 
            cb = DummyCallback #("load_show_list.cb")
        #w = Window(self.name,master=master,width=width,height=height,exit=exit,left=left,top=top,cb=cb)
        args = {"title":self.name,"master":master,"width":width,"height":height,"exit":exit,"left":left,"top":top,"cb":cb}
        w = Window(args)
        self.w = w
        w.show()
    def sframe(self,line1="<line1>",line2="<line2>",data=[]):

        xframe=self.w.tk
        if self.bg:
            xframe.configure(bg=self.bg)
            self.w.tk.configure(bg=self.bg)
        c=0
        r=0

        b = tk.Label(xframe,bg="grey",text=line1,anchor="w")
        b.pack(side="top",expand=0,fill="x" ) 


        b = tk.Label(xframe,bg="grey",text=line2,anchor="w")
        b.pack(side="top",expand=0,fill="x" ) 

        b = tk.Label(xframe,bg="black",fg="black",text="")
        if self.bg:
            b.configure(fg=self.bg)
            b.configure(bg=self.bg)
        b.pack(side="top") 

        b = tk.Entry(xframe,width=10,text="")#,anchor="w")
        b.pack(side="top",expand=0,fill="x") 
        b["state"] = "readonly"
        b.focus()


        #frame = tk.Frame(xframe,heigh=2800)
        #frame.pack(fill=tk.BOTH,expand=1, side=tk.TOP)

        frame = MAIN.ScrollFrame(xframe,width=300,height=500,bd=1,bg=self.bg)
        #frame.pack(side="left") #fill=tk.BOTH,expand=1, side=tk.TOP) 
        #self.frame = frame
        self.w.tk.state(newstate='normal')
        self.w.tk.attributes('-topmost',True)
        return frame

def showwarning(msg="<ERROR>",title="<TITLE>"):
    cprint("showwarning","MSG:",msg,"tilte:",title)

    if IS_GUI:
        _main = tkinter.Tk()
        defaultFont = tkinter.font.nametofont("TkDefaultFont")

        cprint("showwarning",defaultFont)

    if IS_GUI:
        defaultFont.configure(family="FreeSans",
                               size=10,
                               weight="normal")
        
        geo ="{}x{}".format(20,20)
        _main.geometry(geo)
        def _quit():
            time.sleep(1/10)
            _main.quit()
        thread.start_new_thread(_main.mainloop,())


        r=tkinter.messagebox.showwarning(message=msg,title=title,parent=None)