#ifndef __LOG_H__
#define __LOG_H__
#if defined(__cplusplus) /* If this is a C++ compiler, use C linkage */
extern "C" {
#endif

#include <stdarg.h>

#ifndef RET_SUCCESS
#define RET_SUCCESS  (0)
#endif

#ifndef RET_FAILURE  
#define RET_FAILURE  (-1)
#endif
    

#define LINE_MAX_SIZE               (1024 * 2) // max: 2K

typedef enum {
    LOG_LEVEL_DEBUG = 0,
    LOG_LEVEL_INFO,
    LOG_LEVEL_WARN,
    LOG_LEVEL_ERR,
    LOG_LEVEL_FLT,
    LOG_LEVEL_EVT
} LOG_LEVEL;

typedef const char cchar;
void log_print(LOG_LEVEL lvl, cchar *f, int l, cchar *fmt, ...);
void log_vprint(LOG_LEVEL lvl, cchar *f, int l, cchar *fmt, va_list *params);
typedef void (*log_redirect_func_t)(LOG_LEVEL level, cchar *file_name, int line, cchar *fmt, va_list *params);

/**
 * @brief log_x 是daslink 提供的标准日志接口
 */
#define log_d(fmt, args...)     log_print(LOG_LEVEL_DEBUG, __FILE__, __LINE__, fmt, ##args)
#define log_i(fmt, args...)     log_print(LOG_LEVEL_INFO,  __FILE__, __LINE__, fmt, ##args)
#define log_w(fmt, args...)     log_print(LOG_LEVEL_WARN,  __FILE__, __LINE__, fmt, ##args)
#define log_e(fmt, args...)     log_print(LOG_LEVEL_ERR,   __FILE__, __LINE__, fmt, ##args)
#define log_flt(fmt, args...)   log_print(LOG_LEVEL_FLT,   __FILE__, __LINE__, fmt, ##args)
#define log_event(fmt, args...) log_print(LOG_LEVEL_EVT,   __FILE__, __LINE__, fmt, ##args)

/**
 * @brief 设定 log 的日志级别， 默认是DEBUG级别
 * 
 * @param level 日志级别参数
 * @return int 返回值，成功： RET_SUCCESS， 失败：RET_FAILURE
 */
int log_set_level(LOG_LEVEL level);

/**
 * @brief 日志重定向， 即将daslink的日志信息对接到用户自己的日志系统上， 一旦对接后，log_set_level将不再起作用
 * 
 * @param func 用户实现日志对接处理过程
 * @return int 返回值，成功： RET_SUCCESS， 失败：RET_FAILURE
 */
int log_redirect(log_redirect_func_t func);

#if defined(__cplusplus) /* If this is a C++ compiler, use C linkage */
}
#endif

#endif
