#ifndef _LOG_H
#define _LOG_H

#ifdef __cplusplus
extern "C"
{
#endif

enum log_level
{
    LOG_NONE = -1,
    LOG_TRACE = 0,
    LOG_DEBUG = 1,
    LOG_INFO = 2,
    LOG_WARN = 3,
    LOG_ERROR = 4,
    LOG_FATAL = 5,
    LOG_STATE = 6,
};

#define LOG_TRACE(module, format, ...)                       \
    if (log_level_enabled(LOG_TRACE))                        \
    {                                                        \
        log_print(LOG_TRACE, module, format, ##__VA_ARGS__); \
    }

#define LOG_DEBUG(module, format, ...)                       \
    if (log_level_enabled(LOG_DEBUG))                        \
    {                                                        \
        log_print(LOG_DEBUG, module, format, ##__VA_ARGS__); \
    }

#define LOG_INFO(module, format, ...)                       \
    if (log_level_enabled(LOG_INFO))                        \
    {                                                       \
        log_print(LOG_INFO, module, format, ##__VA_ARGS__); \
    }

#define LOG_WARN(module, format, ...)                       \
    if (log_level_enabled(LOG_WARN))                        \
    {                                                       \
        log_print(LOG_WARN, module, format, ##__VA_ARGS__); \
    }

#define LOG_ERROR(module, format, ...)                       \
    if (log_level_enabled(LOG_ERROR))                        \
    {                                                        \
        log_print(LOG_ERROR, module, format, ##__VA_ARGS__); \
    }

#define LOG_FATAL(module, format, ...)                       \
    if (log_level_enabled(LOG_FATAL))                        \
    {                                                        \
        log_print(LOG_FATAL, module, format, ##__VA_ARGS__); \
    }

#define LOG_STATE(module, format, ...)                       \
    if (log_level_enabled(LOG_STATE))                        \
    {                                                        \
        log_print(LOG_STATE, module, format, ##__VA_ARGS__); \
    }

// return  0: success
// return -1: failed
int log_init(const char *config_file);
void log_free();

int log_level_enabled(enum log_level level);
void log_reload_level(const char *config_file);
void log_print(enum log_level level, const char *module, const char *fmt, ...);

#ifdef __cplusplus
}
#endif

#endif
