#include <SimpleRotary.h>
#include <Wire.h>
#include <U8g2lib.h>

//-------- rotary
#define pRotSw 3
#define pRotDt 4
#define pRotClk 5

U8G2_SSD1306_128X64_NONAME_F_HW_I2C lcd(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
SimpleRotary rot(pRotClk, pRotDt, pRotSw);

int menuSettings = 0;
bool editMode = false;
bool updateDisplay = false;
int runShot = 100;

#define SETCHK 123123123

struct WDSettings {
  int CamDelay = 100;
  int NumShot = 1;
  int ShotDelay = 1;
  int D1Size = 25;
  int D2Size = 25;
  int DGap = 100;
  uint32_t chk = SETCHK;
};

WDSettings conf;


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

  // welcomeScreen();

  rot.setDebounceDelay(0);
  rot.setErrorDelay(0);

  updateDisplay = true;
}

void loop() {
  // put your main code here, to run repeatedly:
  displayHandler();

  // rotHandler
  rotHandler();
}

void pageHeader() {
  lcd.setFont(u8g2_font_nokiafc22_tr);
  lcd.drawStr(0, 10, "DWN Project");
  lcd.setCursor(0, 16);
}

void pageFrame() {
  lcd.drawRFrame(0, 16, 126, 48, 4);
  lcd.drawVLine(42, 16, 48);
}

void hoverIcon(int x, int y) {
  lcd.setDrawColor(1);
  lcd.drawBox(x, y, 10, 10);
  lcd.setDrawColor(0);
}

void genIcon() {
  lcd.setFont(u8g2_font_open_iconic_all_1x_t);
  (menuSettings == 1) ? hoverIcon(5, 21) : lcd.setDrawColor(1);
  lcd.drawGlyph(6, 30, 0x0048);
  (menuSettings == 2) ? hoverIcon(15, 21) : lcd.setDrawColor(1);
  lcd.drawGlyph(16, 30, 0x009a);
  (menuSettings == 3) ? hoverIcon(27, 21) : lcd.setDrawColor(1);
  lcd.drawGlyph(28, 30, 0x008e);
  (menuSettings == 4) ? hoverIcon(5, 35) : lcd.setDrawColor(1);
  lcd.drawGlyph(6, 44, 0x006c);
  (menuSettings == 5) ? hoverIcon(15, 35) : lcd.setDrawColor(1);
  lcd.drawGlyph(16, 44, 0x0072);
  (menuSettings == 6) ? hoverIcon(27, 35) : lcd.setDrawColor(1);
  lcd.drawGlyph(28, 44, 0x010d);
  (menuSettings == 7) ? hoverIcon(5, 49) : lcd.setDrawColor(1);
  lcd.drawGlyph(6, 58, 0x009c);
  (menuSettings == 0) ? hoverIcon(27, 49) : lcd.setDrawColor(1);
  lcd.drawGlyph(28, 58, 0x004b);
  lcd.setDrawColor(1);
}

void showConfVal(int val, int x, int y, int w) {
  (editMode) ? lcd.setFont(u8g2_font_crox3cb_tn) : lcd.setFont(u8g2_font_crox3c_tn);
  lcd.setCursor(x, y);
  lcd.print(val);
  lcd.setDrawColor(1);
}

void genDetail() {
  bool showFoot = true;
  switch (menuSettings) {
    case 0:
      lcd.setFont(u8g2_font_9x15B_tr);
      lcd.drawStr(67, 36, "PUSH");
      lcd.drawStr(48, 51, "TO START");
      showFoot = false;
      break;
    case 1:
      lcd.setFont(u8g2_font_nokiafc22_tr);
      lcd.drawStr(46, 26, "Drop #1 Size");
      showConfVal(conf.D1Size, 46, 46, 80);
      break;
    case 2:
      lcd.setFont(u8g2_font_nokiafc22_tr);
      lcd.drawStr(46, 26, "GAP Delay");
      showConfVal(conf.DGap, 46, 46, 70);
      break;
    case 3:
      lcd.setFont(u8g2_font_nokiafc22_tr);
      lcd.drawStr(46, 26, "Drop #2 Size");
      showConfVal(conf.D2Size, 46, 46, 70);
      break;
    case 4:
      lcd.setFont(u8g2_font_nokiafc22_tr);
      lcd.drawStr(46, 26, "Camera Delay");
      showConfVal(conf.CamDelay, 46, 46, 70);
      break;
    case 5:
      lcd.setFont(u8g2_font_nokiafc22_tr);
      lcd.drawStr(46, 26, "Number Shot");
      showConfVal(conf.NumShot, 46, 46, 70);
      break;
    case 6:
      lcd.setFont(u8g2_font_nokiafc22_tr);
      lcd.drawStr(46, 26, "Shot Delay");
      showConfVal(conf.ShotDelay, 46, 46, 70);
      break;
    case 7:
      lcd.setFont(u8g2_font_9x15B_tr);
      lcd.drawStr(67, 36, "PUSH");
      lcd.drawStr(50, 51, "TO SAVE");
      showFoot = false;
      break;
  }
  if (showFoot) {
    lcd.setFont(u8g2_font_5x8_tr);
    if (editMode) {
      lcd.drawStr(46, 60, "push to save");
    } else {
      lcd.drawStr(46, 60, "push to edit");
    }
  }
}

void pageSettings() {
  pageHeader();
  pageFrame();
  genIcon();
  genDetail();
}

void welcomeScreen() {
  lcd.clearBuffer();
  lcd.setFont(u8g2_font_helvB08_tr);
  lcd.drawStr(36, 12, "DWN Project");
  // lcd.sendBuffer();
  // delay(500);
  lcd.setFont(u8g2_font_helvB10_tr);
  lcd.drawStr(16, 34, "WATER DROP");
  lcd.setFont(u8g2_font_helvB08_tr);
  lcd.drawStr(26, 45, "PHOTOGRAPHY");
  // lcd.sendBuffer();
  // delay(500);
  lcd.setFont(u8g2_font_helvB08_tr);
  lcd.drawStr(44, 62, "ver: 1.0.1");
  lcd.sendBuffer();
  delay(2000);
  lcd.clearBuffer();
}

void pageRunning() {
  lcd.setFont(u8g2_font_helvB08_tr);
  lcd.drawStr(2, 12, "Running...");
  lcd.setFont(u8g2_font_crox3c_tn);
  int offset = 20;
  lcd.setCursor(2 + offset,40);
  lcd.print(runShot);
  lcd.setCursor(40 + offset,40);
  lcd.print("/");
  lcd.setCursor(60 + offset,40);
  lcd.print(conf.NumShot);
  lcd.setFont(u8g2_font_5x8_tr);
  lcd.drawStr(2, 60, "push to stop");
}

void displayHandler() {
  if (updateDisplay) {
    lcd.clearBuffer();
    // pageSettings();
    pageRunning();
    lcd.sendBuffer();
    delay(5);
    updateDisplay = false;
  }
}

void rotHandler() {
  byte i = rot.rotate();
  byte p = rot.push();

  if (i == 1 || i == 2 || p == 1) {
    if (!editMode) {
      if (i == 1) menuSettings++;
      if (i == 2) menuSettings--;
      if (menuSettings < 0) menuSettings = 7;
      if (menuSettings > 7) menuSettings = 0;

    }
    if (editMode) {
      if (menuSettings == 1) {
        if (i == 1) conf.D1Size++;
        if (i == 2) conf.D1Size--;
      }
    }
    if (p == 1) editMode = !editMode;

    //Serial.println(menuSettings);
    updateDisplay = true;
  }
}