#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h> // For DFPlayer Mini communication
#include <DFRobotDFPlayerMini.h>

// OLED display dimensions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// Create OLED display object
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// DFPlayer Mini connections
SoftwareSerial mySoftwareSerial(0, 2); // Define RX on pin 13 and TX on pin 15
DFRobotDFPlayerMini myDFPlayer;

void setup() {
  // Initialize Serial Monitor
  Serial.begin(115200);
  mySoftwareSerial.begin(9600); // DFPlayer Mini communication

  // Initialize OLED
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED initialization failed!");
    while (true);
  }

  // Clear and initialize OLED
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Initializing...");
  display.display();

  // Initialize DFPlayer Mini
  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println("DFPlayer initialization failed!");
    display.println("DFPlayer Error");
    display.display();
    while (true);
  }

  myDFPlayer.volume(20); // Set initial volume
  display.println("DFPlayer Ready");
  display.println("Volume: 20");
  display.display();

  // Print instructions to Serial Monitor
  Serial.println("Commands:");
  Serial.println("play <n>, vol <n>, pause, resume, next, prev, stop");
}

void loop() {
  if (Serial.available()) {
    String command = Serial.readStringUntil('\n');
    command.trim();
    command.toLowerCase();

    // Clear OLED display for new messages
    display.clearDisplay();
    display.setCursor(0, 0);

    if (command.startsWith("play ")) {
      int track = command.substring(5).toInt();
      if (track > 0) {
        myDFPlayer.play(track); // Play the track
        Serial.println("Playing track " + String(track));
        display.println("Playing: " + String(track));
      } else {
        Serial.println("Invalid track number.");
        display.println("Track Error");
      }
    } else if (command.startsWith("vol ")) {
      int volume = command.substring(4).toInt();
      if (volume >= 0 && volume <= 30) {
        myDFPlayer.volume(volume);
        Serial.println("Volume set to " + String(volume));
        display.println("Volume: " + String(volume));
      } else {
        Serial.println("Volume out of range (0-30).");
        display.println("Volume Error");
      }
    } else if (command == "pause") {
      myDFPlayer.pause();
      Serial.println("Playback paused.");
      display.println("Paused");
    } else if (command == "resume") {
      myDFPlayer.start();
      Serial.println("Playback resumed.");
      display.println("Resumed");
    } else if (command == "next") {
      myDFPlayer.next();
      Serial.println("Playing next track.");
      display.println("Next Track");
    } else if (command == "prev") {
      myDFPlayer.previous();
      Serial.println("Playing previous track.");
      display.println("Previous Track");
    } else if (command == "stop") {
      myDFPlayer.stop();
      Serial.println("Playback stopped.");
      display.println("Stopped");
    } else {
      Serial.println("Invalid command.");
      display.println("Invalid Command");
    }

    display.display(); // Update OLED display
    Serial.flush();    // Clear the Serial buffer
  }

  yield(); // Prevent watchdog timer reset
}
