#ifndef DRIVER_LOG_H
#define DRIVER_LOG_H

#include <stdarg.h>
#include "softbus_adapter_bt_loghook.h"
#include "softbus_adapter_wifi_loghook.h"

#define LOG_BUFFER_SIZE 1024
#ifndef LOG_TAG
#define LOG_TAG NULL
#endif

#ifdef WIFI_LOG
void WifiHookLog(SoftBusLogLevel level, const char *tag, char *buffer, int length, const char *format, ...);

#define LOGD(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    WifiHookLog(SOFTBUS_LOG_LEVEL_DEBUG, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                    \
} while(0)

#define LOGI(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    WifiHookLog(SOFTBUS_LOG_LEVEL_INFO, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                     \
} while(0)

#define LOGW(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    WifiHookLog(SOFTBUS_LOG_LEVEL_WARN, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                     \
} while(0)

#define LOGE(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    WifiHookLog(SOFTBUS_LOG_LEVEL_ERROR, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                    \
} while(0)

#define LOGF(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    WifiHookLog(SOFTBUS_LOG_LEVEL_FATAL, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                    \
} while(0)

#else

void HookLog(SoftBusLogLevel level, const char *tag, char *buffer, int length, const char *format, ...);

#define LOGD(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    HookLog(SOFTBUS_LOG_LEVEL_DEBUG, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                    \
} while(0)

#define LOGI(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    HookLog(SOFTBUS_LOG_LEVEL_INFO, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                     \
} while(0)

#define LOGW(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    HookLog(SOFTBUS_LOG_LEVEL_WARN, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                     \
} while(0)

#define LOGE(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    HookLog(SOFTBUS_LOG_LEVEL_ERROR, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                    \
} while(0)

#define LOGF(fmt, ...) do {                                                                                              \
    char buffer[LOG_BUFFER_SIZE];                                                                                        \
    memset(buffer, 0, sizeof(buffer));                                                                                   \
    int bufferlen = snprintf(buffer, LOG_BUFFER_SIZE - 1, "[%s:%u] %s# ", strrchr(__FILE__, '/') + 1, __LINE__, __FUNCTION__); \
    HookLog(SOFTBUS_LOG_LEVEL_FATAL, LOG_TAG, buffer, bufferlen, fmt, ##__VA_ARGS__);                                    \
} while(0)
#endif // WIFI_LOG
#endif // DRIVER_LOG_H