#include <stdio.h>
#include <stdarg.h>

#include "dk_common.h"

#ifndef DK_BUILD_LOG_LEVEL
#define DK_BUILD_LOG_LEVEL 3U
#endif

#ifdef DK_DEBUG

#define DK_TAG_INFO         TAG "LOG_INFO: "
#define DK_TAG_WARN         TAG "LOG_WARN: "
#define DK_TAG_ERR          TAG "LOG_ERR: "
#define MAX_MSG_SIZE        128U
#define DK_LOG_LEVEL_NONE   0U
#define DK_LOG_LEVEL_INFO   1U
#define DK_LOG_LEVEL_WARN   2U
#define DK_LOG_LEVEL_ERR    3U
#define DK_LOG_LEVEL_MAX    (DK_LOG_LEVEL_ERR)

#define DK_LOG(tag, ...) do {\
                                char msg[MAX_MSG_SIZE] = {0};\
                                snprintf(msg, MAX_MSG_SIZE - 1, __VA_ARGS__);\
                                printf(tag"%s\n", msg);\
                             } while(0)

#define DK_LOG_ENABLED(l)  (DK_DEBUG &&\
                            l <= DK_BUILD_LOG_LEVEL &&\
                            l <= DK_LOG_LEVEL_ERR &&\
                            DK_BUILD_LOG_LEVEL >= 0 &&\
                            DK_BUILD_LOG_LEVEL <= DK_LOG_LEVEL_MAX ? TRUE : FALSE)

#define DK_LOG_INFO(...)   do { if (DK_LOG_ENABLED(DK_LOG_LEVEL_INFO)) { DK_LOG(DK_TAG_INFO, __VA_ARGS__); } } while(0)
#define DK_LOG_WARN(...)   do { if (DK_LOG_ENABLED(DK_LOG_LEVEL_WARN)) { DK_LOG(DK_TAG_WARN, __VA_ARGS__); } } while(0)
#define DK_LOG_ERR(...)    do { if (DK_LOG_ENABLED(DK_LOG_LEVEL_ERR)) { DK_LOG(DK_TAG_ERR, __VA_ARGS__); } } while(0)

#else

#define DK_LOG_INFO(...)
#define DK_LOG_WARN(...)
#define DK_LOG_ERR(...)

#endif