#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

const int pinA = 35;
const int pinB = 34;
const int pinButton = 32;

bool lastStateA;
bool lastButtonState = HIGH;

unsigned long time_now = 0;

int currentMenu = -1;
const int numMenus = 6;
const String menu[numMenus] = {"menu 1", "menu 2", "menu 3", "menu 4", "menu 5", "menu 6"};

void setup() {
  Serial.begin(115200);

  pinMode(pinA, INPUT);
  pinMode(pinB, INPUT);
  pinMode(pinButton, INPUT_PULLUP);

  lastStateA = digitalRead(pinA);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  delay(500);
  display.clearDisplay();
  display.setTextColor(WHITE);
  cover();
}

void loop() {
  bool currentStateA = digitalRead(pinA);
  bool currentStateB = digitalRead(pinB);

  if (currentStateA > lastStateA) {
    if (currentStateB != currentStateA) {
      currentMenu = (currentMenu + 1) % numMenus;  //ke menu berikutnya
    } else {
      currentMenu = (currentMenu - 1 + numMenus) % numMenus;  //ke menu sebelumnya
    }
    scrollMenu(currentMenu);
    Serial.println(currentMenu);
  }
  lastStateA = currentStateA;

  bool buttonState = digitalRead(pinButton);
  //Serial.println(buttonState);
  if (buttonState < lastButtonState) {
    select(currentMenu);
  }
  lastButtonState = buttonState;
}

void cover() {
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(12, 3);
  display.println("MENU LIST");
  display.setTextSize(1);
  display.setCursor(59, 30);
  display.println("by");
  display.setCursor(15, 40);
  display.println("Alditya - 492752");
  display.display();
}
void scrollMenu(int num) {
  time_now = millis();

  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.println("Select:");
  display.setTextSize(1);
  display.println(menu[(num - 1 + numMenus) % numMenus]);
  display.setTextSize(1);
  display.println("> " + menu[num]);
  display.setTextSize(1);
  display.println(menu[(num + 1) % numMenus]);
  display.display();

  while (millis() < time_now + 200) { }

  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.println("Select:");
  display.setTextSize(1);
  display.println(menu[(num - 1 + numMenus) % numMenus]);
  display.setTextSize(2);
  display.println("> " + menu[num]);
  display.setTextSize(1);
  display.println(menu[(num + 1) % numMenus]);
  display.display();
}

void select(int numSelect) {
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.println("Selected:");
  display.println(menu[numSelect]);
  // switch (numSelect) {
  //   case 0:
  //     display.println(menu1);
  //     break;
  //   case 1:
  //     display.println(menu2);
  //     break;
  //   case 2:
  //     display.println(menu3);
  //     break;
  //   case 3:
  //     display.println(menu4);
  //     break;
  //   case 4:
  //     display.println(menu5);
  //     break;
  //   case 5:
  //     display.println(menu6);
  //     break;
  //   default:
  //     display.clearDisplay();
  //     Serial.println("error: no menu selected");
  //     display.println("Please\nrotate\nthe knob!");
  //     break;
  //}
  display.display();
}