#ifndef __UNIFIED_LOG_H__
#define __UNIFIED_LOG_H__

#ifdef LOG_TAG_STR
#ifdef LOG_TAG
#undef LOG_TAG
#endif

#define LOG_TAG LOG_TAG_STR
#endif

typedef enum {
    ENCRYPTION_LOG = 0,
    ISSUED_LOG,
    SECUREHW_LOG,
    LOG_TYPE_MAX,
} LOG_TYPE;

#define LOG_ENCRYPTION_MAGIC_CODE   "SMSTRAON"
#define LOG_MAGIC_CODE              "GEMSTONE"

#define UNIT_LOG_MSG_LEN            512
#define MAX_LOG_FILE_LEN            307200 // 300KB
#define MAX_PDP_FILE_LEN            265
#define NORMAL_ISSUED_LOG_LINE_LEN  80

#ifdef USE_ANDROID
#include <android/log.h>
#include <utils/Mutex.h>
using namespace android;
#define PLATFORM_LOGCAT(fmt, ...)     __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, fmt, ##__VA_ARGS__)
#define PLATFORM_LOGCATDBG(fmt, ...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##__VA_ARGS__)
#else
#include <stdio.h>
#define PLATFORM_LOGCAT(fmt, ...)      printf(fmt, ##__VA_ARGS__)
#define PLATFORM_LOGCATDBG(fmt, ...)   printf(fmt, ##__VA_ARGS__)
#endif /* End of USE_ANDROID */

class DRKLog
{
public:
    static void LogMsg(char level, const char *format, ...);
    static void LogHex(char *data, int len);
    static void IssuedLogMsg(int32_t retCode);
    static void PrintIssuedLog();
    static void InitIssuedLog();
    static int  SaveNwdLog();
    static int  SaveLog(LOG_TYPE logType, uint8_t *data, uint32_t dataLen);
    static int  GetLog(LOG_TYPE logType, uint8_t **data);
public:
    static Mutex mLogLock;
};

#define GETLOG(x, y)            DRKLog::GetLog((x),(y))
#define SAVELOG(x, y, z)        DRKLog::SaveLog((x),(y),(z))
#define SAVENWDLOG()            DRKLog::SaveNwdLog()
#define SAVEISSUELOG(x)         DRKLog::IssuedLogMsg((x))
#define LOGME(fmt, ...)         DRKLog::LogMsg('E', fmt, ##__VA_ARGS__)
#define LOGMI(fmt, ...)         DRKLog::LogMsg('I', fmt, ##__VA_ARGS__)
#ifdef USE_RELEASE
#define LOGMD(fmt, ...)
#define LOGBD(x, y)
#else
#define LOGMD(fmt, ...)         DRKLog::LogMsg('D', fmt, ##__VA_ARGS__)
#define LOGBD(y, z)             DRKLog::LogHex((y), (z))
#endif

#define PRINT_FUNC_START(x)     LOGMI("cmd [%X] start...", (x))
#define PRINT_FUNC_END(x, y)    LOGMI("cmd [%X] end...[%d]", (x), (y)); SAVENWDLOG()

#endif /* __UNIFIED_LOG_H__ */
