#pragma once
#include <stdarg.h>
#include "../include/CookConfig.h"
#include <string>

U_NS_BEGIN_CATERING

class CCookLog
{
public:
    enum ELogPriority
    {
        U_LOG_PRI_TEST = 0x0000,  //  自动测试的等级
        U_LOG_PRI_NORM1,             //  U_LOG_PRI_NORM1~LOG_PRI_NORM6为普通日志输出等级
        U_LOG_PRI_NORM2,
        U_LOG_PRI_NORM3,
        U_LOG_PRI_NORM4,

        U_LOG_PRI_WRAN = 0xeff1,  //  警告的优先级
        U_LOG_PRI_ERROR = 0xeff2   //  错误的优先级
    };

    typedef void (*ULogHook)(const char* pLogContent);
    // 注册日志监听回调，应用系统需在创建菜谱实例之前进行注册，
    // 设置环境变量U_LOG_PRIORITY的值为1，可以关闭debug信息，设置为2，可以关闭info信息
    void InitHook(ULogHook logHook);
    // 获取sdk对应的版本号
    std::string GetSdkVer();
    // 仅内部使用
    void Output(const char* pFileName, int iLineNo, const char* pFuncName, ELogPriority eLogLevel, const char* format, ...);
    // 仅内部使用
    void Print(const char* pStr, bool bAddNewLine = true, bool bWriteToDefaultFile = true);
    // 仅内部使用，用于设置日志输出的文件名
    void SetOutputFileName(const char* pPath);
    static CCookLog& Instance(){
        return gInstance;
    }
private:
    void WriteLogToFile(const char* szString, const char* pPath);
    int GetCurTime(char* strTime);
    bool NeedLogout(ELogPriority eLogLevel);
    U_DISABLE_CONSTRUCT_AND_COPY(CCookLog)
    static CCookLog gInstance;

private:
    ULogHook m_logHook;
};

//#define U_DISABLE_LOG

#define COOKLOG CCookLog::Instance()

#ifndef U_DISABLE_LOG
#define COOK_LOG_NONE(str, addNewLine) COOKLOG.Print(str, addNewLine, false)
#define COOK_LOG_DEBUG(...) COOKLOG.Output(__FILE__, __LINE__, __FUNCTION__, CCookLog::U_LOG_PRI_TEST, __VA_ARGS__)
#define COOK_LOG_INFO(...) COOKLOG.Output(__FILE__, __LINE__, __FUNCTION__, CCookLog::U_LOG_PRI_NORM1, __VA_ARGS__)
#define COOK_LOG_WARN(...) COOKLOG.Output(__FILE__, __LINE__, __FUNCTION__, CCookLog::U_LOG_PRI_WRAN, __VA_ARGS__)
#define COOK_LOG_ERROR(...) COOKLOG.Output(__FILE__, __LINE__, __FUNCTION__, CCookLog::U_LOG_PRI_ERROR, __VA_ARGS__)
#else
#define COOK_LOG_NONE(...)
#define COOK_LOG_DEBUG(...)
#define COOK_LOG_INFO(...)
#define COOK_LOG_ERROR(...)
#define COOK_LOG_WARN(...)
#endif

U_NS_END_CATERING


