#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

// Inisialisasi objek LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Alamat I2C 0x27, LCD 20x4

const byte ROWS = 4;  // Jumlah baris pada keypad
const byte COLS = 4;  // Jumlah kolom pada keypad

// Keypad mapping
char keys[ROWS][COLS] = {
  { '1', '2', '3', 'A' },
  { '4', '5', '6', 'B' },
  { '7', '8', '9', 'C' },
  { '*', '0', '#', 'D' }
};
byte rowPins[ROWS] = { 9, 8, 7, 6 };  // Pin baris pada keypad
byte colPins[COLS] = { 5, 4, 3, 2 };  // Pin kolom pada keypad

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

enum menu_state { MAIN_MENU,
                  REGIST,
                  REFILLING,//belum
                  MASTER,//belum
                  REGIST_PASSCODE,
                  REGIST_SCAN,//belum
                  REGIST_VEHICLE_TYPE_0,
                  REGIST_VEHICLE_TYPE_1,
                  REGIST_VEHICLE_TYPE_2,
                  REGIST_VEHICLE_TYPE_3,
                  REGIST_VEHICLE_NUMBER,
                  REGIST_VEHICLE_QUOTA,
                  REGIST_VEHICLE_PASSCODE,
                  REGIST_VEHICLE_CONFIRMATION };  // Enum untuk status menu

menu_state current_state = MAIN_MENU;  // Status menu awal

//Variable REGIST_PASSCODE STRING
int REGIST_PASSCODE_DATA = 123;
String regist_passcode_input = "";           //hasil input akhir
String regist_passcode_progress_input = "";  // Input yang sedang berlangsung

//Variable REGIST_VEHICLE_TYPE_X
String vehicle_type_data = "";          //Hasil pemilihan tipe kendaraan
String regist_vehicle_type_input = "";  // Input sementara pemilihan tipe kendaraan

//Variable REGIST_VEHICLE_NUMBER
int vehicle_number_data;
String regist_vehicle_number_input = "";
String regist_vehicle_number_progress_input = "";

//Variable REGIST_VEHICLE_QUOTA
int vehicle_quota_data;
String regist_vehicle_quota_input = "";
String regist_vehicle_quota_progress_input = "";

//Variable REGIST_VEHICLE_QUOTA
int vehicle_passcode_data;
String regist_vehicle_passcode_input = "";
String regist_vehicle_passcode_progress_input = "";


void setup() {
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
}

void loop() {
  char key = keypad.getKey();  // Membaca tombol yang ditekan

  // Handler untuk setiap status menu
  switch (current_state) {
    case MAIN_MENU:
      {
        lcd.setCursor(0, 0);
        lcd.print("MAIN MENU:");
        lcd.setCursor(0, 1);
        lcd.print("A.REGISTRATION");
        lcd.setCursor(0, 2);
        lcd.print("B.REFILLING");
        lcd.setCursor(0, 3);
        lcd.print("C.MASTER");
        if (key) {
          switch (key) {
            case 'A':
              lcd.clear();
              current_state = REGIST;

              break;
            case 'B':
              lcd.clear();
              break;
            case 'C':
              lcd.clear();
              break;
            default:
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("INPUT SALAH");delay(500);
            lcd.clear();
            break;
          }
        }
        break;
      }


    case REGIST:
      {
        lcd.setCursor(0, 0);
        lcd.print("ADMIN ONLY");
        lcd.setCursor(0, 2);
        lcd.print("Press A to CONTINUE");
        lcd.setCursor(0, 3);
        lcd.print("Press B to BACK");

        if (key) {
          switch (key) {
            case 'A':
              lcd.clear();
              current_state = REGIST_PASSCODE;

              break;

            case 'B':
              lcd.clear();
              current_state = MAIN_MENU;

              break;
          }
        }
        break;
      }

    case REGIST_PASSCODE:
      {
        int passcode = 0;
        lcd.setCursor(0, 0);
        lcd.print("Enter Passcode");
        lcd.setCursor(0, 1);
        lcd.print("A.ENTER  |  D.DELETE");
        lcd.setCursor(0, 2);
        lcd.print("B.BACK");
        lcd.setCursor(0, 3);
        lcd.print("P:");
        lcd.setCursor(3, 3);
        lcd.print(regist_passcode_progress_input);  // Menampilkan input yang sedang berlangsung


        if (key != NO_KEY) {
          if (key == 'D') {
            // Menghapus konten LCD dan reset input
            lcd.clear();
            regist_passcode_progress_input = "";
            regist_passcode_input = "";
            passcode = 0;
          } else if (key == 'A') {
            // Tombol enter
            lcd.clear();
            passcode = regist_passcode_input.toInt();

            if (passcode == REGIST_PASSCODE_DATA) {
              lcd.setCursor(0, 0);
              lcd.print("PASSCODE CORRECT");
              delay(900);
              lcd.clear();

              current_state = REGIST_VEHICLE_TYPE_0;


              //current_state = REGIST_SCAN;
            } else {
              lcd.setCursor(0, 0);
              lcd.print("PASSCODE FALSE");
              delay(900);
            }

            regist_passcode_input = "";  // reset input setelah tombol enter ditekan
            regist_passcode_progress_input = "";
            delay(100);  // delay untuk menghindari input ganda
          } else if (key == 'B') {
            lcd.clear();
            current_state = REGIST;
            regist_passcode_progress_input = "";
            regist_passcode_input = "";
            passcode = 0;

          } else {
            // Menambahkan karakter ke regist_passcode_progress_input
            lcd.clear();
            regist_passcode_progress_input += key;
            regist_passcode_input += key;  // Menambahkan karakter ke regist_passcode_input saat tombol ditekan
          }
        }
        break;
      }

    case REGIST_VEHICLE_TYPE_0:
      {
        lcd.setCursor(0, 0);
        lcd.print("CHOOSE VEHICLE TYPE:");
        lcd.setCursor(0, 1);
        lcd.print("Press NUM to CHOOSE");
        lcd.setCursor(0, 2);
        lcd.print("A.CONTINUE & NEXT");
        lcd.setCursor(0, 3);
        lcd.print("B.BACK & PREVIOUS");

        if (key) {
          switch (key) {
            case 'A':
              lcd.clear();
              current_state = REGIST_VEHICLE_TYPE_1;  //Go to vehicle type page
              break;

            case 'B':
              lcd.clear();
              current_state = REGIST_PASSCODE;  //Back to regist passcode page
              break;
          }
        }
        break;
      }

    case REGIST_VEHICLE_TYPE_1:
      {
        lcd.setCursor(0, 0);
        lcd.print("CHOOSE VEHICLE TYPE:");
        lcd.setCursor(0, 1);
        lcd.print("1.CRANE");
        lcd.setCursor(0, 2);
        lcd.print("2.DOZER");
        lcd.setCursor(0, 3);
        lcd.print("3.DUMP TRUCK");

        if (key) {
          switch (key) {
            case '1':
              //Admin choose number 1
              lcd.clear();
              //go to next state
              regist_vehicle_type_input = "CRANE";
              vehicle_type_data = regist_vehicle_type_input;
              regist_vehicle_type_input = "";
              current_state = REGIST_VEHICLE_NUMBER;

              break;

            case '2':
              //Admin choose number 2
              lcd.clear();
              //go to next state
              regist_vehicle_type_input = "DOZER";
              vehicle_type_data = regist_vehicle_type_input;
              regist_vehicle_type_input = "";
              current_state = REGIST_VEHICLE_NUMBER;

              break;

            case '3':
              //Admin choose number 3
              lcd.clear();
              //go to next state
              regist_vehicle_type_input = "DUMP TRUCK";
              vehicle_type_data = regist_vehicle_type_input;
              regist_vehicle_type_input = "";
              current_state = REGIST_VEHICLE_NUMBER;
              break;

            case 'A':
              //Next page
              lcd.clear();
              current_state = REGIST_VEHICLE_TYPE_2;
              break;

            case 'B':
              //Back to VEHICLE TYPE MENU INFORMATION
              lcd.clear();
              current_state = REGIST_VEHICLE_TYPE_0;
              break;
          }
        }
        break;
      }


    case REGIST_VEHICLE_TYPE_2:
      {
        lcd.setCursor(0, 0);
        lcd.print("CHOOSE VEHICLE TYPE:");
        lcd.setCursor(0, 1);
        lcd.print("4.EXCAVATOR");
        lcd.setCursor(0, 2);
        lcd.print("5.LOADER");
        lcd.setCursor(0, 3);
        lcd.print("6.MANHAULER");

        if (key) {
          switch (key) {
            case '4':
              //Admin choose number 4
              lcd.clear();
              //go to next state
              regist_vehicle_type_input = "EXCAVATOR";
              vehicle_type_data = regist_vehicle_type_input;
              regist_vehicle_type_input = "";
              current_state = REGIST_VEHICLE_NUMBER;
              break;

            case '5':
              //Admin choose number 5
              lcd.clear();
              //go to next state
              regist_vehicle_type_input = "LOADER";
              vehicle_type_data = regist_vehicle_type_input;
              regist_vehicle_type_input = "";
              current_state = REGIST_VEHICLE_NUMBER;

              break;

            case '6':
              //Admin choose number 6
              lcd.clear();
              //go to next state
              regist_vehicle_type_input = "MANHAULER";
              vehicle_type_data = regist_vehicle_type_input;
              regist_vehicle_type_input = "";
              current_state = REGIST_VEHICLE_NUMBER;

              break;

            case 'A':
              //Next page
              lcd.clear();
              current_state = REGIST_VEHICLE_TYPE_3;
              break;

            case 'B':
              //Back to VEHICLE TYPE MENU INFORMATION
              lcd.clear();
              current_state = REGIST_VEHICLE_TYPE_1;
              break;
          }
        }
        break;
      }


    case REGIST_VEHICLE_TYPE_3:
      {
        lcd.setCursor(0, 0);
        lcd.print("CHOOSE VEHICLE TYPE:");
        lcd.setCursor(0, 1);
        lcd.print("7.SCRAPPER");
        lcd.setCursor(0, 2);
        lcd.print("8.WATER TRUCK");

        if (key) {
          switch (key) {
            case '7':
              //Admin choose number 7
              lcd.clear();
              //go to next state
              regist_vehicle_type_input = "SCRAPPER";
              vehicle_type_data = regist_vehicle_type_input;
              regist_vehicle_type_input = "";
              current_state = REGIST_VEHICLE_NUMBER;
              break;

            case '8':
              //Admin choose number 8
              lcd.clear();
              //go to next state
              regist_vehicle_type_input = "WATER TRUCK";
              vehicle_type_data = regist_vehicle_type_input;
              regist_vehicle_type_input = "";
              current_state = REGIST_VEHICLE_NUMBER;
              break;


            case 'A':
              //Next page
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("END OF PAGE");
              delay(500);
              break;

            case 'B':
              //Back to VEHICLE TYPE MENU INFORMATION
              lcd.clear();
              current_state = REGIST_VEHICLE_TYPE_2;
              break;
          }
        }
        break;
      }
    case REGIST_VEHICLE_NUMBER:
      {
        lcd.setCursor(0, 0);
        lcd.print("Enter Vehicle Number");
        lcd.setCursor(0, 1);
        lcd.print("A.ENTER  |  C.CHECK");
        lcd.setCursor(0, 2);
        lcd.print("B.BACK   |  D.DELETE");
        lcd.setCursor(0, 3);
        lcd.print("VN:");
        lcd.setCursor(3, 3);
        lcd.print(regist_vehicle_number_progress_input);  // Menampilkan input yang sedang berlangsung

        if (key != NO_KEY) {
          if (key == 'A') {
            // Tombol enter
            lcd.clear();
            vehicle_number_data = regist_vehicle_number_input.toInt();
            regist_vehicle_number_input = "";  // reset input setelah tombol enter ditekan
            regist_vehicle_number_progress_input = "";
            current_state = REGIST_VEHICLE_QUOTA;
            delay(100);  // delay untuk menghindari input ganda
          } else if (key == 'B') {
            lcd.clear();
            regist_vehicle_number_progress_input = "";
            regist_vehicle_number_input = "";
            vehicle_number_data = 0;
            current_state = REGIST_VEHICLE_TYPE_0;
          } else if (key == 'C') {
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("TYPE  :");
            lcd.setCursor(7, 0);
            lcd.print(vehicle_type_data);
            delay(1000);
          } else if (key == 'D') {
            // Menghapus konten LCD dan reset input
            lcd.clear();
            regist_vehicle_number_progress_input = "";
            regist_vehicle_number_input = "";
            vehicle_number_data = 0;
          } else {
            // Menambahkan karakter ke regist_vehicle_number_progress_input
            lcd.clear();
            regist_vehicle_number_progress_input += key;
            regist_vehicle_number_input += key;  // Menambahkan karakter ke regist_vehicle_number_input saat tombol ditekan
          }
        }
        break;
      }

    case REGIST_VEHICLE_QUOTA:
      {
        lcd.setCursor(0, 0);
        lcd.print("Enter Vehicle Quota");
        lcd.setCursor(0, 1);
        lcd.print("A.ENTER  |  C.CHECK");
        lcd.setCursor(0, 2);
        lcd.print("B.BACK   |  D.DELETE");
        lcd.setCursor(0, 3);
        lcd.print("VQ:");
        lcd.setCursor(3, 3);
        lcd.print(regist_vehicle_quota_progress_input);  // Menampilkan input yang sedang berlangsung


        if (key != NO_KEY) {
          if (key == 'A') {
            // Tombol enter
            lcd.clear();
            vehicle_quota_data = regist_vehicle_quota_input.toInt();
            regist_vehicle_quota_input = "";  // reset input setelah tombol enter ditekan
            regist_vehicle_quota_progress_input = "";
            current_state = REGIST_VEHICLE_PASSCODE;
            delay(100);  // delay untuk menghindari input ganda
          } else if (key == 'B') {
            lcd.clear();
            regist_vehicle_quota_progress_input = "";
            regist_vehicle_quota_input = "";
            vehicle_quota_data = 0;
            current_state = REGIST_VEHICLE_NUMBER;
          } else if (key == 'C') {
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("TYPE  :");
            lcd.setCursor(7, 0);
            lcd.print(vehicle_type_data);
            lcd.setCursor(0, 1);
            lcd.print("NUMBER:");
            lcd.setCursor(7, 1);
            lcd.print(vehicle_number_data);
            delay(1000);
          } else if (key == 'D') {
            // Menghapus konten LCD dan reset input
            lcd.clear();
            regist_vehicle_quota_progress_input = "";
            regist_vehicle_quota_input = "";
            vehicle_quota_data = 0;
          } else {
            // Menambahkan karakter ke regist_vehicle_quota_progress_input
            lcd.clear();
            regist_vehicle_quota_progress_input += key;
            regist_vehicle_quota_input += key;  // Menambahkan karakter ke regist_vehicle_quota_input saat tombol ditekan
          }
        }
        break;
      }

    case REGIST_VEHICLE_PASSCODE:
      {
        lcd.setCursor(0, 0);
        lcd.print("Enter Vehicle Pass");
        lcd.setCursor(0, 1);
        lcd.print("A.ENTER  |  C.CHECK");
        lcd.setCursor(0, 2);
        lcd.print("B.BACK   |  D.DELETE");
        lcd.setCursor(0, 3);
        lcd.print("VP:");
        lcd.setCursor(3, 3);
        lcd.print(regist_vehicle_passcode_progress_input);  // Menampilkan input yang sedang berlangsung


        if (key != NO_KEY) {
          if (key == 'A') {
            // Tombol enter
            lcd.clear();
            vehicle_passcode_data = regist_vehicle_passcode_input.toInt();
            regist_vehicle_passcode_input = "";  // reset input setelah tombol enter ditekan
            regist_vehicle_passcode_progress_input = "";
            current_state = REGIST_VEHICLE_CONFIRMATION;
            delay(100);  // delay untuk menghindari input ganda
          } else if (key == 'B') {
            lcd.clear();
            regist_vehicle_passcode_progress_input = "";
            regist_vehicle_passcode_input = "";
            vehicle_passcode_data = 0;
            current_state = REGIST_VEHICLE_QUOTA;
          } else if (key == 'C') {
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("TYPE  :");
            lcd.setCursor(7, 0);
            lcd.print(vehicle_type_data);
            lcd.setCursor(0, 1);
            lcd.print("NUMBER:");
            lcd.setCursor(7, 1);
            lcd.print(vehicle_number_data);
            lcd.setCursor(0, 2);
            lcd.print("QUOTA :");
            lcd.setCursor(7, 2);
            lcd.print(vehicle_quota_data);
            delay(1000);
          } else if (key == 'D') {
            // Menghapus konten LCD dan reset input
            lcd.clear();
            regist_vehicle_passcode_progress_input = "";
            regist_vehicle_passcode_input = "";
            vehicle_passcode_data = 0;
          } else {
            // Menambahkan karakter ke regist_vehicle_passcode_progress_input
            lcd.clear();
            regist_vehicle_passcode_progress_input += key;
            regist_vehicle_passcode_input += key;  // Menambahkan karakter ke regist_vehicle_passcode_input saat tombol ditekan
          }
        }
        break;
      }

    case REGIST_VEHICLE_CONFIRMATION:
      {
        lcd.setCursor(0, 0);
        lcd.print("CONFIRM VEHICLE DATA");
        lcd.setCursor(0, 1);
        lcd.print("A.NEXT & SAVE");
        lcd.setCursor(0, 2);
        lcd.print("B.BACK  |  C.CHECK");

        if (key) {
          switch (key) {
            case 'A':
              {
                //Isi dengan program yang menyimpan data-data
                break;
              }
            case 'B':
              {
                lcd.clear();
                current_state = REGIST_VEHICLE_PASSCODE;
                break;
              }
            case 'C':
              {
                lcd.clear();
                lcd.setCursor(0, 0);
                lcd.print("TYPE  :");
                lcd.setCursor(7, 0);
                lcd.print(vehicle_type_data);
                lcd.setCursor(0, 1);
                lcd.print("NUMBER:");
                lcd.setCursor(7, 1);
                lcd.print(vehicle_number_data);
                lcd.setCursor(0, 2);
                lcd.print("QUOTA :");
                lcd.setCursor(7, 2);
                lcd.print(vehicle_quota_data);
                delay(1000);
                break;
              }
          }
        }
      }
  }
}