#ifndef __VK_LOG_H__
#define __VK_LOG_H__

#include <stdio.h>
#include <string.h>
#include "vk_constants.h"

#ifdef __DEBUG__
#define TA_TAG "VaultKeeper DEBUG :: "
#else
#define TA_TAG "VaultKeeper :: "
#endif

// ref. vk_extern_var.h
extern char g_error_msg[MAX_ERROR_MSG_LEN];
static char buffer[MAX_ERROR_MSG_LEN];

static void push_err_msg()
{
	if (strlen(g_error_msg) == 0) // If empty, push a message
		memcpy(g_error_msg, buffer, MAX_ERROR_MSG_LEN - 1);
}

#ifdef VK_SWD_QSEE
#include "qsee_log.h"
#include "qsee_printk.h"
#ifdef __DEBUG__
#define LOGD(fmt, ARGS...) do { \
		                        KLOG_ERROR(TA_TAG, fmt, ##ARGS); \
                                qsee_log(QSEE_LOG_MSG_ERROR, fmt, ##ARGS); \
                           } while(0)

#define LOGI(fmt, ARGS...) do { \
		                        KLOG_ERROR(TA_TAG, fmt, ##ARGS); \
                                qsee_log(QSEE_LOG_MSG_ERROR, fmt, ##ARGS); \
                           } while(0)

#else
#define LOGD(fmt, ARGS...) 
#define LOGI(fmt, ARGS...) qsee_log(QSEE_LOG_MSG_MED, fmt, ##ARGS)
#endif
#define LOGE(fmt, ARGS...) do { \
		                        KLOG_ERROR(TA_TAG, fmt, ##ARGS); \
                                qsee_log(QSEE_LOG_MSG_ERROR, fmt, ##ARGS); \
		                        memset(buffer, 0, MAX_ERROR_MSG_LEN); \
		                        snprintf((char*)buffer, MAX_ERROR_MSG_LEN, "%s" fmt, TA_TAG, ##ARGS); \
		                        push_err_msg(); \
                           } while(0)

#define KLOGI(fmt, ARGS...) KLOG_WARNING(TA_TAG, fmt, ##ARGS)

#define QSEE_LOGE(fmt, ARGS...) qsee_log(QSEE_LOG_MSG_ERROR, fmt, ##ARGS)
#define QSEE_LOGI(fmt, ARGS...) qsee_log(QSEE_LOG_MSG_MED, fmt, ##ARGS)

#elif VK_SWD_KINIBI
#include "tlStd.h"
#include "TlApiLogging.h"
#ifdef __DEBUG__
#define LOGD(fmt, ...) tlApiLogPrintf("%s" fmt, TA_TAG, ##__VA_ARGS__)
#else
#define LOGD(fmt, ...) 
#endif
#define LOGI(fmt, ...) tlApiLogPrintf("%s" fmt, TA_TAG, ##__VA_ARGS__)

#define LOGE(fmt, ...) tlApiLogPrintf("%s" fmt, TA_TAG, ##__VA_ARGS__); \
		               memset(buffer, 0, MAX_ERROR_MSG_LEN); \
		               snprintf(buffer, MAX_ERROR_MSG_LEN, "%s" fmt, TA_TAG, ##__VA_ARGS__); \
		               push_err_msg()

#define KLOGI(fmt, ...) tlApiLogPrintf("%s" fmt, TA_TAG, ##__VA_ARGS__)

#elif VK_SWD_TEEGRIS
#include <stdio.h>
#ifdef __DEBUG__
#define LOGD(fmt, ...) printf("%s" fmt, TA_TAG, ##__VA_ARGS__)
#else
#define LOGD(fmt, ...) 
#endif
#define LOGI(fmt, ...) printf("%s" fmt, TA_TAG, ##__VA_ARGS__)

#define LOGE(fmt, ...) printf("%s" fmt, TA_TAG, ##__VA_ARGS__); \
		               memset(buffer, 0, MAX_ERROR_MSG_LEN); \
		               snprintf(buffer, MAX_ERROR_MSG_LEN, "%s" fmt, TA_TAG, ##__VA_ARGS__); \
		               push_err_msg()

#define KLOGI(fmt, ...) printf("%s" fmt, TA_TAG, ##__VA_ARGS__)

#endif

#endif // __VK_LOG_H__
