#from pyray import *
import pyray 
#import ralib_sdl as pyray
#import raylib as pyray
import sys
sys.path.insert(0,"/opt/LibreLight/Xdesk/")

#pyray.set_config_flags(pyray.FLAG_WINDOW_HIGHDPI )
#pyray.set_config_flags(pyray.FLAG_MSAA_4X_HINT)
pyray.set_config_flags(pyray.FLAG_WINDOW_RESIZABLE)


CAPTION = 'RAY-DMX'
import tool.movewin as movewin

import pathlib


try:
    import memcache
    mc = memcache.Client(['127.0.0.1:11211'], debug=0)
    #data = mc.get("MODES")
except:
    mc = None


_file_path=pathlib.Path(__file__)
print("file:",_file_path)
movewin.check_is_started(CAPTION,_file_path)


win_title =CAPTION.strip().split()[-1]
store = movewin.load_all_sdl(win_title)
print(store)
POS=[10,10]
W=760
H=450
if store:
    POS=[store[-2],store[-1]]
    POS[0] += 5   #frame kompensation
    POS[1] += 29  #frame kompensation
    print(store)
    W=int(store[-4])
    H=int(store[-3])

pyray.init_window(W, H, CAPTION) #"RAY-DMX")#,10,10,10,10)
#pyray.TextureFilter(font10,1)


win_con = movewin.Control()
win_con.title = win_title
win_con.winfo()
if POS:
    win_con.move(POS[0],POS[1])
print(POS,win_con.title)
#exit()


import sys
sys.path.insert(0,"/opt/LibreLight/Xdesk/")
import tool.tk_elm as tk_elm
#import tool.sdl_elm as sdl_elm

img = "/opt/LibreLight/Xdesk/icon/scribble.png"
IMG = pyray.load_image(img)
print(pyray.set_window_icon(IMG)) 

import time
import memcache
mc = memcache.Client(['127.0.0.1:11211'], debug=0)
#x=mc.get(k)

old_x = -10
old_y = -10
start = time.time()
frame_count = 0
fps_count = 0

#a = "/usr/share/fonts/truetype/freefont/FreeMono.ttf"
#a = "/usr/share/fonts/truetype/freefont/FreeSerif.ttf"
#a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
#a = "/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf"
#a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"


k=200
a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font10l = pyray.load_font_ex(a, 10, None, 0);
a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
font10 = pyray.load_font_ex(a, 12, None, 0);
print(dir(font10))
print(font10.baseSize)
##exit()
font20 = pyray.load_font_ex(a, 20, None, 0);
a = "/usr/share/fonts/truetype/freefont/FreeMono.ttf"
a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font25 = pyray.load_font_ex(a, 25, None, 0);

pyray.TextureFilter(3)


class EVENT():
    def __init__(self):
        self.dict = {}
        self.type = 0
        self.button=10
        self.buttons=[0,0,0,0]
xevent=EVENT()

class BUTTON():
    def __init__(self,master=None,txt="<BUTTON>",pos=[10,10,20,90]):
        #self.btn = tk_elm.Button(None,pos=[390,12,20,90])
        self.btn = tk_elm.Button(master,pos=pos)
        self.btn.btn1.color    = [127,127,127,255]
        #self.btn.btn1.type = "toggle"
        #self.btn.btn2.type = "toggle"
        #self.btn.btn3.type = "toggle"
        #btn.btn1.color_on = [155,155,155,255]
        #btn.btn2.color    = [155,55,155,255]
        #btn.btn2.color_on = [155,155,155,255]
        self.btn.btn3.color    = [55,155,155,255]
        self.btn.btn3.color_on = [55,255,255,255]
        self.btn.btn2.color_on = [55,255,255,255]

        self.btn.btn1.name=txt
        #x=btn.btn1.name

    def draw(self,event=None):
        font_size = font10.baseSize
        pos=self.btn.pos
        c=[122,122,122,122] #btn.btn2.get_color()
        pyray.draw_rectangle(pos[1],pos[0],pos[3],pos[2],c)

        c=self.btn.btn1.get_color()
        pyray.draw_rectangle(pos[1]+2,pos[0]+2,pos[3]-4,pos[2]-4,c)

        c=self.btn.btn3.get_color()
        #pyray.draw_rectangle(pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2,c)
        pyray.draw_rectangle_lines_ex([pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2],1,c)

        x=self.btn.btn1.name
        pyray.draw_text_ex(font10,str(x), [pos[1]+4,pos[0]+4], font_size, 0, [0,0,0,255])#pyray.YELLOW)#[0,255,0,255]) #pyray.YELLOW)

    def event(self,x,y,mouse):
        try:
            #print("POS:",old_x,old_y,mouse,xevent.type)
            xevent.dict={"pos":[old_y,old_x],"button":1,"buttons":[0,0,0]}
            #xevent.type=3
            for i,v in enumerate(mouse):
                if i==0:
                    if v == "release":
                        xevent.type=6
                        xevent.dict["button"] = 1
                        #self.btn.btn1.val.set(0)
                    if v == "press":
                        xevent.type=5
                        xevent.dict["button"] = 1
                        #self.btn.btn1.val.set(255)
            xevent.dict["buttons"] = mouse
            #print(xevent.dict,xevent.type,xevent.button)
            self.btn.event(xevent)
        except Exception as e:
            import traceback
            print(traceback.format_exc())
            raise e

mouse_box_on = 0
mouse_box_on_pos = [0,0]
def draw_mouse_box(window,pos1,mouse=[None,None,None],color=[128,128,128],text=1):
    global mouse_box_on_pos 
    global mouse_box_on 

    if mouse[0]=="click":#"press":
        if mouse_box_on == 0:
            pos2 = pos1[:]
            mouse_box_on_pos = pos2
            mouse_box_on = 1
    else:
        mouse_box_on = 0

    if mouse[0]=="press":
        pos2 = mouse_box_on_pos[:]
        

        w=pos1[0]-pos2[0]
        h=pos1[1]-pos2[1]
        pos = pos2[:]
        #print(pos1,pos2,h,w)
        wd=1
        hd=1
        if w < 0:
            pos[0] = pos1[0]
            w*=-1
            wd=-1
        if h < 0:
            pos[1] = pos1[1]
            h*=-1
            hd=-1

        if w > 10 or h > 10:
            c=[255,255,255,255]
            pyray.draw_rectangle_lines_ex([pos[0],pos[1],w,h],1,c)
            font_size = font10l.baseSize
            pyray.draw_text_ex(font10l,str(pos1[0])+" "+str(pos1[1]), [pos1[0],pos1[1]-10], font_size, 0, pyray.WHITE)
            pyray.draw_text_ex(font10l,str(pos2[0])+" "+str(pos2[1]), [pos2[0]+5,pos2[1]+10], font_size, 0, pyray.WHITE)
            pyray.draw_text_ex(font10l,str(w), [pos2[0]+5+w/2*wd,pos2[1]], font_size, 0, pyray.WHITE)
            pyray.draw_text_ex(font10l,str(h), [pos2[0]+5,pos2[1]+h/2*hd], font_size, 0, pyray.WHITE)
            return pos1,pos2,[pos1[0]-pos2[0],pos1[1]-pos2[1]]

mouse_old=[None,None,None]

def check_area_v(v1,v2,event_v):#elm_pos,event_pos):
    if event_v < v1+1: 
        return 0
    if event_v > v2-1: 
        return 0
    return 1

def check_area(pos,event_pos):
    v2 = pos[0]+pos[2]
    x = check_area_v(pos[0],v2,event_pos[0])
    v2 = pos[1]+pos[3]
    y = check_area_v(pos[1],v2,event_pos[1])
    if x and y:
        return 1

spectrum = [[255,127]]*40
def render_spectrum(cur,x,y):
    
    pyray.draw_text_ex(font25,"SRC:{}".format(cur),[x-20,y-50], 25, 0,  pyray.VIOLET)
            
    txt="1 DMX"
    pyray.draw_text_ex(font10,txt, [x,y-20], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
    txt="255"
    pyray.draw_text_ex(font10,txt, [x+230,y-20], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
    txt="512 DMX"
    pyray.draw_text_ex(font10,txt, [x+470,y-20], font_size, 0, [0,255,0,255]) #pyray.YELLOW)

    DMX=mc.get(cur)
    spectrum.append(DMX)
    if len(spectrum) > 40:
        spectrum.pop(0)

    for i,lines in enumerate(spectrum):
        if lines:
            for j,pix in enumerate(lines):
                if type(pix) is not int:
                    pix=0
                if pix > 255:
                    pix=255
                if pix < 0:
                    pix=0
                c=[255,255,255,pix]
                #pyray.draw_pixel(x+j,y+i*6,c)
                pyray.draw_line(x+j,y+i*6,x+j,y+i*6-5,c)


def render_grid(cur,x,y):
    xi=0
    yi=0
    grid_x = x #250
    grid_y = y #60

    for i,v in enumerate(range(20)):
        # COL NUMBER -> 1 2... 20
        x2 = grid_x+i*25#+xi
        y2 = grid_y-20 #+yi

        txt=str(i+1)
        pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
        i+=1
    DMX=mc.get(cur)
    pyray.draw_text_ex(font25,"SRC:{}".format(cur),[grid_x-20,grid_y-50], 25, 0,  pyray.VIOLET)
    if DMX:
        for i,v in enumerate(DMX):
            if v:
                host_list[k][-1] +=1
            txt = str(v)
            x2 = grid_x+xi*25
            y2 = grid_y+yi*15
            try:
                pyray.draw_rectangle(x2-2, y2-2,24,13,[255,255,255,int(v)])
            except:
                pyray.draw_rectangle(x2-2, y2-2,24,13,[255,2,2,255])

            try:
                int(v)
            except:
                v=0


            if int(v) > 100:
                pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, pyray.BLACK)# pyray.VIOLET)
            else:
                pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, GREY)# pyray.VIOLET)
            xi+=1

            if xi % 20 == 0:
                txt = str(int(yi*20)+1)
                pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR

                xi = 0
                yi += 1
    txt = str(int(yi*20)+1)
    pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR

buttons={} #[]
cur = None
history = []

spectrum_btn=BUTTON(None,"SPECTRUM",[3,610,20,90])
spectrum_btn.btn.btn1.color    = pyray.YELLOW # [127,127,127,255]
spectrum_btn.btn.btn1.color_on = pyray.YELLOW # [127,127,127,255]

add=0
modes_data = {}
modes_time = time.time()

while not pyray.window_should_close():
    pyray.begin_drawing()

    pyray.clear_background(pyray.BLACK)
    pyray.Color(255,0,0,0)
    pyray.rl_enable_smooth_lines()

    try:
        if modes_time+1 < time.time():
            modes_time = time.time()
            modes_data = mc.get("MODES")
            pyray.set_window_title("RAY-DMX "+str(modes_data))
            for k in ["RESTART","PRO","EASY","EXIT"]:
                if k in str(modes_data):
                    pyray.close_window()
                    exit()

    except Exception as e:# KeyInterupt
        print("err",e)
        import traceback
        print(traceback.format_exc())
        time.sleep(1)

    font_size = font10.baseSize
    try:
        DATA=mc.get("index")#cmd)
        GREY = [122,122,122,255]
        p=0
        keys = []
        host_list = {} #"0":[]}
        k="xxx"
        if DATA is None:
            k="None"
            keys.append(k)
            host_list[k] = "" #DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
        if DATA:
            for k in DATA:
                #print(k,DATA[k])
                #print(k)
                keys.append(k)
                host_list[k] = DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
            keys.sort()

            k=keys[0]

        if cur is None:
            cur = k #k[3] #"xx123" # k
        if cur not in host_list:
            if host_list:
                cur = keys[0] #host_list[0]

        if spectrum_btn.btn.btn1.val.get():
            render_spectrum(cur,230,50)
        else:
            render_grid(cur,250,50)

        p=0
        host_list_key = list(host_list.keys())
        host_list_key.sort()

        #for k,v in host_list.items():
        for k in host_list_key:
            v=host_list[k]
            x2 = 10
            y2 = 60+p #grid_y+p
            v = str(v).replace(" ","").replace("[","").replace("]","") 
            txt = str(k)+" "+str(v)

            key = txt.split(" ")[0]
            p+=22
            if key in buttons:
                btn = buttons[key]
            else:
                btn=BUTTON(None,txt,[y2,x2,20,190])
                buttons[key] = btn
                print("ADD",key,btn)
                add=1
            btn.btn.btn1.name = txt
            btn.btn.btn1.color_on = [255,255,0,255]
            btn.btn.btn1.val.set(0)
            if cur in btn.btn.btn1.name:
                btn.btn.btn1.val.set(255)
                #btn.btn.btn1.press() #val.set(255)


        if add:
            add=0
            print()
        w=200
        h=50

        x=200
        y=200

        pyray.draw_text_ex(font25,"FPS:{}".format(fps_count),[10,5], 25, 0,  pyray.VIOLET)

        m=pyray.get_mouse_position()
        #print(m)
        if m.x != old_x or m.y != old_y:
            old_x = m.x
            old_y = m.y

        mouse=[None,None,None]
        mouse_change=0
        for i in range(3):
            ev = ""
            if pyray.is_mouse_button_released(i):
                ev = "release"
            if pyray.is_mouse_button_pressed(i):
                ev = "click" #"press"
            if ev and ev != mouse[i]:
                mouse[i] = ev
                mouse_change=1

        if mouse != mouse_old and mouse != [None,None,None]:
            #print(mouse)
            mouse_old = mouse[:]

        spectrum_btn.event(old_x,old_y,mouse_old) #abtn.btn1.name = "SPECTRUM"
        if check_area(spectrum_btn.btn.pos,[old_y,old_x]):#event_pos):
            if "release" == mouse_old[0]:
                print( spectrum_btn.btn.btn1.val.get(),mouse_old)
                if spectrum_btn.btn.btn1.val.get():
                    spectrum_btn.btn.btn1.val.set(0)
                    spectrum_btn.btn.btn1.name = "SPECTRUM"
                else:
                    spectrum_btn.btn.btn1.val.set(255)
                    spectrum_btn.btn.btn1.name = "DMX-GRID" 
        spectrum_btn.draw()
            
        for k,btn in buttons.items():
            btn.event(old_x,old_y,mouse_old)
            if "release" == mouse_old[0]:
                btn.button = 1
                if check_area(btn.btn.pos,[old_y,old_x]):#event_pos):
                    cur = k
            btn.draw()
            aapos = draw_mouse_box(None,[old_x,old_y],mouse_old,color=[128,128,128],text=1)


        
        pyray.draw_text_ex(font20,"POS:{}:{}".format(int(m.x),int(m.y)),[10,34], 20, 0,  pyray.VIOLET)

        pyray.draw_rectangle(int(old_x-10),int(old_y-1),20,2,[255,0,255,255])
        pyray.draw_rectangle(int(old_x-1),int(old_y-10),2,20,[255,0,255,255])

        pyray.end_drawing()
        time.sleep(1/11)

        for i,v in enumerate(mouse_old):
            if v == "release":
                mouse_old[i] = None
            if v == "click":
                mouse_old[i] = "press"
        #print(mouse_old)
        frame_count += 1
        if time.time()-start > 1:
            start = time.time()
            fps_count = frame_count
            frame_count = 0

    except KeyboardInterrupt as e:
        raise e
    except Exception as e:# KeyInterupt
        print("err",e)
        import traceback
        print(traceback.format_exc())
        time.sleep(1)
pyray.close_window()