/* ===========================================================================
 *  time utilities
 *  see also: https://microcontrollerslab.com/getting-current-date-time-esp32-arduino-ide-ntp-server/
 *            time formatting: https://cplusplus.com/reference/ctime/strftime/
 */

#include "timeutils.h"

#include "RBPXPLRTERM_config.h"

boolean timeValidFlag = false;

void setTimeValid(boolean newTimeValid) {
  timeValidFlag = newTimeValid;
}

boolean timeValid() {
  return timeValidFlag;
}

int _getLocTim(struct tm * ti) {
#if defined(ENV_ESP32)
  int succ = getLocalTime(ti);
#elif defined(ENV_RP2040)
  int succ = 1;
  /*
  ti->tm_year = 125;
  ti->tm_mon  =   2;
  ti->tm_mday =  27;
  ti->tm_wday =   4;
  ti->tm_hour =  22;
  ti->tm_min  =  16;
  ti->tm_sec  =  59;
  succ = 1;
  */
  time_t now = time(nullptr);
  localtime_r(&now, ti);
#else
#error unrecognized ENV for _getLocTim
#endif
  if (!succ) {
    SERIAL_PRINTLN("getLocalTime() failed");
  }
  return succ;
}

String localTimeString() {
  return timeValid()?getTimeString():"<no-valid-local-time>";
}

void printLocalTime() {
  struct tm timeinfo;
  if(!_getLocTim(&timeinfo)){
    SERIAL_PRINTLN("Failed to obtain time");
    return;
  }
#if defined(ENV_ESP32)
  SERIAL_PRINTLN(&timeinfo, "%A, %B %d %Y %H:%M:%S");
#elif defined(ENV_RP2040)
  SERIAL_PRINTF("%04d-%02d-%02d %02d:%02d:%02d\n",timeinfo.tm_year+1900,timeinfo.tm_mon+1,timeinfo.tm_mday,timeinfo.tm_hour,timeinfo.tm_min,timeinfo.tm_sec);
#else
#error unrecognized ENV for printLocalTime
#endif
}

String tmformat(struct tm * timeinfo, const char * format)
{
    const char * f = format;
    if(!f){
        f = "%c";
    }
    char buf[64];
    size_t written = strftime(buf, 64, f, timeinfo);
    if(written == 0){
        return "could not format time";
    }
    return String(buf);
}

String getTimeString() {
  struct tm timeinfo;
  if (!_getLocTim(&timeinfo)) {
    return "Failed to obtain time";
  }
  return tmformat(&timeinfo, "%a %F %T TZOFS=\"%z\" TZ=\"%Z\"" /* "%A, %B %d %Y %H:%M:%S" */ );
}

String getTimeNum() {
  struct tm timeinfo;
  if (!_getLocTim(&timeinfo)) {
    return "NOTIME00000000000";
  }
  return tmformat(&timeinfo, "%Y%m%d%H%M%S" );
}

String getShortTimeString() {
  struct tm timeinfo;
  if (!_getLocTim(&timeinfo)) {
    return "<get-time-failed>";
  }
  return tmformat(&timeinfo, "%F %T" /* "%A, %B %d %Y %H:%M:%S" */ );
}

String localShortTimeString() {
  return timeValid()?getShortTimeString():"<noValLocTime>";
}
