#! /usr/bin/python
# -*- coding: utf-8 -*-

"""
SPDX-License-Identifier: GPL-2.0-only
(c) micha@librelight.de
"""

import sys
sys.stdout.write("\x1b]2;APCmini\x07")

import os
#sys.path.append(os.getcwd() + '/..')
sys.path.insert(0,"/opt/LibreLight/Xdesk/")
import time
import socket, struct
import random

import lib.chat as chat

if 0:
    # z.b. Windows
    # 10 MB RAM
    from interfaces.midi.lib.pygamemidi_wraper import pygamemidi
    midi = pygamemidi(out=2,inp=3)
else: 
    # 4 MB RAM , only tested on linux
    import lib.simplemidi_wraper as smidi
    device = smidi.list_device(filter="APC_MINI")
    _id = device[-1][-1]
    midi = smidi.simplemidi("/dev/snd/midiC{}D0".format(_id) ) #,inp="/dev/midi1")



cli = None


class dummyChat():
    def __init__(self):
        pass
    def send(self,*arg,**args):
        print("dummyChat",self,arg,args)

#c = chat.tcp_sender()
c = dummyChat() 
def send(msg):
    print("send",msg)
    c.send(msg)

BLACK = 0
YELLOW = 5
YELLOW_BLINK = 6
GREEN = 1
GREEN_BLINK = 2
RED = 3
RED_BLINK = 4


class MAIN():
    def __init__(self):
        self.buf = []
        self.dbg = 0
        self.blink   = -1
        self.is_open = -1
        self.midi = midi 
    def loop(self):
        release = 0
        if 0:
            r = 225
            for i in range(4):
                for i in range(r):
                    if self.dbg:print(i)
                    midi.write([144,40+i,GREEN])
                time.sleep(0.2)
                for i in range(r):
                    print(i)
                    midi.write([144,40+i,BLACK])
                time.sleep(0.2)
                for i in range(r):
                    print(i)
                    midi.write([144,40+i,RED])
                time.sleep(1.52)
            for i in range(r):
                print(i)
                midi.write([144,60+i,BLACK])
        
            time.sleep(0.5)


        last_t = time.time()
        blink = 0
        while True:
            if release:
                release = 0
                for i in range(4):
                    midi.write([144,60+i,YELLOW])
                    midi.write([144,52+i,YELLOW])
                    midi.write([144,44+i,YELLOW])
                    midi.write([144,36+i,YELLOW])

                    midi.write([144,24+i,RED])
                    midi.write([144,24+i+4,RED])


                    midi.write([144,56+i,GREEN])

                    midi.write([144,8+i,GREEN])
                    midi.write([144,12+i,GREEN])

            #midi.write([144,82,YELLOW])
            #time.sleep(.5)
            #midi.write([144,82,BLACK])

            rows = [56,48,40,32,24,16,8,0,64,48]
            midi_function = {
                    "Off": (128,144),
                    "On ":(144,160),
                    "PLY":(160,176),
                    "CC ":(176,192),
                    "PC ":(192,208),
                    "CA ":(208,223),
                    "QtrFrame":(241,242),
                    "tclock":(248,249),
            }
            # cut byte
            # x=174;((x)^(x>>4<<4))
            # int(bin(151)[-4:],2)+1
            #nibl =  x=174;((x)^(x>>4<<4))
            #nibl = int(bin(151)[-4:],2)+1
            ch = -123
            if midi.poll():
                midi_date = midi.read(1)
                #print("MIDI",midi_date)
                if 1:# midi_date[0] >= 128 midi_date[0] <= 143:
                    ch = int(bin(midi_date[0])[-4:],2)+1

                for fn,v in midi_function.items():
                    if midi_date[0] >= v[0] and midi_date[0] < v[1]:
                        FN = fn
                        break

                r_old = 0
                row = 0
                for r in rows: 
                    #print(r_old,r)
                    if r_old and midi_date[1] >= r_old and midi_date[1] < r:
                        row = midi_data[1] - r+1
                        print("jo")
                    r_old=r   

                nibl = int(bin(midi_date[1])[2:][-4:],2)+1
                _bin2 = bin(midi_date[1])
                _bin2 = _bin2[2:]
                _bin2 = _bin2.rjust(8,"0")
                _bin2 = int(_bin2[1:5],2)

                _bin = bin(midi_date[1])
                _bin = _bin[2:]
                _bin = _bin.rjust(8,"0")
                _bin = _bin[-3:] # 3 bit

                value = ""
                btn = int(midi_date[1]) #btn_row*btn_col
                if FN == "CC ":
                    _bin2 =str(int(_bin2)+1000)
                    value = midi_date[-1]
                    btn += 1000
                if FN == "On ":
                    value = 1
                    midi.write([144,midi_date[1],YELLOW])
                if FN == "Off":
                    value = 0
                    release = 1
                    midi.write([144,midi_date[1],BLACK])

                btn_row = int(_bin2)+1 
                btn_col =int(_bin,2)+1

                #print(row,"in:",FN,"ch",ch,"raw",midi_date,_bin,btn_row,btn_col,[value])
                #print([btn_row,btn_col,btn,value])
                if self.dbg:print([btn,value])

                self.buf.append([btn,value])

            if time.time()>last_t+0.5:
                last_t = time.time()
                #print("blink",blink)
                if blink:
                    blink = 0
                    midi.write([144,82,YELLOW])
                else:
                    blink = 1
                    midi.write([144,82,BLACK])

                self.is_open = midi.is_open
                self.blink = blink


if __name__ == "__main__":
    import _thread as thread

    main = MAIN()
    thread.start_new_thread(main.loop,())
    time.sleep(1)


    while 1:
        if main.buf:
            buf = main.buf[:]
            main.buf = []
            for m in buf:
                print("-> midi:",m)

        time.sleep(0.1)