
#ifndef _UTILS_TIME_UTIL_H_
#define _UTILS_TIME_UTIL_H_

#include <time.h>
#include <string>
#include <sstream>
#include "manager/LanguageManager.h"

class TimeUtil {
public:
	static bool setDataTimeByTimeDifference(std::string timeStr, int timeDifference) {
		time_t timet = stoi(timeStr);
		struct tm *t = gmtime(&timet);
		char pDate[25];
		sprintf(pDate,"%d-%02d-%02d %02d:%02d:%02d",
				1900 + t->tm_year, 1+ t->tm_mon, t->tm_mday,
				t->tm_hour + timeDifference,t->tm_min,t->tm_sec);
		return TimeHelper::setDateTime(pDate);
	}

	static time_t StringToDatetime(std::string str)
	{
		char *cha = (char*)str.data();             // 将string转换成char*。
		tm tm_;                                    // 定义tm结构体。
		int year, month, day, hour, minute, second;// 定义时间的各个int临时变量。
		sscanf(cha, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);// 将string存储的日期时间，转换为int临时变量。
		tm_.tm_year = year - 1900;                 // 年，由于tm结构体存储的是从1900年开始的时间，所以tm_year为int临时变量减去1900。
		tm_.tm_mon = month - 1;                    // 月，由于tm结构体的月份存储范围为0-11，所以tm_mon为int临时变量减去1。
		tm_.tm_mday = day;                         // 日。
		tm_.tm_hour = hour - 8;                        // 时。
		tm_.tm_min = minute;                       // 分。
		tm_.tm_sec = second;                       // 秒。
		tm_.tm_isdst = 0;                          // 非夏令时。
		time_t t_ = mktime(&tm_);                  // 将tm结构体转换成time_t格式。
		return t_;                                 // 返回值。
	}

	static std::string DatetimeToString(tm *t){
		//struct tm *t = TimeHelper::getDateTime();
		char timeStr[50];
		static const char *day[] = {
				LANGUAGEMANAGER->getValue("Sunday").c_str(),
				LANGUAGEMANAGER->getValue("Monday").c_str(),
				LANGUAGEMANAGER->getValue("Tuesday").c_str(),
				LANGUAGEMANAGER->getValue("Wednesday").c_str(),
				LANGUAGEMANAGER->getValue("Thursday").c_str(),
				LANGUAGEMANAGER->getValue("Friday").c_str(),
				LANGUAGEMANAGER->getValue("Saturday").c_str()};
		std::string formatStr = "%s %d"+LANGUAGEMANAGER->getValue("Year")+"%02d"+LANGUAGEMANAGER->getValue("Month")+"%02d"+LANGUAGEMANAGER->getValue("Day")+" %02d:%02d:%02d";
		sprintf(timeStr, formatStr.c_str(), day[t->tm_wday],1900 + t->tm_year, t->tm_mon + 1, t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
		std::string result = timeStr;
		return result;
	}

	static std::string InToTimeStirng(int time) {
		int hour, minute, second;// 定义时间的各个int临时变量。
		hour = time / 3600;
		minute = (time % 3600) / 60;
		second = (time % 3600) % 60 ;

		char timeStr[50];
		std::string formatStr = "%02d:%02d:%02d";
		sprintf(timeStr, formatStr.c_str(), hour, minute, second);
		std::string result = timeStr;
		return result;
	}

	static std::string getTimeStrOnTimeDifference(std::string str, int timeDifference, const char *format) {
		// 先把时间戳调整到对应时差
		time_t timet = stoi(str);
		struct tm *t = gmtime(&timet);
		char pDate[25];
		sprintf(pDate,"%d-%02d-%02d %02d:%02d:%02d",
				1900 + t->tm_year, 1+ t->tm_mon, t->tm_mday,
				t->tm_hour + timeDifference,t->tm_min,t->tm_sec);

		tm tm_;                                    // 定义tm结构体。
		int year, month, day, hour, minute, second;// 定义时间的各个int临时变量。
		sscanf(pDate, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);// 将string存储的日期时间，转换为int临时变量。
		tm_.tm_year = year - 1900;                 // 年，由于tm结构体存储的是从1900年开始的时间，所以tm_year为int临时变量减去1900。
		tm_.tm_mon = month - 1;                    // 月，由于tm结构体的月份存储范围为0-11，所以tm_mon为int临时变量减去1。
		tm_.tm_mday = day;                         // 日。
		tm_.tm_hour = hour;                        // 时。
		tm_.tm_min = minute;                       // 分。
		tm_.tm_sec = second;                       // 秒。
		tm_.tm_isdst = 0;                          // 非夏令时。
		time_t _timet = mktime(&tm_);                  // 将tm结构体转换成time_t格式。

		// 再转换成字符串
		struct tm *_t = gmtime(&_timet);
		char _pDate[25];
		sprintf(_pDate, format,
					1900 + _t->tm_year, 1+ _t->tm_mon, _t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
		std::string result = _pDate;
		return result;
	}

	static time_t getDateline() {
		struct tm *tm_ = TimeHelper::getDateTime();
//	    tm_->tm_year = tm_->tm_year - 1900;                 // 年，由于tm结构体存储的是从1900年开始的时间，所以tm_year为int临时变量减去1900。
//	    tm_->tm_mon = tm_->tm_mon - 1;                    // 月，由于tm结构体的月份存储范围为0-11，所以tm_mon为int临时变量减去1。
//	    tm_->tm_mday = tm_->tm_mday;                         // 日。
		tm_->tm_hour = tm_->tm_hour - 8;                        // 时。
//	    tm_->tm_min = tm_->tm_min;                       // 分。
//	    tm_->tm_sec = tm_->tm_sec;                       // 秒。
//	    tm_->tm_isdst = 0;                          // 非夏令时。

		time_t t_ = mktime(tm_);                  // 将tm结构体转换成time_t格式。
		return t_;                                 // 返回值。
	}

	static std::string getDatelineStr() {
		time_t rawtime = getDateline();
	    std::stringstream ss;
	    ss << rawtime;  // 将 time_t 转换为字符串
	    std::string timeStr = ss.str();
	    return timeStr;
	}
};
#endif /* _UTILS_TIME_UTIL_H_ */
