#include <HardwareSerial.h>
#include <DFRobotDFPlayerMini.h>

// =====================================
// DFPLAYER
// =====================================

HardwareSerial mySerial(1);
DFRobotDFPlayerMini player;

// =====================================
// PINES
// =====================================

#define DF_RX 16
#define DF_TX 17

#define ENCODER_CLK 4
#define ENCODER_DT 5
#define ENCODER_SW 6

// =====================================
// VARIABLES
// =====================================

int volume = 15;
int currentTrack = 1;
const int totalTracks = 8;

bool isPaused = false;

int lastCLK;

unsigned long buttonPressTime = 0;
bool buttonHeld = false;

// =====================================
// SETUP
// =====================================

void setup() {

  Serial.begin(115200);

  // Encoder
  pinMode(ENCODER_CLK, INPUT);
  pinMode(ENCODER_DT, INPUT);
  pinMode(ENCODER_SW, INPUT_PULLUP);

  lastCLK = digitalRead(ENCODER_CLK);

  // DFPlayer UART
  mySerial.begin(9600, SERIAL_8N1, DF_RX, DF_TX);

  // Iniciar DFPlayer
  if (!player.begin(mySerial)) {

    Serial.println("Error iniciando DFPlayer");

    while (true);
  }

  Serial.println("DFPlayer iniciado");

  // Volumen inicial
  player.volume(volume);

  delay(500);

  // Reproducir primera canción
  player.play(currentTrack);

  Serial.println("Reproduciendo song1");
}

// =====================================
// LOOP
// =====================================

void loop() {

  handleEncoder();
  handleButton();
}

// =====================================
// CONTROL DE VOLUMEN
// =====================================

void handleEncoder() {

  int currentCLK = digitalRead(ENCODER_CLK);

  if (currentCLK != lastCLK && currentCLK == HIGH) {

    // Girando derecha
    if (digitalRead(ENCODER_DT) != currentCLK) {

      volume++;

      if (volume > 30) {
        volume = 30;
      }

      player.volume(volume);

      Serial.print("Volumen: ");
      Serial.println(volume);
    }

    // Girando izquierda
    else {

      volume--;

      if (volume < 0) {
        volume = 0;
      }

      player.volume(volume);

      Serial.print("Volumen: ");
      Serial.println(volume);
    }

    delay(5);
  }

  lastCLK = currentCLK;
}

// =====================================
// BOTON ENCODER
// =====================================

void handleButton() {

  // Botón presionado
  if (digitalRead(ENCODER_SW) == LOW) {

    // Guardar tiempo inicial
    if (buttonPressTime == 0) {
      buttonPressTime = millis();
    }

    // Mantener presionado -> cambiar canción
    if ((millis() - buttonPressTime > 1000) && !buttonHeld) {

      buttonHeld = true;

      currentTrack++;

      if (currentTrack > totalTracks) {
        currentTrack = 1;
      }

      player.play(currentTrack);

      isPaused = false;

      Serial.print("Nueva canción: ");
      Serial.println(currentTrack);

      delay(300);
    }
  }

  // Botón soltado
  else {

    // Click corto -> Play/Pause
    if (buttonPressTime > 0 && !buttonHeld) {

      if (isPaused) {

        player.start();

        Serial.println("PLAY");

        isPaused = false;
      }

      else {

        player.pause();

        Serial.println("PAUSE");

        isPaused = true;
      }

      delay(200);
    }

    // Reset variables
    buttonPressTime = 0;
    buttonHeld = false;
  }
}
