#pragma once

#include "GdCPP_Exports.h"

#include <filesystem>
namespace fs = std::filesystem;

#include "spdlog/spdlog.h"
#include "spdlog/fmt/chrono.h" // support for user defined types
#include "spdlog/fmt/fmt.h"
#include "spdlog/fmt/ostr.h" // support for user defined types
#include "spdlog/fmt/xchar.h"
#include "spdlog/fmt/bundled/printf.h"

// aLogInit() 初始化时的flag枚举
enum eLogFlag
{
	// 初始化时是否开启console log。
	// 调用aLogInit()文件log是必须的，console log是可选的
	// 如果只开console log，调用aLogInitConsole()即可
	INIT_CONSOLE_LOG = 1 << 0,

	// 是否单独开一个error和warning的log文件。
	// 默认不开启。
	INIT_ERROR_FILE_LOG = 1 << 1,

	// 文件log是否滚动存储
	// 不设置（默认）：每次启动时，都重新创建一个新的log文件，文件名添加时间戳以区分。
	// 设置了，aLogInit()的logfilesize_M设置单个文件大小，logfilenum设置最多文件数
	INIT_ROLL_FILE_LOG	= (1<<2)
};

//app全局通用的logger实例
GDCPP_API extern std::shared_ptr<spdlog::logger> alog;

GDCPP_API extern spdlog::sink_ptr pConsoleSink;
GDCPP_API extern spdlog::sink_ptr pFileSink;
GDCPP_API extern spdlog::sink_ptr pFileSink2;

// 初始化文件 + Console logger。其中文件logger是必选，Console可选
GDCPP_API void InitRollFileLog(std::shared_ptr<spdlog::logger>& log, const char* logname, int flag, const fs::path & logdir, const std::wstring & filename, int logfilesize_K, int logfilenum = 16);
inline void aLogInitRollFileLog(int flag, const fs::path& logdir, const std::wstring& filename, int logfilesize_K, int logfilenum = 16)
{
	InitRollFileLog(alog, "", flag, logdir, filename, logfilesize_K, logfilenum);
}
GDCPP_API void InitBasicFileLog(std::shared_ptr<spdlog::logger>& log, const char* logname, int flag, const fs::path& logdir, const std::wstring& filename);
inline void aLogInitBasicFileLog(int flag, const fs::path& logdir, const std::wstring& filename)
{
	InitBasicFileLog(alog, "", flag, logdir, filename);
}
// 仅开Console log
GDCPP_API void aLogInitConsole();

// 关闭log
// aLogInit()、aLogInitConsole()初始化的资源，都在这里释放
GDCPP_API void LogDeinit(std::shared_ptr<spdlog::logger>& log, bool byelog=true);
inline void aLogDeinit(bool byelog = true)
{
	LogDeinit(alog, byelog);
}

// 如果已经打开了Console Log，关闭掉
// aLogInit()启动的log，console可以中途打开、关闭。
// aLogInitConsole()启动的log也可以，但没有必要
GDCPP_API void closeConsoleLog();

// 如果没开启Console log，打开
// aLogInit()启动的log，console可以中途打开、关闭。
// aLogInitConsole()启动的log也可以，但没有必要
GDCPP_API void openConsoleLog();
