#pragma once

#include <QString>
#include <QLibrary>
#include <QTime>
#include <QElapsedTimer>
#include <QDebug>



#define DoLog(msg)      WRITE_LOG(QString("[%1:%2:%3] %4").arg(__FILE__, __FUNCTION__, QString::number(__LINE__), msg))
#define DoError(msg)    WRITE_ERROR(QString("[%1:%2:%3] %4").arg(__FILE__, __FUNCTION__, QString::number(__LINE__), msg))
#define DoDebug(msg)    WRITE_LOG_DEBUG(QString("[%1:%2:%3] %4").arg(__FILE__, __FUNCTION__, QString::number(__LINE__), msg))
#define MyLog(msg)      qDebug() << "[" << __FILE__ << __FUNCTION__ << __LINE__ << QTime::currentTime().toString("hh:mm:ss.zzz") << "]" << msg



#define LimitLog(interval, msg) \
    do{\
        static QElapsedTimer timer;\
        if (!timer.isValid()) {\
            timer.start();\
        }\
        if (timer.elapsed() >= interval) {\
            timer.restart();\
            DoLog(msg);\
        }\
    }while(0);

enum enLogType
{
    ELT_Log_ALL = 0,

    // Debug.ini[system]Debug=1生效
    ELT_Log_Debug,
    // 错误日志,不自动删除和清空
    ELT_Log_Error,
    // 文件日志,就一个文件,超过10M自动清空,如记录xml,json的信息
    ELT_Log_File,

    // 一定会输出的日志
    // 操作日志,如点击按钮,按快捷键
    ELT_Log_Operator,
    // 仅仅主程序记录,按键日志
    ELT_Log_KeyDown,
    // 通用日志,无特殊标记
    ELT_Log_Common,
};


#define LH_WRITE_LOG(msg)       WRITE_LOG(msg)
#define LH_WRITE_ERROR(msg)     WRITE_ERROR(msg)
#define LH_WRITE_LOG_DEBUG(msg) WRITE_LOG_DEBUG(msg)

extern void WRITE_LOG(QString log);
extern void WRITE_ERROR(QString log);
extern void WRITE_LOG_DEBUG(QString log);

class CLHQLogApi
{
public:
    CLHQLogApi();
    ~CLHQLogApi();

    bool Load(QString file);
    int DoInitial(QString strLogName);

    // 为了适应,一个进程多模块日志的功能,需要给出Log名称
    int DoWriteLogEx(QString strLogName, int nLogType, QString strLog);
    int DoWriteFileLog(QString strLogFilePath, QString strLog);
    int DoWriteLog(int nLogType, QString strLog);
private:
    typedef int (*FunDoInitial)(const char* szLogName);
    typedef int (*FunDoWriteLog)(const char* szLogName, int nLogType, const char* szLog);
    typedef int (*FunDoWriteFileLog)(const char* szFilePath, const char* szLog);
private:
    QLibrary m_QLib;
    QString m_strLogName;

    FunDoInitial        fnDoInitial;
    FunDoWriteLog       fnDoWriteLog;
    FunDoWriteFileLog   fnDoWriteFileLog;
};

extern CLHQLogApi g_apiLhQLog;