#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
extern "C" { 
  #include "user_interface.h"
}
const char* ssid = "WIFISSID"; 
const char* password = "***************"; 
const String self_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
const String serv_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
const String name = "IOT_lamp"; 
const String serverIP = "192.168.1.111"; 
bool lamp_on =  false;
bool can_toggle = false;
int button_state;
ESP8266WebServer server(80); 
HTTPClient http; 
const int lamp = 2; 
const int button = 0; 
void handleRoot() { 
  server.send(200, "text/plain", "Hello! I am " + name);
}
void handleNotFound(){
  String message = "not found";
  server.send(404, "text/plain", message);
}
void turnOnLamp(){
  digitalWrite(lamp, LOW);
  lamp_on = true;
}
void turnOffLamp(){
  digitalWrite(lamp, HIGH);
  lamp_on = false;
}
void sendServer(bool state){
  http.begin("http://"+serverIP+"/iapi/setstate");
  String post = "token="+self_token+"&state="+(state?"on":"off"); 
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  int httpCode = http.POST(post);
  http.end();  
}
void toggleLamp(){
  if(lamp_on == true) {
    turnOffLamp();
    sendServer(false);
  } else {
    turnOnLamp();
    sendServer(true);
  }
}
void handleOn(){
  String token = server.arg("token");
  if(serv_token != token) {
    String message = "access denied";
    server.send(401, "text/plain", message);
    return;
  }
  turnOnLamp();
  String message = "success";
  server.send(200, "text/plain", message);
}
void handleOff(){
  String token = server.arg("token");
  if(serv_token != token) {
    String message = "access denied";
    server.send(401, "text/plain", message);
    return;
  }
  turnOffLamp();
  String message = "success";
  server.send(200, "text/plain", message);
}
void initVariant() {
  uint8_t mac[6] = {0x00, 0xA3, 0xA0, 0x1C, 0x8C, 0x45};
  wifi_set_macaddr(STATION_IF, &mac[0]);
}
void setup(void){
  pinMode(lamp, OUTPUT);
  pinMode(button, INPUT_PULLUP); 
  turnOffLamp();
  WiFi.hostname(name);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  
  server.on("/", handleRoot);
  server.on("/on",  HTTP_POST, handleOn);
  server.on("/off", HTTP_POST, handleOff);
  server.onNotFound(handleNotFound);
  
  server.begin();
}
void loop(void){
  server.handleClient();
  
  button_state = digitalRead(button);
  if (button_state == HIGH && can_toggle) {
    toggleLamp();
    can_toggle = false;
    delay(500);
  } else if(button_state == LOW){
    can_toggle = true;
  }
}