import machine
import neopixel
import time
import random


#notes: 
#smeni cvetowete, polzvai 0, 0, 0 za background (cherno irl)
#NEVER use full 255, 255, 255 na vsichki pixeli ednovremenno


n = 60  # Number of LEDs in your matrix
p = 15  # GPIO pin connected to Din
np = neopixel.NeoPixel(machine.Pin(p), n)

# Define the GPIO pins for the buttons
button_pins = [12, 13, 14, 26, 27]

# Initialize the button pins as pull-up inputs
for btn_pin in button_pins:
    machine.Pin(btn_pin, machine.Pin.IN, machine.Pin.PULL_UP)

def set_led_color(color):
    for x in range(n):
        np[x] = color
    np.write()

def flashled(color1, delay):
    time.sleep(1)
    set_led_color(color1)
    np.write()
    time.sleep(delay)
    set_led_color((0,0,0))
    np.write()
    time.sleep(delay)
    set_led_color(color1)
    np.write()
    time.sleep(delay)
    set_led_color((0,0,0))
    np.write()
    time.sleep(delay)
    set_led_color(color1)
    np.write()
    

def spinLed(x, y):
    for i in range(x):
            np[i] = ((255,0,255))
            time.sleep(y)
            np.write()
            if i % 2 == 0:
                np[i] = ((255,0,0))
            else:
                np[i] = ((25,25,25))
            np[7] = ((0,255,0))
            np[37] = ((0,255,0))

rainbow = [
  (126 , 1 , 0),(114 , 13 , 0),(102 , 25 , 0),(90 , 37 , 0),(78 , 49 , 0),(66 , 61 , 0),(54 , 73 , 0),(42 , 85 , 0),
  (30 , 97 , 0),(18 , 109 , 0),(6 , 121 , 0),(0 , 122 , 5),(0 , 110 , 17),(0 , 98 , 29),(0 , 86 , 41),(0 , 74 , 53),
  (0 , 62 , 65),(0 , 50 , 77),(0 , 38 , 89),(0 , 26 , 101),(0 , 14 , 113),(0 , 2 , 125),(9 , 0 , 118),(21 , 0 , 106),
  (33 , 0 , 94),(45 , 0 , 82),(57 , 0 , 70),(69 , 0 , 58),(81 , 0 , 46),(93 , 0 , 34),(105 , 0 , 22),(117 , 0 , 10),
  (126 , 1 , 0),(114 , 13 , 0),(102 , 25 , 0),(90 , 37 , 0),(78 , 49 , 0),(66 , 61 , 0),(54 , 73 , 0),(42 , 85 , 0),
  (30 , 97 , 0),(18 , 109 , 0),(6 , 121 , 0),(0 , 122 , 5),(0 , 110 , 17),(0 , 98 , 29),(0 , 86 , 41),(0 , 74 , 53),
  (0 , 62 , 65),(0 , 50 , 77),(0 , 38 , 89),(0 , 26 , 101),(0 , 14 , 113),(0 , 2 , 125),(9 , 0 , 118),(21 , 0 , 106),
  (33 , 0 , 94),(45 , 0 , 82),(57 , 0 , 70),(69 , 0 , 58),(81 , 0 , 46),(93 , 0 , 34),(105 , 0 , 22),(117 , 0 , 10)]

while True:
    # Read button states
    btn1_state = machine.Pin(12).value()
    btn2_state = machine.Pin(13).value()
    btn3_state = machine.Pin(14).value()
    btn4_state = machine.Pin(26).value()
    btn5_state = machine.Pin(27).value()
    rainbow_checker = True

    # Set LED color based on button states

    # -- RAINBOW --
    if btn1_state == 0:  # Button 1 pressed
        while rainbow_checker:
            rainbow = rainbow[-1:] + rainbow[:-1]
            for i in range(60):
                np[i] = rainbow[i]
                np.write()
            btn1_state = machine.Pin(12).value()
            if btn1_state == 0: 
                rainbow_checker = False
                set_led_color((255, 255, 255))
                time.sleep(3)
                btn1_state = 1

    # -- CLOCK --
    elif btn2_state == 0:  # Button 2 pressed
        for i in range(60):
            if i in [2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57]:
                np[i] = ((255,255,255))
            else:
                np[i] = ((255,0,255))
        np.write()

        second = 0
        hsecond = 0
        np[7] = (255,0,0)
        np.write()
        time.sleep(1)
        holding_time = 0

        while True:

            second += 1
            hsecond += 1
            
            if hsecond >= 216000:
                hsecond = hsecond // 216000

            if second % 60 == 0 and second >= 3180: #towa e samo za poslednite 7 minuti
                print("minute: " + str(second) + " aka: " + str(second // 60))
            
                
                np[((second - 3180) // 60) - 1] = (255,0,0)

                if ((second  - 3180) // 60) - 2 in [2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57]:
                    np[((second  - 3180) // 60) - 2] = ((255,255,255))
                else:
                    np[((second  - 3180) // 60) - 2]  = ((255,0,255))

                np[((hsecond- 190800) // 3600 )] = ((0,0,255)) # towa e za da ne bara chasa, toi e vinagi on top
                np.write()

            elif (second % 60 == 0):
                
                print("minute: " + str(second) + " aka: " + str(second // 60))
            
                
                np[(second // 60) - 1 + 7] = (255,0,0)

                if (second // 60) - 2  + 7 in [2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57]:
                    np[(second // 60) - 2 + 7] = ((255,255,255))
                else:
                    np[(second // 60) - 2 + 7]  = ((255,0,255))

                np[(hsecond // 3600) + 7] = ((0,0,255)) # towa e za da ne bara chasa, toi e vinagi on top
                np.write()

            if second >= 3600:
                second = second // 3600
            

            if (hsecond % 3600 == 0) and hsecond >= 190800:
                
                print("hour: " + str(hsecond) + " aka: " + str(hsecond // 36) )
                
                np[((hsecond - 190800) // 3600)] = (0,0,255)

                if ((hsecond - 190800) // 3600) - 1 in [2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57]:
                    np[((hsecond -190800) // 3600) - 1] = ((255,255,255))
                else:
                    np[((hsecond - 190800) // 3600) - 1]  = ((255,0,255))

                if second % 60 == 0:
                    np[(second // 60) - 1] = (255,0,0) #towa e za da ne ebawa minutite (i give up)
                np.write()

            if hsecond % 3600 == 0:
                
                print("hour: " + str(hsecond) + " aka: " + str(hsecond // 36) )
                
                np[(hsecond // 3600) + 7] = (0,0,255)

                if (hsecond // 3600) - 1 + 7 in [2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57]:
                    np[(hsecond // 3600) - 1 + 7] = ((255,255,255))
                else:
                    np[(hsecond // 3600) - 1 + 7]  = ((255,0,255))

                if second % 60 == 0:
                    np[(second // 60) - 1 + 7] = (255,0,0) #towa e za da ne ebawa minutite (i give up)
                np.write()

            


            #tuk zadawash kolko wreme e edna sekunda
            btn2_state = machine.Pin(13).value()
            if btn2_state == 0:
                if holding_time >= 300:
                    time.sleep (0.0005)  
                elif holding_time >= 50:
                    time.sleep (0.01) 
                elif holding_time >= 10:
                    time.sleep (0.075) 
                else:
                    time.sleep (0.1)
                holding_time += 1
            else:
                time.sleep (1)
                holding_time = 0


            print(hsecond)



        #basi shibaniq chasovnik eban
          #fr
    
    # -- ROULETTE --
    elif btn3_state == 0:  # Button 3 pressed
        for i in range(60):
            if i % 2 == 0:
                np[i] = ((255,0,0))
            else:
                np[i] = ((25,25,25))
        np[7] = ((0,255,0))
        np[37] = ((0,255,0))
        np.write()

        time.sleep(1)

        rnum = random.randint(0, 60)
        print(rnum)

        spinLed(60, 0.014)

        if(rnum > 30):
            spinLed(rnum, 0.05)
        else:
            spinLed(rnum, 0.15)
        
        if (rnum - 1) in [7, 37]:
            flashled((0,255,0), 0.1)
        if (rnum - 1) % 2 == 0:
            flashled((255,0,0), 0.1)
        if (rnum - 1) % 2 != 0:
            flashled((25,25,25), 0.1)

    # -- COLOR CHANGE --
    elif btn4_state == 0:
        set_led_color((125,255,255))
        

    elif btn5_state == 0:
        set_led_color((255,125,125))
        

    time.sleep(0.1)
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
rgb1:VDD
rgb1:DOUT
rgb1:VSS
rgb1:DIN
rgb2:VDD
rgb2:DOUT
rgb2:VSS
rgb2:DIN
rgb3:VDD
rgb3:DOUT
rgb3:VSS
rgb3:DIN
rgb4:VDD
rgb4:DOUT
rgb4:VSS
rgb4:DIN
rgb5:VDD
rgb5:DOUT
rgb5:VSS
rgb5:DIN
rgb6:VDD
rgb6:DOUT
rgb6:VSS
rgb6:DIN
rgb7:VDD
rgb7:DOUT
rgb7:VSS
rgb7:DIN
rgb8:VDD
rgb8:DOUT
rgb8:VSS
rgb8:DIN
rgb9:VDD
rgb9:DOUT
rgb9:VSS
rgb9:DIN
rgb10:VDD
rgb10:DOUT
rgb10:VSS
rgb10:DIN
rgb11:VDD
rgb11:DOUT
rgb11:VSS
rgb11:DIN
rgb12:VDD
rgb12:DOUT
rgb12:VSS
rgb12:DIN
rgb13:VDD
rgb13:DOUT
rgb13:VSS
rgb13:DIN
rgb14:VDD
rgb14:DOUT
rgb14:VSS
rgb14:DIN
rgb15:VDD
rgb15:DOUT
rgb15:VSS
rgb15:DIN
rgb16:VDD
rgb16:DOUT
rgb16:VSS
rgb16:DIN
rgb17:VDD
rgb17:DOUT
rgb17:VSS
rgb17:DIN
rgb18:VDD
rgb18:DOUT
rgb18:VSS
rgb18:DIN
rgb19:VDD
rgb19:DOUT
rgb19:VSS
rgb19:DIN
rgb20:VDD
rgb20:DOUT
rgb20:VSS
rgb20:DIN
rgb21:VDD
rgb21:DOUT
rgb21:VSS
rgb21:DIN
rgb22:VDD
rgb22:DOUT
rgb22:VSS
rgb22:DIN
rgb23:VDD
rgb23:DOUT
rgb23:VSS
rgb23:DIN
rgb24:VDD
rgb24:DOUT
rgb24:VSS
rgb24:DIN
rgb25:VDD
rgb25:DOUT
rgb25:VSS
rgb25:DIN
rgb26:VDD
rgb26:DOUT
rgb26:VSS
rgb26:DIN
rgb27:VDD
rgb27:DOUT
rgb27:VSS
rgb27:DIN
rgb28:VDD
rgb28:DOUT
rgb28:VSS
rgb28:DIN
rgb29:VDD
rgb29:DOUT
rgb29:VSS
rgb29:DIN
rgb30:VDD
rgb30:DOUT
rgb30:VSS
rgb30:DIN
rgb31:VDD
rgb31:DOUT
rgb31:VSS
rgb31:DIN
rgb32:VDD
rgb32:DOUT
rgb32:VSS
rgb32:DIN
rgb33:VDD
rgb33:DOUT
rgb33:VSS
rgb33:DIN
rgb34:VDD
rgb34:DOUT
rgb34:VSS
rgb34:DIN
rgb35:VDD
rgb35:DOUT
rgb35:VSS
rgb35:DIN
rgb36:VDD
rgb36:DOUT
rgb36:VSS
rgb36:DIN
rgb37:VDD
rgb37:DOUT
rgb37:VSS
rgb37:DIN
rgb38:VDD
rgb38:DOUT
rgb38:VSS
rgb38:DIN
rgb39:VDD
rgb39:DOUT
rgb39:VSS
rgb39:DIN
rgb40:VDD
rgb40:DOUT
rgb40:VSS
rgb40:DIN
rgb41:VDD
rgb41:DOUT
rgb41:VSS
rgb41:DIN
rgb42:VDD
rgb42:DOUT
rgb42:VSS
rgb42:DIN
rgb43:VDD
rgb43:DOUT
rgb43:VSS
rgb43:DIN
rgb44:VDD
rgb44:DOUT
rgb44:VSS
rgb44:DIN
rgb45:VDD
rgb45:DOUT
rgb45:VSS
rgb45:DIN
rgb46:VDD
rgb46:DOUT
rgb46:VSS
rgb46:DIN
rgb47:VDD
rgb47:DOUT
rgb47:VSS
rgb47:DIN
rgb48:VDD
rgb48:DOUT
rgb48:VSS
rgb48:DIN
rgb49:VDD
rgb49:DOUT
rgb49:VSS
rgb49:DIN
rgb50:VDD
rgb50:DOUT
rgb50:VSS
rgb50:DIN
rgb51:VDD
rgb51:DOUT
rgb51:VSS
rgb51:DIN
rgb52:VDD
rgb52:DOUT
rgb52:VSS
rgb52:DIN
rgb53:VDD
rgb53:DOUT
rgb53:VSS
rgb53:DIN
rgb54:VDD
rgb54:DOUT
rgb54:VSS
rgb54:DIN
rgb55:VDD
rgb55:DOUT
rgb55:VSS
rgb55:DIN
rgb56:VDD
rgb56:DOUT
rgb56:VSS
rgb56:DIN
rgb57:VDD
rgb57:DOUT
rgb57:VSS
rgb57:DIN
rgb58:VDD
rgb58:DOUT
rgb58:VSS
rgb58:DIN
rgb59:VDD
rgb59:DOUT
rgb59:VSS
rgb59:DIN
rgb60:VDD
rgb60:DOUT
rgb60:VSS
rgb60:DIN
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
btn5:1.l
btn5:2.l
btn5:1.r
btn5:2.r