#ifndef AGENT_LOG_H
#define AGENT_LOG_H

#include "type.h"

#ifdef __cplusplus
extern "C" {
#endif

// 日志级别
typedef enum {
    AGENT_LOG_DEBUG,
    AGENT_LOG_INFO,
    AGENT_LOG_WARN,
    AGENT_LOG_ERROR,
    AGENT_LOG_FATAL
} AgentLogLevel;

// 日志输出目标
typedef enum {
    AGENT_LOG_DEST_CONSOLE = 1 << 0,
    AGENT_LOG_DEST_FLASH   = 1 << 1,
    AGENT_LOG_DEST_NMS     = 1 << 2
} AgentLogDest;

// 日志配置
typedef struct {
    AgentLogLevel level;
    AgentLogDest dest;
    uint32_xxl max_flash_size;
    uint16_xxl max_log_length;
} AgentLogConfig;

// 日志条目
typedef struct {
    uint32_xxl timestamp;
    AgentLogLevel level;
    char_xxl message[256];
} AgentLogEntry;

// 核心接口
void agent_log_init(const AgentLogConfig* config);
void agent_log(AgentLogLevel level, const char* fmt, ...);
void agent_log_set_level(AgentLogLevel level);
void agent_log_deinit(void);

// 便捷宏
#define agent_log_debug(fmt, ...)  agent_log(AGENT_LOG_DEBUG, fmt, ##__VA_ARGS__)
#define agent_log_info(fmt, ...)   agent_log(AGENT_LOG_INFO, fmt, ##__VA_ARGS__)
#define agent_log_warn(fmt, ...)   agent_log(AGENT_LOG_WARN, fmt, ##__VA_ARGS__)
#define agent_log_error(fmt, ...)  agent_log(AGENT_LOG_ERROR, fmt, ##__VA_ARGS__)
#define agent_log_fatal(fmt, ...)  agent_log(AGENT_LOG_FATAL, fmt, ##__VA_ARGS__)

// 工具接口
uint16_xxl agent_log_get_count(void);
bool_xxl agent_log_get_entry(uint16_xxl index, AgentLogEntry* entry);
void agent_log_clear_flash(void);
void agent_log_hexdump(const char* prefix, const uint8_xxl* data, uint16_xxl len);
void agent_log_printf(const char* format, ...);

#ifdef __cplusplus
}
#endif

#endif // AGENT_LOG_H
