/*
 * time.cpp
 *
 *  Created on: 2022年8月18日
 *      Author: pengzc
 */

#include "time.h"

namespace base {

DateTime::DateTime() {
}

DateTime::DateTime(time_t timestamp) {
  struct tm *t = localtime(&timestamp);
  year = t->tm_year + 1900;
  month = t->tm_mon + 1;
  day = t->tm_mday;
  hour = t->tm_hour;
  min = t->tm_min;
  second = t->tm_sec;
  week = t->tm_wday;
}

DateTime::DateTime(const std::string& datetime) {
    sscanf(datetime.c_str(), "%d-%d-%d %d:%d:%d",
        &year, &month, &day, &hour, &min, &second);
}


std::string DateTime::ToString() {
    char buf[64] = {0};
    snprintf(buf, int(sizeof(buf)),
        "%04d-%02d-%02d %02d:%02d:%02d",
        year, month, day, hour, min, second);
    return buf;
}

// 开机累计毫秒
int64_t uptime() {
    struct timespec ts;
    clock_gettime(CLOCK_BOOTTIME, &ts);
    return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
}

void SetSystemDateTime(time_t timestamp) {
  TimeHelper::setDateTime(gmtime(&timestamp));
}

void SetSystemDateTime(const DateTime& dt) {
  struct tm t = *TimeHelper::getDateTime();
  t.tm_year = dt.year - 1900;
  t.tm_mon = (dt.month - 1) % 12; //[0,11]
  t.tm_mday = dt.day % 32; //[1,31]
  t.tm_hour = dt.hour % 24; //[0,23]
  t.tm_min = dt.min % 60; //[0,59]
  t.tm_sec = dt.second % 60; //[0,59]
  TimeHelper::setDateTime(&t);
}

class DateTime GetBuildDateTime() {
  std::string monthes[] = {
      "Jan",
      "Feb",
      "Mar",
      "Apr",
      "May",
      "Jun",
      "Jul",
      "Aug",
      "Sep",
      "Oct",
      "Nov",
      "Dec",
  };

  std::string dateStr = __DATE__;
  int year = atoi(dateStr.substr(dateStr.length() - 4).c_str());
  int month = 0;
  for (int i = 0; i < 12; i++) {
      if (dateStr.find(monthes[i]) != std::string::npos) {
          month = i + 1;
          break;
      }
  }
  std::string dayStr = dateStr.substr(4, 2);
  int day = atoi(dayStr.c_str());
  std::string timeStr = __TIME__;
  std::string hourStr = timeStr.substr(0, 2);
  int hour = atoi(hourStr.c_str());
  std::string minStr = timeStr.substr(3, 2);
  int min = atoi(minStr.c_str());
  std::string secondStr = timeStr.substr(6, 2);
  int second = atoi(secondStr.c_str());

  DateTime dt;
  dt.year = year;
  dt.month = month;
  dt.day = day;
  dt.hour = hour;
  dt.min = min;
  dt.second = second;
  return dt;
}

class DateTime GetDateTimeNow() {
  DateTime now;
  struct tm *t = TimeHelper::getDateTime();
  now.year = t->tm_year + 1900;
  now.month = t->tm_mon + 1;
  now.day = t->tm_mday;
  now.hour = t->tm_hour;
  now.min = t->tm_min;
  now.second = t->tm_sec;
  now.week = t->tm_wday;
  return now;
}

int64_t DateTime::Unix() const {
  struct tm t = *TimeHelper::getDateTime();
  t.tm_year = year - 1900;
  t.tm_mon = (month - 1) % 12; //[0,11]
  t.tm_mday = day % 32; //[1,31]
  t.tm_hour = hour % 24; //[0,23]
  t.tm_min = min % 60; //[0,59]
  t.tm_sec = second % 60; //[0,59]
  return mktime(&t);
}

DateTime DateTime::Add(int64_t seconds) {
  int64_t unix_time = Unix();
  unix_time += seconds;
  return DateTime(unix_time);
}

} /* namespace */




