#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"

// Definir GPIO para los LEDs y los botones
const uint LP[] = {15, 14, 13, 11, 10, 9, 8, 7};
#define BOTON_PURPLE 2
#define BOTON_AMARILLO 12

int secuencia_actual = 0;

void Secuencia0() {
    for (int i = 0; i < 8; i++) {
        gpio_put(LP[i], i % 2);  // Alternar encendido y apagado
    }
    sleep_ms(500);

    // Chequear si el botón amarillo está presionado
    if (!gpio_get(BOTON_AMARILLO)) {
        while (!gpio_get(BOTON_AMARILLO)) {
            for (int i = 0; i < 8; i++) {
                gpio_put(LP[i], i % 2);
            }
        }
    }

    for (int i = 0; i < 8; i++) {
        gpio_put(LP[i], (i + 1) % 2);  // Invertir el patrón de LEDs
    }
    sleep_ms(500);

    if (!gpio_get(BOTON_AMARILLO)) {
        while (!gpio_get(BOTON_AMARILLO)) {
            for (int i = 0; i < 8; i++) {
                gpio_put(LP[i], (i + 1) % 2);
            }
        }
    }
}
// Secuencia 1: Enciende un LED a la vez, de 1 a 8
void Secuencia1(){
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            gpio_put(LP[j], (i == j) ? 1 : 0); // Enciende solo el LED correspondiente y apaga los demás
        }
            // Chequear si el botón amarillo está presionado
        if (!gpio_get(BOTON_AMARILLO)) {
          while (!gpio_get(BOTON_AMARILLO)) {
            sleep_ms(100);
          }
        }
        sleep_ms(300); // Pausa entre cada cambio de LED
    }

}
// Secuencia 2: Enciende LEDs desde los extremos hacia el centro
void Secuencia2(){
    int pares = 4; // Cantidad de pares de LEDs a encender

    // Ir desde los extremos hacia el centro
    for (int i = 0; i < pares; i++) {
        for (int j = 0; j < 8; j++) {
            gpio_put(LP[j], (j == i || j == 7 - i) ? 1 : 0); // Enciende los LEDs en pares desde los extremos
        }
                    // Chequear si el botón amarillo está presionado
        if (!gpio_get(BOTON_AMARILLO)) {
          while (!gpio_get(BOTON_AMARILLO)) {
            sleep_ms(100);
          }
        }
        sleep_ms(100); // Pausa entre cada paso de la secuencia
    }

    // Ir desde el centro de vuelta a los extremos
    for (int i = pares - 2; i >= 0; i--) { // pares - 2 para empezar desde LEDs 3 y 6
        for (int j = 0; j < 8; j++) {
            gpio_put(LP[j], (j == i || j == 7 - i) ? 1 : 0); // Enciende los LEDs en pares de vuelta hacia los extremos
        }
                    // Chequear si el botón amarillo está presionado
        if (!gpio_get(BOTON_AMARILLO)) {
          while (!gpio_get(BOTON_AMARILLO)) {
            sleep_ms(100);
          }
        }
        sleep_ms(100); // Pausa entre cada paso de la secuencia
    }
}


int main() {
    stdio_init_all();

    // Inicializar los pines de los LEDs como salida
    for (int i = 0; i < 8; i++) {
        gpio_init(LP[i]);
        gpio_set_dir(LP[i], GPIO_OUT);
    }

    // Inicializar los botones como entrada
    gpio_init(BOTON_PURPLE);
    gpio_set_dir(BOTON_PURPLE, GPIO_IN);
    gpio_pull_up(BOTON_PURPLE);

    gpio_init(BOTON_AMARILLO);
    gpio_set_dir(BOTON_AMARILLO, GPIO_IN);
    gpio_pull_up(BOTON_AMARILLO);

    while (true) {
        if (gpio_get(BOTON_PURPLE) == 0) {
            secuencia_actual = (secuencia_actual + 1) % 3;  // Cambia entre 0, 1 y 2
            printf("CAMBIANDO A SECUENCIA NUMERO %d\n", secuencia_actual);
            sleep_ms(100);
        }

        switch (secuencia_actual) {
            case 0:
                Secuencia0();
                break;
            case 1:
                Secuencia1();
                break;
            case 2:
                Secuencia2();
                break;
        }
    }
}