#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 enRead = LOW;
bool click = LOW;

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 encoderRead() {
  bool currentStateA = digitalRead(pinA);
  bool currentStateB = digitalRead(pinB);

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

void buttonClick() {
  click = HIGH;
}

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

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

  attachInterrupt(digitalPinToInterrupt(pinA), encoderRead, RISING);
  attachInterrupt(digitalPinToInterrupt(pinButton), buttonClick, FALLING);

  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() {
  if (enRead == HIGH) {
    scrollMenu (currentMenu);
    enRead = LOW;
  }

  if (click == HIGH) {
    select(currentMenu);
    click = LOW;
  }
}

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) {
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.println("Select:");
  switch (num) {
    case 0:
      display.setTextSize(2);
      display.println(menu[0] + " <-");
      display.setTextSize(1);
      display.println(menu[1]);
      display.setTextSize(1);
      display.println(menu[2]);
      break;
    case 1:
      display.setTextSize(1);
      display.println(menu[0]);
      display.setTextSize(2);
      display.println(menu[1] + " <-");
      display.setTextSize(1);
      display.println(menu[2]);
      break;
    case 2:
      display.setTextSize(1);
      display.println(menu[0]);
      display.setTextSize(1);
      display.println(menu[1]);
      display.setTextSize(2);
      display.println(menu[2] + " <-");
      break;
    case 3:
      display.setTextSize(2);
      display.println(menu[3] + " <-");
      display.setTextSize(1);
      display.println(menu[4]);
      display.setTextSize(1);
      display.println(menu[5]);
      break;
    case 4:
      display.setTextSize(1);
      display.println(menu[3]);
      display.setTextSize(2);
      display.println(menu[4] + " <-");
      display.setTextSize(1);
      display.println(menu[5]);
      break;
    case 5:
      display.setTextSize(1);
      display.println(menu[3]);
      display.setTextSize(1);
      display.println(menu[4]);
      display.setTextSize(2);
      display.println(menu[5] + " <-");
      break;
    default:
      Serial.println("error");
      display.println("error");
      break;
  }
  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();
}