#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4

// Buttons
#define scrollButton 7
#define selectButton 6
#define multiButton 5
Adafruit_SSD1306 display(OLED_RESET);


// Variables:
String textToDisplayAtHomePage = "";
short int homePage = 0;
short int userPageNum = 0;
unsigned short int arrayLength = 0;

unsigned short int ageSelect = 0;
short int createUserOptionSelectedIndex = 0;
boolean isMaleOptionState = true;
boolean pulseOptionState = true;
boolean pastAlergieOptionState = false;
boolean physicalExamOptionState = true;
boolean pastSurgeryOptionState = false;
// Arrays
const unsigned short int maxUsers = 2;
unsigned short int id[maxUsers] = {};
unsigned short int age[maxUsers] = {};
boolean pulseRateNormal[maxUsers] ={};
boolean anyPastAlergies[maxUsers] = {};
boolean anyPastSugeries[maxUsers] = {};
boolean physicalExamNormal[maxUsers] ={};
boolean isMale[maxUsers] = {};

boolean displayHomePage = true;
boolean displayPreviousUsers = false;
boolean displayAdvanceInfo = false;
boolean displayCreateUserPanel = false;

void setup() {
  pinMode(scrollButton, INPUT);
  pinMode(selectButton, INPUT);
  pinMode(multiButton, INPUT);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(2000);
  Serial.begin(9600);
}
void loop() {
  if (digitalRead(scrollButton) == HIGH ){
    displayHomePage = true;
    displayPreviousUsers = false;
    displayAdvanceInfo = false;
    displayCreateUserPanel = false;
    delay(150);
    homePage++;
  };
  if (homePage > 2) homePage = 0;
  if (homePage == 0) textToDisplayAtHomePage = "Hello";
  else if (homePage == 1) textToDisplayAtHomePage = "Users";
  else textToDisplayAtHomePage = "Create";
  

  if (digitalRead(selectButton)==HIGH){
    delay(150);
    if (homePage == 1){
      displayHomePage = false;
      displayPreviousUsers = true;
      if (displayPreviousUsers){
        if (userPageNum > 1) 
          userPageNum = 0;
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.print("Id:");
        display.println(id[userPageNum]);
        display.print("Age:");
        display.println(age[userPageNum]);
        display.print("Gender: ");
        if (isMale[userPageNum]) display.println("Male");
        else display.println("Female");
        display.display();
        delay(150);
        userPageNum++;
      }
    }
    else{
      displayHomePage = false;
      for (auto i: id)
        if(i > 0) arrayLength ++;
      Serial.println(arrayLength);
      if (arrayLength < maxUsers)
        displayCreateUserPanel = true;
    else{
      display.clearDisplay();
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("List is");
      display.println("Full!");
      display.display();
      delay(2000);
      displayHomePage = true;
      homePage = 0;
    }
    }
  }
  if (digitalRead(multiButton)==HIGH) displayAdvanceInfo = true;

  if (displayAdvanceInfo && displayPreviousUsers){
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.print("Pulse:");
    if (pulseRateNormal[userPageNum]) display.println("Normal");
    else display.println("Bad");
    
    display.print("Alergies: ");
    if (anyPastAlergies[userPageNum]) display.println("yes");
    else display.println("No");

    display.print("Past Sugeries: ");
    if (anyPastSugeries[userPageNum]) display.println("yes");
    else display.println("No");
    display.print("PhysicalExam: ");
    if (physicalExamNormal[userPageNum]) display.println("Normal");
    else display.println("Bad");
    display.display();
  }

  if (displayCreateUserPanel){
    if (createUserOptionSelectedIndex >= 0 && createUserOptionSelectedIndex < 2){
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Create User:");
      display.print("Age: ");
      display.println(ageSelect);
      if (createUserOptionSelectedIndex == 0 && digitalRead(multiButton)){
        delay(40);
        ageSelect++;
      }
      display.print("Gender: ");
      if(isMaleOptionState) display.println("Male");
      else display.println("Female");
      if (createUserOptionSelectedIndex == 1 && digitalRead(multiButton)){
        delay(80);
        isMaleOptionState = !isMaleOptionState;
      }
      display.display();
    }
    if(createUserOptionSelectedIndex >= 2 && createUserOptionSelectedIndex < 6){
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.print("Pulse: ");
      if(pulseOptionState) display.println("Good");
      else display.println("Bad");
      if (createUserOptionSelectedIndex == 2 && digitalRead(multiButton)){
        delay(80);
        pulseOptionState = !pulseOptionState;
      }

      display.print("Alergies: ");
        if(pastAlergieOptionState) display.println("Yes");
      else display.println("No");
      if (createUserOptionSelectedIndex == 3 && digitalRead(multiButton)){
        delay(80);
        pastAlergieOptionState = !pastAlergieOptionState;
      }

      display.print("Past Surgeries: ");
      if(pastSurgeryOptionState) display.println("Yes");
      else display.println("No");
      if (createUserOptionSelectedIndex == 4 && digitalRead(multiButton)){
        delay(80);
        pastSurgeryOptionState = !pastSurgeryOptionState;
      }  
      display.print("PhysicalExam");
      if(physicalExamOptionState) display.println("Good");
      else display.println("Bad");
      if (createUserOptionSelectedIndex == 5 && digitalRead(multiButton)){
        delay(80);
        physicalExamOptionState = !physicalExamOptionState;
      }    
      display.display();
    }
    if(digitalRead(selectButton)==HIGH){
      delay(150);
      createUserOptionSelectedIndex++;
    }
    if(createUserOptionSelectedIndex >= 6) createUserOptionSelectedIndex = 0;
    if(digitalRead(scrollButton)==HIGH){
      delay(150);
      unsigned short int largestId = 1;
       for (int i = 1; i < maxUsers; i++) 
        if (id[i] > largestId) largestId = id[i];
      largestId++;
      id[arrayLength] = largestId;
      //age:
      age[arrayLength] = ageSelect;
      //pulse rate
      pulseRateNormal[arrayLength] = pulseOptionState;
      // past alergies
      anyPastAlergies[arrayLength] = pastAlergieOptionState;
      // any past surgeries
      anyPastSugeries[arrayLength] = pastSurgeryOptionState;
      // physicalExamNormal
      physicalExamNormal[arrayLength] = physicalExamOptionState;
      // isMale
      isMale[arrayLength] = isMaleOptionState;
    }
  }

  if(displayHomePage){
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.println(textToDisplayAtHomePage);
    display.display();
  }
}