#include "tracer.h"
#include <iostream>
#include "DateFormat.h"
#include "MyStringUtils.h"

#ifdef _MSC_VER
#include "windows.h"
#endif

Trace_Level_t Tracer::traceLevel = Trace_Level_Debug;
Tracer::Tracer()
{

}

Tracer::~Tracer() {

}

void Tracer::setConsoleColor(int color) {
#ifdef _MSC_VER
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hConsole, color);
#endif
}

bool Tracer::json(string tag, cJSON* root)
{
	if (cJSON_IsNull(root)) {
		return false;
	}

	char* temp = cJSON_Print(root);
	if (temp == NULL) {
		return false;
	}
	logger(tag, temp);
	cJSON_free(temp);
	return true;
}

void Tracer::error(string tag, string msg)
{
	if (traceLevel >= Trace_Level_Error) {
		if (msg.length() < 4096) {
			setConsoleColor(FOREGROUND_RED); // 红色
			saveLogger(" [error] >> ", tag, msg);
			setConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
		}
	}
}

void Tracer::warn(string tag, string msg)
{
	if (traceLevel >= Trace_Level_Warn) {
		saveLogger("[warn]>> ", tag, msg);
	}
}

void Tracer::info(string tag, string msg)
{
	if (traceLevel >= Trace_Level_Info) {
		saveLogger("[info]>> ", tag, msg);
	}
}

void Tracer::debug(string tag, string msg)
{
	if (traceLevel >= Trace_Level_Debug) {
		saveLogger("[debug]>> ", tag, msg);
	}
}

void Tracer::logger(string tag, string msg, string level)
{
	if (traceLevel >= Trace_Level_Logger) {
		if (level._Equal("[logger]"))
		{
			if (tag.size() == 0)
				tag = "null";
			else if (msg.size() == 0)
				msg = "null";
			saveLogger(level + ">> ", tag, msg);
		}
		else {
			saveLogger(level, msg, tag);
		}
	}
}

void Tracer::hex(string tag, unsigned char* msg, int len)
{
	if (len <= 4096) {
		if (traceLevel >= Trace_Level_Debug) {
			char* tempBuff = (char*)malloc(2 * len + 1);
			if (tempBuff != NULL) {
				for (int i = 0; i < len; i++)
				{
					if (len > 6 && (i > 3 && i < len - 3)) {
						sprintf(tempBuff + 2 * i, "%s", "**");
					}
					else {
						sprintf(tempBuff + 2 * i, "%02X", msg[i]);
					}
				}
				saveLogger("[hex]>> ", tag, tempBuff);
				free(tempBuff);
			}
		}
	}
}

int Tracer::getTraceLevel()
{
	return traceLevel;
}

int Tracer::setTraceLevel(int v)
{
	if (v >= Trace_Level_Off && v <= Trace_Level_Debug) {
		traceLevel = (Trace_Level_t)v;
		return true;
	}

	return false;
}

string Tracer::currentTimestamp(void) {
	return Dateformat::currentTimeString();
}

void Tracer::saveLogger(string levelString, string tag, string msg)
{
#if true
	append2Console(levelString, MyStringUtils::UTF8ToGBK(tag), MyStringUtils::UTF8ToGBK(msg));
#else
	append2File(levelString, UTF8ToGBK(tag), UTF8ToGBK(msg));
#endif
}

void Tracer::append2Console(string levelString, string tag, string msg) {
	//配合后台日志解析，删除当前时间戳打印，统一由APP打印
#if true
	if (msg.empty()) {
		cout << levelString << " " << tag << endl;
	}
	else {
		cout << levelString << " " << tag << " " << msg << endl;
	}
#else
	if (msg.empty()) {
		cout << Dateformat::currentTimeString() << " " << levelString << " " << tag << endl;
	}
	else {
		cout << Dateformat::currentTimeString() << " " << levelString << " " << tag << " " << msg << endl;
	}
#endif
	fflush(stdout);
}

void Tracer::append2File(string levelString, string tag, string msg) {

	fstream f;
	f.open("./trace.txt", ios::out | ios::app);
	if (f.is_open())
		f << currentTimestamp() << levelString << tag << " : " << msg << endl;
	f.close();
}