// Definición de pines
const int LED_ROJO = 4;
const int LED_MORADO = 15;
const int LED_AMARILLO = 5;
const int LED_VERDE = 18;
const int BOTON = 13;

// Variables de control
bool botonPresionado = false;
unsigned long tiempoInicio = 0;

unsigned long intervalo = 0;

void setup() {
  // Configurar los pines como salida
  pinMode(LED_ROJO, OUTPUT);
  pinMode(LED_MORADO, OUTPUT);
  pinMode(LED_AMARILLO, OUTPUT);
  pinMode(LED_VERDE, OUTPUT);

  // Configurar el pin del botón como entrada
  pinMode(BOTON, INPUT_PULLUP);
}

void loop() {
  unsigned long tiempoActual = millis();

  // Comprobar si el botón ha sido presionado
  if (digitalRead(BOTON) == LOW) {
    if (!botonPresionado) {
      // Botón presionado por primera vez
      tiempoInicio = tiempoActual;
      botonPresionado = true;

      // Apagar todos los LEDs y encender el LED morado
      digitalWrite(LED_ROJO, LOW);
      digitalWrite(LED_AMARILLO, LOW);
      digitalWrite(LED_VERDE, LOW);
      digitalWrite(LED_MORADO, HIGH);
    } else {
      // Botón ya estaba presionado, comprobar si han pasado 10 segundos
      if (tiempoActual - tiempoInicio >= 10000) {
        botonPresionado = false;
      }
    }
  } else {
    botonPresionado = false;
  }

  // Realizar el ciclo de encendido y apagado de los LEDs
  if (!botonPresionado) {
    // Encender el LED rojo por 2 segundos
    intervalo = tiempoActual - tiempoInicio;
    if (intervalo >= 0 && intervalo < 2000) {
      digitalWrite(LED_ROJO, HIGH);
      digitalWrite(LED_AMARILLO, LOW);
      digitalWrite(LED_VERDE, LOW);
      digitalWrite(LED_MORADO, LOW);
    }

    // Apagar el LED rojo y encender el LED amarillo por 1 segundo
    else if (intervalo >= 2000 && intervalo < 3000) {
      digitalWrite(LED_ROJO, LOW);
      digitalWrite(LED_AMARILLO, HIGH);
      digitalWrite(LED_VERDE, LOW);
      digitalWrite(LED_MORADO, LOW);
    }

    // Apagar el LED amarillo y encender el LED verde por 4 segundos
    else if (intervalo >= 3000 && intervalo < 7000) {
      digitalWrite(LED_ROJO, LOW);
      digitalWrite(LED_AMARILLO, LOW);
      digitalWrite(LED_VERDE, HIGH);
      digitalWrite(LED_MORADO, LOW);
    }

    // Volver al inicio
    else if (intervalo >= 7000) {
      tiempoInicio = tiempoActual;
    }
  }
}