// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi

// https://forum.arduino.cc/t/wortuhr-ohne-uhrzeit-aber-mit-wochentagen/1295848

#define TEST_MODE

#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);

#define NTP_SERVER     "pool.ntp.org"
#define UTC_OFFSET     0
#define UTC_OFFSET_DST 0

void spinner() {
  static int8_t counter = 0;
  const char* glyphs = "\xa1\xa5\xdb";
  LCD.setCursor(15, 1);
  LCD.print(glyphs[counter++]);
  if (counter == strlen(glyphs)) {
    counter = 0;
  }
}

constexpr char* weekday[] = { "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Sonnabend"};
int lastWeekday = -1;

void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    LCD.clear();
    LCD.setCursor(0, 1);
    LCD.println("Connection Err");
    return;
  }

#if defined(TEST_MODE)
  if (lastWeekday != timeinfo.tm_sec % 7)
  {
    LCD.clear();
    lastWeekday = timeinfo.tm_sec % 7;
  
    LCD.setCursor(3, 0);
    LCD.println("Heute ist");
    LCD.setCursor(3, 1);
    LCD.println(weekday[timeinfo.tm_sec % 7]);    // nur zum Testen 
  }
#else
  if (lastWeekday != timeinfo.tm_wday)
  {
    LCD.clear();
    lastWeekday = timeinfo.tm_wday;
  
    LCD.setCursor(3, 0);
    LCD.println("Heute ist");
    LCD.setCursor(3, 1);
    LCD.println(weekday[timeinfo.tm_wday]);
  }
#endif
}

void setup() {
  Serial.begin(115200);

  LCD.init();
  LCD.backlight();
  LCD.setCursor(0, 0);
  LCD.print("Connecting to ");
  LCD.setCursor(0, 1);
  LCD.print("WiFi ");

  WiFi.begin("Wokwi-GUEST", "", 6);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    spinner();
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.println("Online");
  LCD.setCursor(0, 1);
  LCD.println("Updating time...");

  configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}

void loop() {
  printLocalTime();
  delay(250);
}