// быстрый старт
#include <Arduino.h>
#include <EEPROM.h>
struct LoginPass {
  char ssid[20];
  char pass[20];
};
LoginPass lp;
bool flag = false;
uint32_t btnTimer = 0;
bool hold = 0;
bool valve = 0;
// подключаем библиотеку и настраиваем устройство
#include <GyverHub.h>
GyverHub hub("MyDevices", "ESP8266", "");
// иконки
// https://fontawesome.com/v5/cheatsheet/free/solid
// https://fontawesome.com/v5/search?o=r&m=free&s=solid
// переменные для интерфейса
//GH_BOOL button=0;
bool button = 0;
GHbutton b2;
GHbutton open;   //переменная для программной кнопки открыть
GHbutton close;  //переменная для программной кнопки закрыть
GHbutton save;   //переменная для программной кнопки сохранить настройки сети
bool start;      //переменная-флаг для запуска настройки сети если при старте нажата кнопка
uint8_t sld_i;
float sld_f;
String inp_str;
char inp_cstr[11];  // строка на 10 символов (+1 нулевой)
int16_t inp_int;
// это наш билдер. Он будет вызываться библиотекой
// для сборки интерфейса, чтения значений и проч.
void build() {
  if (start) {                                              //если при запуске была нажата кнопка, запускаем настройщик сети
    hub.Input(lp.ssid, GH_CSTR, F("название сети"));        //поле с назаванием сети, после ввода, нужно нажать стрелочку в конце поля
    hub.Input(lp.pass, GH_CSTR, F("пароль сети"), GH_RED);  //поле для ввода пароля, после ввода, нужно нажать стрелочку в конце поля
    hub.Button(&save, F("сохранить"), GH_RED);              //кнока сохранить настройки
    if (save) {                                             //если кнопку таки надавили...
      EEPROM.put(0, lp);                                    // сохраняем
      EEPROM.commit();                                      // записываем
      Serial.println();
      Serial.println(lp.ssid);
      Serial.println(lp.pass);
      WiFi.softAPdisconnect();  // отключаем AP
      start = 0;                //убираем флаг
    }
  } else {  //если кнопку при старте не давили, то запускаем основную морду
    // сделаем интерфейс в виде стильных виджетов
    // BeginWidgets() начинает новую горизонтальную строку виджетов
    hub.BeginWidgets();
    // ширина следующих виджетов задаётся в %
    hub.WidgetSize(50);
    // это кнопка без настроек
    // Кнопка - активный компонент: вернёт 1 если нажата
    if (hub.Button(&open, F("Открыть"), GH_GREEN)) valve = 1;
    // ко второй кнопке подключим переменную b2
    // она будет true, пока кнопка удерживается. Опросим её ниже в loop
    // добавим название и цвет
    if (hub.Button(&close, F("Закрыть"), GH_PINK)) valve = 0;
    hub.WidgetSize(50);
    hub.LED_(F("valveopen"), 0, "Открыто");
    hub.LED_(F("valveclose"), 0, "Закрыто");
    hub.WidgetSize(50);
    hub.LED_(F("btnState"), 0, "кнопка");  //индикатор нажатой кнопки
    hub.LED_(F("valve1"), 0, "сервер");    //индикатор ответа сервера
    hub.EndWidgets();
  }
}
void setup() {
  // hub.setupMQTT("m6.wqtt.ru", 15143); что то не заработало
  // читаем логин пароль из памяти
  EEPROM.begin(100);
  EEPROM.get(0, lp);
  Serial.begin(115200);
  pinMode(D1, INPUT_PULLUP);      //кнопка сидит тут
  pinMode(D4, OUTPUT);            // реле сидит тут
  if (digitalRead(D1)) {          //если кнопка нажата...
    start = 1;                    //поворачиваем флаг для выбора морды конфигурации сети
    WiFi.mode(WIFI_AP);           // сеть как точка доступа
    WiFi.softAP("Vankin_Wi-FI");  //название сети
    Serial.println();
    Serial.println("Точка доступа создана");
    Serial.println(WiFi.localIP());
  } else {  //если кнопка не нажата...
// если это ESP - подключаемся к WiFI
#ifdef GH_ESP_BUILD
    start = 0;                     //флаг для выбора морды основной программы
    WiFi.mode(WIFI_STA);           //сеть как клиент
    WiFi.begin(lp.ssid, lp.pass);  //параметры сети берем из памяти
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println();
    Serial.println(lp.ssid);
    Serial.println(lp.pass);
    Serial.println(WiFi.localIP());
    const char* login = "***";
    const char* pass = "***";
    hub.setupMQTT("m6.wqtt.ru", 15140, "[B][I]", "[/I][/B]", 0, 0);
    if (hub.online()) Serial.println("MQTT подключен");  // MQTT подключен)
#endif
  }
  // можно подключить обработчик веб-консоли
  // зайди в info/cli в приложении
  // или нажми ~ при открытом устройстве
  hub.onCLI([](String& s) {
    Serial.println(s);
    hub.print(s);  // отправить обратно
    // вдогонку отправим строку из Input inp_str
    hub.print(inp_str, GH_BLUE);
  });
  hub.onBuild(build);  // подключаем билдер
  hub.begin();         // запускаем систему
}
void loop() {
  hub.tick();                       // обязательно тикаем тут
  bool btnState = digitalRead(D1);  //читаем состояние кнопки
  //button = digitalRead(D1);
  // Serial.println(button);
  static GHtimer tmr(1000);  //таймер обновления состояния 1 сек
  if (tmr) {
    hub.sendUpdate("btnState", String(btnState));  //отправляем на морду состояние кноки
    hub.sendUpdate("valveopen", String(valve));
    hub.sendUpdate("valveclose", String(!valve));
    // hub.sendGet("valve", String(valve));
    //Serial.println(
   hub.sendGet("valve1", String(valve));
    // hub.sendGetAuto(valve);
    //hub.sendUpdate("valve1", String(valve));
  }
  if (open) valve = 1;
  if (close) valve = 0;
  // читаем инвертированное значение для удобства
  if (btnState && !flag && millis() - btnTimer > 100) {
    flag = 1;
    valve = !valve;
    btnTimer = millis();
    Serial.println(valve);
    hub.sendGet("btnState", String(btnState));
  }
  if (!btnState && flag && millis() - btnTimer > 100) {
    flag = false;
    btnTimer = millis();
    hub.sendGet("btnState", String(btnState));
  }
  if (valve) digitalWrite(D4, 1);
  else digitalWrite(D4, 0);
}