/*******************************************************
Dagmar Oranje
Code voor skategame | ITTT
September 2024
********************************************************/

//ibrary toevoegen voor LCD
#include <LiquidCrystal.h>

//pins in LCD benoemen
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//pins in LCD benamen
int LED = 13;
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
char pos[10];  //size + 1

// Trick arrays
char* Tricks_easy[] = { "Mizou", "Acid", "Soul", "P-star", "360", "180", "540", "Makio", "Fishy", "5-0", "50/50", "Halfcab", "Tabern.", "DS Tabern." };

// Obstacle arrays
char* Obstacle_easy[] = { "Stairs", "Coping", "Ledge", "Rail", "Bank", "Quarter", "Hip" };

// Extra's arrays
char* Extra[] = {"Grind", "360", "Grab", "Hardway", "Switch", "True", "All-oop"};

void setup() {
  randomSeed(millis());
  pinMode(10, INPUT);
  pinMode(LED, OUTPUT);

  //start de library
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Welcome to");
  lcd.setCursor(1, 1);
  lcd.print("skate-inator");
  delay(3000);
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("press 'down'");
  lcd.setCursor(4, 1);
  lcd.print("to start");
}

void loop() {

  //het lezen van de buttons
  lcd_key = read_LCD_buttons();

  //afhankelijk van welke knop wordt ingedrukt zal een actie worden uitgevoerd
  switch (lcd_key) {
    case btnRIGHT:
      {
        lcd.print("");
        digitalWrite(LED, HIGH);
        break;
      }
    case btnLEFT:
      {
        lcd.print("");
        digitalWrite(LED, HIGH);
        break;
      }
    case btnUP:
      {
        lcd.print("");
        digitalWrite(LED, HIGH);
        break;
      }
    case btnDOWN:
      {
        give_trick();
        digitalWrite(LED, HIGH);
        break;
      }
    case btnSELECT:
      {
        lcd.print("");
        digitalWrite(LED, HIGH);
        break;
      }
    case btnNONE:
      {
        lcd.print("");
        digitalWrite(LED, LOW);
        break;
      }
  }
}

//functions

String select_trick() {
  // Gebruik de String() constructor om char* om te zetten naar String
  int random_trick = random(0, 13);
  String resultaat = String(Tricks_easy[random_trick]);
  return resultaat;
}

String select_obstacle() {
  // Gebruik de String() constructor om char* om te zetten naar String
  int random_ob = random(0, 6);
  String resultaat = String(Obstacle_easy[random_ob]);
  return resultaat;
}

String select_extra() {
  // Gebruik de String() constructor om char* om te zetten naar String
  int random_extra = random(0, 6);
  String resultaat = String(Extra[random_extra]);
  return resultaat;
}

void print_on_screen(String String_trick, String String_ob, String String_extra) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("[Trick]");
  lcd.setCursor(0, 1);
  lcd.print("[Obstacle]");
  lcd.setCursor(9,0);
  lcd.print("[Extra]");
  delay(300);
  lcd.setCursor(11, 1);
  lcd.print(".");
  delay(300);
  lcd.setCursor(12, 1);
  lcd.print(".");
  delay(300);
  lcd.setCursor(13, 1);
  lcd.print(".");
  delay(500);


  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(String_trick);
  lcd.setCursor(0, 1);
  lcd.print(String_ob);
  lcd.setCursor(9, 0);
  lcd.print(String_extra);
}

void give_trick() {
  String temp1 = select_trick();
  String temp2 = select_obstacle();
  String temp3 = select_extra();
  print_on_screen(temp1, temp2, temp3);
}

//(dit gedeelte heb ik overgenomen uit een youtubetutorial; de buttons worden hier een waarde toegewezen zodat ze maar 1 pin gebruiken)
//source: https://youtu.be/Vjkj72oEtAk?si=EvSwjH1ZqnoVsXa-
// read buttons 
int read_LCD_buttons() {
  adc_key_in = analogRead(0);  // read the value
  // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
  // we add approx 50 to those values and check to see if we are close
  if (adc_key_in > 1000) return btnNONE;  // no Key pressed
  if (adc_key_in < 50) return btnRIGHT;
  if (adc_key_in < 250) return btnUP;
  if (adc_key_in < 450) return btnDOWN;
  if (adc_key_in < 650) return btnLEFT;
  if (adc_key_in < 850) return btnSELECT;
  return btnNONE;  // when all others fail return btnNONE
}

//end