#ifndef __DBG_H__
#define __DBG_H__

//#define USE_DEBUG_MESSAGE  //default: disable
//#define USE_DUMP_DATA  //default: disable

#ifdef USE_DEBUG_MESSAGE

#define printE(msg, arg...)    do {    TA_LOG_FUNC(TA_LOG_LEVEL_ERR, "[TAD]E:%s(%d):" msg "\n", __FUNCTION__, __LINE__, ## arg);    } while (FALSE)
#define printW(msg, arg...)    do {    TA_LOG_FUNC(TA_LOG_LEVEL_ERR, "[TAD]W:%s(%d):" msg "\n", __FUNCTION__, __LINE__, ## arg);    } while (FALSE)
#define printI(msg, arg...)    do {    TA_LOG_FUNC(TA_LOG_LEVEL_INF, "[TAD]I:%s(%d):" msg "\n", __FUNCTION__, __LINE__, ## arg);    } while (FALSE)
#define printD(msg, arg...)    do {    TA_LOG_FUNC(TA_LOG_LEVEL_INF, "[TAD]D:%s(%d):" msg "\n", __FUNCTION__, __LINE__, ## arg);    } while (FALSE)
#define printBlob(arr, msg)                                                                         \
do {                                                                                                \
    const uint8 hexStr[] = "0123456789ABCDEF";                                                       \
    uint32 margin = 0;                                                                                 \
    uint8 logBuffer[256];                                                                            \
    uint32 i;                                                                                          \
    memset(logBuffer, 0, 256);                                                                      \
    printD("------------------------------[ byte dump. %s ]------------------------------", (msg)); \
    printD("length:%d", (arr).length);                                                              \
    for (i = 0; i < (arr).length; i++) {                                                            \
        logBuffer[margin++] = '0';                                                                  \
        logBuffer[margin++] = 'x';                                                                  \
        logBuffer[margin++] = hexStr[(arr).data[i] >> 4];                                           \
        logBuffer[margin++] = hexStr[(arr).data[i] & 0xF];                                          \
        logBuffer[margin++] = ',';                                                                  \
        logBuffer[margin++] = ' ';                                                                  \
        if ((margin / 6) == 16) {                                                                   \
            printD("%s", logBuffer);                                                                \
            memset(logBuffer, 0, 256);                                                              \
            margin = 0;                                                                             \
        } else if (i + 1 == (arr).length) {                                                         \
            logBuffer[margin - 2] = ' ';                                                            \
            printD("%s", logBuffer);                                                                \
            memset(logBuffer, 0, 256);                                                              \
            margin = 0;                                                                             \
        }                                                                                           \
    }                                                                                               \
    printD("----------------------------[ byte dump end. %s ]----------------------------", (msg)); \
} while (0);
#else   //USE_DEBUG_MESSAGE
#define printE(msg, arg...)    do {    TA_LOG_FUNC(TA_LOG_LEVEL_ERR, "[TAD]E: " msg "\n", ## arg);    } while (FALSE)
#define printW(msg, arg...)    do {    TA_LOG_FUNC(TA_LOG_LEVEL_ERR, "[TAD]W: " msg "\n", ## arg);    } while (FALSE)
#define printI(msg, arg...)    do {    TA_LOG_FUNC(TA_LOG_LEVEL_INF, "[TAD]I: " msg "\n", ## arg);    } while (FALSE)
#define printD(msg, arg...)
#define printBlob(arr, msg)
#endif  //USE_DEBUG_MESSAGE


#if defined USE_QSEE

#include "qsee_log.h"
#undef QSEE_LOG
#define QSEE_LOG(xx_prio, xx_fmt, ...) qsee_log(xx_prio, #xx_fmt, ##__VA_ARGS__)
#define TA_LOG_FUNC                       QSEE_LOG
#define TA_LOG_LEVEL_ERR                  QSEE_LOG_MSG_ERROR
#define TA_LOG_LEVEL_WRN                  QSEE_LOG_MSG_DEBUG
#define TA_LOG_LEVEL_INF                  QSEE_LOG_MSG_DEBUG
#define TA_LOG_LEVEL_DEB                  QSEE_LOG_MSG_DEBUG

#elif defined USE_MOBICORE

#include "tlStd.h"
#define TA_LOG_FUNC(DUMMY, msg, arg...)   tlDbgPrintf(msg, ## arg)
#define TA_LOG_LEVEL_ERR                  "dummy"
#define TA_LOG_LEVEL_WRN                  "dummy"
#define TA_LOG_LEVEL_INF                  "dummy"
#define TA_LOG_LEVEL_DEB                  "dummy"

#elif defined USE_TEEGRIS

#include <stdio.h>
#define TA_LOG_FUNC(DUMMY, msg, arg...)   printf(msg, ## arg)
#define TA_LOG_LEVEL_ERR                  "dummy"
#define TA_LOG_LEVEL_WRN                  "dummy"
#define TA_LOG_LEVEL_INF                  "dummy"
#define TA_LOG_LEVEL_DEB                  "dummy"

#else
#error "not prepared"
#endif  //end of USE_XXXX

#endif  //end of __DBG_H__

