#define WIFI_NAME "WiFi Name"
#define WIFI_PASSWORD "Password"
#define DEVICE_ID 3
#define DEVICE_NAME "YouTube_Info"
#define TOKEN "Token"
#define btn D1


#include <RemoteMe.h>
#include <RemoteMeSocketConnector.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include<LiquidCrystal.h>

LiquidCrystal lcd(D2, D3, D5, D6, D7, D8);

int16_t i, i1, i2, temp, pres;
int32_t subs, views;
String hr, wr;


long lastDebounceTime = 0, debounceDelay = 50;


ESP8266WiFiMulti WiFiMulti;

RemoteMe& remoteMe = RemoteMe::getInstance(TOKEN, DEVICE_ID);

//*************** CODE FOR CONFORTABLE VARIABLE SET *********************


//*************** IMPLEMENT FUNCTIONS BELOW *********************


void onWeatherChange(int16_t i1, int16_t i2,String s1,String s2) 
{
    temp = i1;
    pres = i2;
    hr = s1;
    wr = s2;
}

void onYouTube_SubscribersChange(int32_t i) 
{
    subs = i;
}

void onYouTube_ViewsChange(int32_t i) 
{
    views = i;
}


void youtube()
{
  Serial.printf("Subscribers : %d\n", subs);
  Serial.printf("Views : %d\n", views);
  
  lcd.clear();
  lcd.printf("Subscribers : %d", subs);
  lcd.setCursor(0,1);
  lcd.printf("Views : %d", views);
  lcd.setCursor(0,0);
}

void weather()
{
  Serial.printf("Temparature : %d °C\n", temp);
  Serial.printf("Pressure : %d Pa\n", pres);

  lcd.clear();
  lcd.printf("Temparature : %d", temp);
  lcd.setCursor(0,1);
  lcd.printf("Pressure : %d", pres);
  lcd.setCursor(0,0);
}

void timee()
{
  Serial.println(hr);
  Serial.println(wr);

  lcd.clear();
  lcd.print(hr);
  lcd.setCursor(0,1);
  lcd.print(wr);
  lcd.setCursor(0,0);
}

void setup() 
{
    Serial.begin(9600);
    lcd.begin(16, 2);

    pinMode(btn, INPUT);
    Serial.begin(9600);
    WiFiMulti.addAP(WIFI_NAME, WIFI_PASSWORD);
    while (WiFiMulti.run() != WL_CONNECTED) 
    {
        delay(100);
    }

    remoteMe.getVariables()->observeSmallInteger2Text2("Weather" ,onWeatherChange);
    remoteMe.getVariables()->observeInteger("YouTube Subscribers" ,onYouTube_SubscribersChange);
    remoteMe.getVariables()->observeInteger("YouTube Views" ,onYouTube_ViewsChange);
    remoteMe.setConnector(new RemoteMeSocketConnector());
    remoteMe.sendRegisterDeviceMessage(DEVICE_NAME);

    Serial.print("Connected...");
    lcd.print("Connected...");
}


void loop() 
{
  int btn_state = LOW;
  static int flag = 0;
  
     btn_state = digitalRead(btn);
     if((millis() - lastDebounceTime) > debounceDelay)
     {
       if((btn_state == HIGH) && (flag == 0))
       {
         lcd.clear();
         weather();
         flag = 1;
       }
       else if((btn_state == HIGH) && (flag == 1))
       {
         lcd.clear();
         youtube();
         flag = 2;
       }
       else if((btn_state == HIGH) && (flag == 2))
       {
         lcd.clear();
         timee();
         flag = 0;
       }
       lastDebounceTime = millis();
       Serial.println(flag);
     }
    remoteMe.loop();
}
