#pragma once
#include "LogClass.h"

enum TraceSeverity
{
    TraceError = 0x00000001,
    TraceWarning = 0x00000002,
    TraceNotice = 0x00000003,
    TraceInfo = 0x00000004,
    TraceDebug = 0x00000005,
    TraceVerbose = 0x00000006,
};

#ifndef _WIN32
#define __interface struct
#endif

__interface CTraceModule
{
    virtual void Write(uint32_t module, uint8_t severity, const char * file, int line, const char * function, const char * Message) = 0;
    virtual void FlushTrace() = 0;
};

class CTraceFileLog : public CTraceModule
{
public:
    CTraceFileLog(const char * FileName, bool FlushFile, CLog::LOG_OPEN_MODE eMode, size_t dwMaxFileSize = 5);
    virtual ~CTraceFileLog();

    void SetFlushFile(bool bFlushFile);
    void Write(uint32_t module, uint8_t severity, const char * file, int line, const char * function, const char * Message);
    void FlushTrace (void);

private:
    CLog m_hLogFile;
    bool m_FlushFile;
};

#ifdef _WIN32
#define WriteTrace(m, s, format, ...) if(g_ModuleLogLevel[(m)] >= (s)) { WriteTraceFull((m), (s), __FILE__, __LINE__, __FUNCTION__, (format), ## __VA_ARGS__); }
#else
#define WriteTrace(m, s, format, ...) if(g_ModuleLogLevel[(m)] >= (s)) { WriteTraceFull((m), (s), __FILE__, __LINE__, __PRETTY_FUNCTION__, (format), ## __VA_ARGS__); }
#endif

CTraceModule * TraceAddModule(CTraceModule * TraceModule);
CTraceModule * TraceRemoveModule(CTraceModule * TraceModule);
const char * TraceSeverity(uint8_t severity);
const char * TraceModule(uint32_t module);
void TraceSetModuleName(uint8_t module, const char * Name);
void CloseTrace(void);

void WriteTraceFull(uint32_t module, uint8_t severity, const char * file, int line, const char * function, const char *format, ...);
void TraceFlushLog(void);
void TraceSetMaxModule(uint32_t MaxModule, uint8_t DefaultSeverity);

extern uint32_t * g_ModuleLogLevel;