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

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET -1    // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns
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};  // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = {5, 4, 3, 2};  // Connect keypad COL0, COL1, COL2 and COL3 to these Arduino pins.
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

const int buttonPin = 10; // Pin til knappen
const int targetClicks = 5; // antall klikk for å løse oppgaven
const unsigned long timerDuration = 10000; // millisekunder nedtelling 

const String correctCode = "1234";  // Endre denne til nøkkelen som åpner ditt Escape room
int nesteRom = 5678;    // Endre denne til koden for å åpne neste Escape room
bool tilgangGitt = false;         // Denne variabelen forteller om du har tastat inn riktig nøkkel for å få tilgang på Escaperoomet ditt.
unsigned long timerStart = 0;
int clickCount = 0;


void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setRotation(2);
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.println("Skriv inn kode:");
  display.display();
}

void loop() {
  if (!tilgangGitt) {           // If IKKE tilgangGitt  (! betyr ikke)

    char nyKode[5] = {'\0'};
    byte nummerTeller = 0;

    display.clearDisplay();
    display.setCursor(0,0);
    display.println("Skriv inn kode:");
    display.display();

    while (nummerTeller < 4) {
      char key = keypad.getKey();
      if (key) {
        Serial.println(key);
        nyKode[nummerTeller++] = key;
        display.setCursor(nummerTeller * 6, 10);
        display.print('*'); // Viser * i stedet for ekte tall som et passord
        // display.setCursor(0,30); // Hvis du vil vise tallene du skriver inn i stedet for *
        // display.println(nyKode);
        display.display();
      }
    }

    if (String(nyKode) == correctCode) {
      tilgangGitt = true;
      display.clearDisplay();
      display.setCursor(0,0);
      display.println("Gratulerer!");
      display.display();
      // Run your function here
      delay(2000);
      nyttSpill();
    } 
    else {
      display.clearDisplay();
      display.setCursor(0,0);
      display.println("FEIL KODE!");
      display.display();
      delay(2000);
    }
  

  }
 else {
    unsigned long currentTime = millis();
    unsigned long elapsedTime = currentTime - timerStart;

    if (elapsedTime >= timerDuration) {
      if (clickCount == targetClicks) {
        display.clearDisplay();
        display.setCursor(0,0);
        display.println("YAY Koden er:");
        display.setCursor(10,30);
        display.println(nesteRom);
        display.display();
      } else {
        display.clearDisplay();
        display.setCursor(0,0);
        display.println("DU FEILA!");
        display.display();
        clickCount = 0;
        delay(2000);
        nyttSpill();
      }


    } else {
      int buttonState = digitalRead(buttonPin);
      if (buttonState == LOW) { // Knappen er klikka (LOW siden vi bruker PULLUP)
        clickCount++;
        display.clearDisplay();
        display.setCursor(0,0);
        display.print("Hold tellingen!");
        display.display();
        delay(300); // Denne delayen passer på at et klikk ikke blir registrert mer enn en gang
      }
    }
  }
}

void nyttSpill(){
  display.clearDisplay();
  display.setCursor(0,0);
  display.println("Trykk paa knapp");
  display.setCursor(0,20);
  display.print(targetClicks);
  display.println(" Ganger");
  display.setCursor(0,40);
  display.println("Men ikke for seint   eller for fort");
  timerStart = millis();
  clickCount = 0;
  display.display();

}