# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries
# SPDX-License-Identifier: MIT

"""
************************************************************
                    IMPORTING LIBRARIES
************************************************************
"""
import os
import board
import neopixel
import time
from adafruit_debouncer import Button
from digitalio import DigitalInOut, Direction, Pull
import simpleio

#Import all Adafruit LED Animations
from adafruit_led_animation.helper import PixelSubset
from adafruit_led_animation.animation.solid import Solid
from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.rainbowcomet import RainbowComet
from adafruit_led_animation.animation.rainbow import Rainbow
from adafruit_led_animation.animation.sparklepulse import SparklePulse
from adafruit_led_animation.animation.pulse import Pulse
from adafruit_led_animation.color import PURPLE, AMBER, JADE, RED, CYAN, BLUE, TEAL, ORANGE, YELLOW, AQUA, GREEN, MAGENTA, PINK, GOLD, WHITE
"""
************************************************************
                    ESTABLISH COLORS
************************************************************
"""
#Import Adafruit predetermined colors


COLORS = [RED, YELLOW, AMBER, ORANGE, GREEN, JADE, TEAL, AQUA, CYAN, BLUE, PURPLE, MAGENTA, PINK, GOLD, WHITE]
G1_COLOR = 0
G2_COLOR = 1

"""
************************************************************
                    RP2040 BOARD NEOPIXEL POWER
************************************************************
"""
# enable external power pin
# provides power to the external components
external_power = DigitalInOut(board.EXTERNAL_POWER)
external_power.direction = Direction.OUTPUT
external_power.value = True

# Set pin for external neopixels
pixel_pin = board.EXTERNAL_NEOPIXELS
# Set number of pixels on the strip
pixel_num = 19
pixel_brightness = 0.5
pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=pixel_brightness, auto_write=True)


# external button
pin = DigitalInOut(board.EXTERNAL_BUTTON)
pin.direction = Direction.INPUT
pin.pull = Pull.UP
switch = Button(pin, long_duration_ms = 1000)
switch_state = False
"""
************************************************************
                    LED GROUPS
************************************************************
"""
G1 = PixelSubset(pixels, 0, 9)
G2 = PixelSubset(pixels, 9, 19)
"""
**********************************************************************************************************************
                                                    PROGRAM START
**********************************************************************************************************************
"""
MODE = 0
STARTUP = 0

while True:
# Initialize all animations once in the beginning
    if STARTUP == 0:

        solid = Solid(pixels, color=COLORS[G1_COLOR])
        Comet1 = Comet(G1, speed=0.05, color=COLORS[G1_COLOR], tail_length=18, bounce=True)
        Comet2 = Comet(G2, speed=0.07, color=COLORS[G2_COLOR], tail_length=18, bounce=True)
        sparkle = SparklePulse(pixels, speed=0.08, period = 0.02, color=COLORS[G1_COLOR])
        pulse = Pulse(pixels, speed=0.01, color=COLORS[G1_COLOR], period=3)
        Dpulse1 = Pulse(G1, speed=0.01, color=COLORS[G1_COLOR], period=3.2)
        Dpulse2 = Pulse(G2, speed=0.01, color=COLORS[G2_COLOR], period=5.4)
        rainbow = Rainbow(pixels, speed=0.1, period=2)
        rainbow_comet = RainbowComet(pixels, speed=0.08, tail_length=30, bounce=True)

        STARTUP = 1

    switch.update()
# -----------SOLID MODE-----------------
    if MODE == 0:
        print(MODE)
        solid.animate()

        if switch.short_count == 1:
            MODE = 1
        elif switch.long_press:
            MODE = 10

# -----------COMET MODE--------------------
    elif MODE == 1:
        print(STARTUP)
        Comet1.animate()
        Comet2.animate()

        #Switch to next mode
        if switch.short_count == 1:
            MODE = 2
        elif switch.long_press:
            MODE = 10

# -----------SPARKLE MODE-----------------
    elif MODE == 2:
        print(MODE)
        sparkle.animate()

        if switch.short_count == 1:
            MODE = 3
        elif switch.long_press:
            MODE = 10

# -----------PULSE MODE-------------------
    elif MODE == 3:
        print(MODE)
        pulse.animate()

        if switch.short_count == 1:
            MODE = 4
        elif switch.long_press:
            MODE = 10
# -----------DUAL PULSE MODE--------------
    elif MODE == 4:
        print(MODE)
        Dpulse1.animate()
        Dpulse2.animate()

        if switch.short_count == 1:
            MODE = 5
        elif switch.long_press:
            MODE = 10
# -----------RAINBOW MODE-----------------
    elif MODE == 5:
        print(MODE)
        rainbow.animate()

        if switch.short_count == 1:
            MODE = 6
        elif switch.long_press:
            MODE = 10
# -----------RAINBOW COMET MODE-----------
    elif MODE == 6:
        print(MODE)
        rainbow_comet.animate()

        if switch.short_count == 1:
            MODE = 0
        elif switch.long_press:
            MODE = 10

    #Switch to Color Changing Mode
    elif MODE == 10:
        #print(MODE)
        if switch.short_count == 1:
            G1_COLOR = (G1_COLOR + 1) % 15
            G1.fill(COLORS[G1_COLOR])
            pixels.show()
            print(G1_COLOR)
            STARTUP = 0
        elif switch.short_count == 2:
            MODE = 11
        elif switch.long_press:
            pixels.show()
            MODE = 0

    elif MODE == 11:
        if switch.short_count == 1:
            G2_COLOR = (G2_COLOR + 1) % 15
            G2.fill(COLORS[G2_COLOR])
            pixels.show()
            print(G1_COLOR)
            STARTUP = 0
        elif switch.short_count == 2:
            MODE = 10
        elif switch.long_press:
            pixels.show()
            MODE = 0