#include <Adafruit_GFX.h>       
#include <SPI.h>  
#include <Adafruit_ILI9341.h>   
#include <Adafruit_FT6206.h>
// #include <XPT2046_Touchscreen.h>
 
#define TFT_CS    10      
#define TFT_RST   9      
#define TFT_DC    8     


// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 ctp = Adafruit_FT6206(); // untuk simulasi wokwi
// XPT2046_Touchscreen ctp(CS_PIN);

// Ukuran layar: 240px x 320px
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);


// Warna 
// Website color picker: https://barth-dev.de/online/rgb565-color-picker/
#define GREY 0x52AA
#define DARK_GREY 0x4208
#define RED 0xF800
#define LIGHT_GREEN 0xC714
#define YELLOW 0xDF4F
#define YELLOW_2 0xFF8F
#define ORANGE 0xFC29
#define PINK 0xEB8E
#define LIGHT_RED 0xDB0B

// Menu
int menu = 0;

// Gender
String gender = "man";

// Age
int age = 0;

// Deklarasi menu
void starting_animation();
void main_menu();
void measurement_menu();
void input_age_gender_menu();
void results_menu();
 
void setup() {
  Serial.begin(9600);

  tft.begin();

  if (!ctp.begin(40)) {  // pass in 'sensitivity' coefficient
    Serial.println("Couldn't start FT6206 touchscreen controller");
    while (1);
  }

  Serial.println("Capacitive touchscreen started");

  starting_animation();
}
 
 
void loop(void) {

  TS_Point p = ctp.getPoint();  

  // Serial.print("X: ");
  // Serial.println(p.x);
  // Serial.print("Y: ");
  // Serial.println(p.y);

  switch (menu) {
    case 0:
      main_menu();

      p.x = map(p.x, 0, 240, 240, 0);
      p.y = map(p.y, 0, 320, 320, 0);

      // Daerah tekan tombol start
      if(p.x >= 200 && p.x <= 235 && p.y >= 123 && p.y <= 190){
        menu = 1;
      } 
      break;
    case 1:
      measurement_menu();

      p.x = map(p.x, 0, 240, 240, 0);
      p.y = map(p.y, 0, 320, 320, 0);

      // Tombol Save
      if(p.x >= 206 && p.x <= 240 && p.y >= 13 && p.y <= 87){
        menu = 2;
      } else if(p.x >= 206 && p.x <= 240 && p.y >= 100 && p.y <= 171){ 
        //tombol reset
        // resetValue();
      }

      break;
    case 2:
      input_age_gender_menu();

      p.x = map(p.x, 0, 240, 240, 0);
      p.y = map(p.y, 0, 320, 320, 0);

      // Input gender
      if(p.x >= 115 && p.x <= 135 && p.y >= 285 && p.y <= 308){
        gender = "man";
      } else if(p.x >= 141 && p.x <= 161 && p.y >= 285 && p.y <= 308){
        gender = "woman";
      }

      // Input angka
      if(p.x >= 69 && p.x <= 103 && p.y >= 160 && p.y <= 192){
        // Angka 1
        age = age * 10 + 1;
      } else if(p.x >= 69 && p.x <= 103 && p.y >= 114 && p.y <= 145){
        // Angka 2
        age = age * 10 + 2;
      } else if(p.x >= 69 && p.x <= 103 && p.y >= 68 && p.y <= 102){
        // Angka 3
        age = age * 10 + 3;
      } else if(p.x >= 69 && p.x <= 103 && p.y >= 23 && p.y <= 56){
        // Angka 0
        age = age * 10;
      } else if(p.x >= 115 && p.x <= 142 && p.y >= 160 && p.y <= 192){
        // Angka 4
        age = age * 10 + 4;
      } else if(p.x >= 115 && p.x <= 142 && p.y >= 114 && p.y <= 145){
        // Angka 5
        age = age * 10 + 5;
      } else if(p.x >= 115 && p.x <= 142 && p.y >= 68 && p.y <= 102){
        // Angka 6
        age = age * 10 + 6;
      } else if(p.x >= 115 && p.x <= 142 && p.y >= 23 && p.y <= 56){
        // C
        age = 0;
      } else if(p.x >= 160 && p.x <= 193 && p.y >= 160 && p.y <= 192){
        // Angka 7
        age = age * 10 + 7;
      } else if(p.x >= 160 && p.x <= 193 && p.y >= 114 && p.y <= 145){
        // Angka 8
        age = age * 10 + 8;
      } else if(p.x >= 160 && p.x <= 193 && p.y >= 68 && p.y <= 102){
        // Angka 9
        age = age * 10 + 9;
      } else if(p.x >= 160 && p.x <= 193 && p.y >= 23 && p.y <= 56){
        // S
        // age = age * 10 + 1;
      }

      // Tombol Save
      if(p.x >= 208 && p.x <= 240 && p.y >= 14 && p.y <= 85){
        menu = 3;
      }

      break;
    case 3:
      results_menu();

      p.x = map(p.x, 0, 240, 240, 0);
      p.y = map(p.y, 0, 320, 320, 0);

      // Tombol Restart
      if(p.x >= 194 && p.x <= 226 && p.y >= 11 && p.y <= 112){
        menu = 0;
      } 
      break;
  }
  
}


void starting_animation(){
  tft.setRotation(1);
  tft.fillScreen(ILI9341_BLACK);
  tft.setCursor(10, 100);
  tft.setTextColor(ILI9341_BLUE);
  tft.setTextSize(3);
  tft.print("Device Started");
  delay(500);

  tft.fillRect(10, 140, 50, 10, ILI9341_BLUE);
  delay(500);
  tft.fillRect(10, 140, 100, 10, ILI9341_BLUE);
  delay(500);
  tft.fillRect(10, 140, 150, 10, ILI9341_BLUE);
  delay(500);
  tft.fillRect(10, 140, 200, 10, ILI9341_BLUE);
  delay(500);
  tft.fillRect(10, 140, 250, 10, ILI9341_BLUE);
  delay(500);

  tft.fillScreen(ILI9341_BLACK);
  tft.setCursor(60, 100);
  tft.setTextColor(ILI9341_RED);
  tft.setTextSize(3);
  tft.print("Finish...");
  delay(500);

  tft.fillScreen(ILI9341_BLACK);
  tft.fillScreen(DARK_GREY);
  tft.fillRect(20, 10, 280, 70, ILI9341_BLACK);
}
 
void main_menu(){
  tft.setCursor(100, 20);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.print("Smart Body");
  tft.setCursor(100, 50);
  tft.print("Measurement");
  
  tft.setCursor(110, 90);
  tft.print("Group 2");

  tft.setCursor(60, 115);
  tft.print("Michael Theofilos");

  tft.setCursor(70, 135);
  tft.print("Evelyn Valencia");

  tft.setCursor(100, 155);
  tft.print("Viar Ghina");

  tft.setCursor(90, 175);
  tft.print("Hafizh Rifqi");

  // tombol start
  tft.fillRoundRect(130, 200, 70, 30, 10, RED);
  tft.setCursor(135, 210);
  tft.print("Start");
}

void measurement_menu(){
  tft.fillScreen(DARK_GREY);

  tft.fillRect(5, 0, 150, 200, ILI9341_BLACK);
  tft.fillRect(165, 0, 150, 200, ILI9341_BLACK);

  // Indikator Height
  tft.drawRect(15, 55, 125, 20, ILI9341_WHITE);
  tft.setTextSize(1);
  tft.setCursor(15, 45);
  tft.print("0");
  tft.setCursor(40, 45);
  tft.print("50");
  tft.setCursor(65, 45);
  tft.print("100");
  tft.setCursor(95, 45);
  tft.print("150");
  tft.setCursor(125, 45);
  tft.print("200");
  

   

  // Height
  tft.fillRect(15, 120, 130, 30, GREY);
  tft.setTextSize(2);
  tft.setCursor(40, 125);
  tft.print("Height");

  tft.fillRect(30, 160, 70, 30, GREY);
  tft.setCursor(35, 165);
  tft.print("163.5");

  tft.setCursor(115, 165);
  tft.print("CM");

  // Weight
  tft.fillRect(175, 120, 130, 30, GREY);
  tft.setCursor(200, 125);
  tft.print("Weight");

  tft.fillRect(190, 160, 70, 30, GREY);
  tft.setCursor(195, 165);
  tft.print("55");
  
  tft.setCursor(275, 165);
  tft.print("KG");

  // Tombol reset
  tft.fillRoundRect(150, 210, 70, 30, 10, RED);
  tft.setCursor(155, 215);
  tft.print("Reset");

  // Tombol save
  tft.fillRoundRect(235, 210, 70, 30, 10, RED);
  tft.setCursor(240, 215);
  tft.print("Save");

  delay(200000);

}

void input_age_gender_menu(){
  tft.fillScreen(DARK_GREY);

  tft.fillRect(5, 5, 310, 200, ILI9341_BLACK);
  tft.setCursor(30, 15);
  tft.setTextSize(2);
  tft.print("Insert Age and Gender");

  tft.fillRect(35, 45, 60, 50, GREY);
  tft.setCursor(50, 60);
  tft.setTextSize(3);
  tft.print(age);
  
  // Gender
  if(gender == "man"){
    tft.fillCircle(25, 125, 10, GREY);
    tft.fillCircle(25, 125, 5, ILI9341_WHITE);
    tft.setCursor(45, 116);
    tft.setTextSize(2);
    tft.print("MAN");

    tft.fillCircle(25, 150, 10, GREY);
    tft.setCursor(45, 141);
    tft.print("WOMAN");
  } else {
    tft.fillCircle(25, 125, 10, GREY);
    tft.setCursor(45, 116);
    tft.setTextSize(2);
    tft.print("MAN");

    tft.fillCircle(25, 150, 10, GREY);
    tft.fillCircle(25, 150, 5, ILI9341_WHITE);
    tft.setCursor(45, 141);
    tft.print("WOMAN");
  }

  // Number pad
  // Angka 1, 4, 7
  tft.fillRect(130, 70, 30, 30, GREY);
  tft.setCursor(140, 80);
  tft.print("1");

  tft.fillRect(130, 115, 30, 30, GREY);
  tft.setCursor(140, 125);
  tft.print("4");

  tft.fillRect(130, 160, 30, 30, GREY);
  tft.setCursor(140, 170);
  tft.print("7");

  // Angka 2, 5, 8
  tft.fillRect(175, 70, 30, 30, GREY);
  tft.setCursor(185, 80);
  tft.print("2");

  tft.fillRect(175, 115, 30, 30, GREY);
  tft.setCursor(185, 125);
  tft.print("5");

  tft.fillRect(175, 160, 30, 30, GREY);
  tft.setCursor(185, 170);
  tft.print("8");

  // Angka 3, 6, 9
  tft.fillRect(220, 70, 30, 30, GREY);
  tft.setCursor(230, 80);
  tft.print("3");

  tft.fillRect(220, 115, 30, 30, GREY);
  tft.setCursor(230, 125);
  tft.print("6");

  tft.fillRect(220, 160, 30, 30, GREY);
  tft.setCursor(230, 170);
  tft.print("9");

  // 0, C, S
  tft.fillRect(265, 70, 30, 30, GREY);
  tft.setCursor(275, 80);
  tft.print("0");

  tft.fillRect(265, 115, 30, 30, ILI9341_GREEN);
  tft.setCursor(275, 125);
  tft.print("C");

  tft.fillRect(265, 160, 30, 30, RED);
  tft.setCursor(275, 170);
  tft.print("S");

  // Tombol save
  tft.fillRoundRect(235, 210, 70, 30, 10, RED);
  tft.setCursor(240, 215);
  tft.print("Save");

}

void results_menu(){
  tft.fillScreen(DARK_GREY);
  
  tft.setCursor(114, 15);
  tft.setTextSize(2);
  tft.print("RESULTS");

  // BMI
  tft.fillRect(5, 35, 95, 150, ILI9341_BLACK);
  tft.setCursor(30, 45);
  tft.setTextSize(2);
  tft.print("BMI");

  tft.fillRect(15, 90, 75, 75, GREY);
  tft.setCursor(30, 110);
  tft.setTextSize(4);
  tft.print("XX");

  // FMI
  tft.fillRect(110, 35, 95, 150, ILI9341_BLACK);
  tft.setCursor(135, 45);
  tft.setTextSize(2);
  tft.print("FMI");

  tft.fillRect(120, 90, 75, 75, GREY);
  tft.setCursor(135, 110);
  tft.setTextSize(4);
  tft.print("XX");

  // TBW
  tft.fillRect(215, 35, 95, 150, ILI9341_BLACK);
  tft.setCursor(240, 45);
  tft.setTextSize(2);
  tft.print("TBW");

  tft.fillRect(225, 90, 75, 75, GREY);
  tft.setCursor(240, 110);
  tft.setTextSize(4);
  tft.print("XX");

  // Tombol restart
  tft.fillRoundRect(210, 195, 100, 30, 10, RED);
  tft.setCursor(215, 205);
  tft.setTextSize(2);
  tft.print("Restart");

}