#ifndef AGENT_LOG_H
#define AGENT_LOG_H
#include "type.h"


// 2. C++ 兼容性保护（避免 C++ 编译器名字修饰导致链接错误）
#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,  // FLASH存储（预留）
    AGENT_LOG_DEST_NMS     = 1 << 2   // 通过MIB OID上传NMS（预留）
} AgentLogDest;

// 日志配置结构体 (全部替换为C99原生类型)
typedef struct {
    AgentLogLevel level;       // 日志级别阈值（只输出>=该级别的日志）
    AgentLogDest dest;         // 日志输出目标（位图组合）
    uint32_xxl max_flash_size;   // FLASH日志最大容量（字节）
    uint16_xxl max_log_length;   // 单条日志最大长度
} AgentLogConfig;

// 日志条目结构体（用于存储和上传，全部替换为C99原生类型）
typedef struct {
    uint32_xxl timestamp;        // 时间戳（ms）
    AgentLogLevel level;       // 日志级别
    char_xxl message[256];         // 日志内容 【chart8 → char】
} AgentLogEntry;

// 初始化日志系统
void agent_log_init(const AgentLogConfig* config);

// 核心日志输出函数（支持可变参数，核心接口）
void agent_log(AgentLogLevel level, const char* fmt, ...);

// 按级别输出日志的便捷宏 (完全保留，无任何修改)
#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__)

/**
 * 设置日志输出级别
 * @param level 目标日志级别（AGENT_LOG_* 枚举值）
 */
void agent_log_set_level(AgentLogLevel level);

// 日志管理接口（预留扩展，全部替换为C99原生类型）
uint16_xxl agent_log_get_count(void);
bool_xxl agent_log_get_entry(uint16_xxl index, AgentLogEntry* entry);  // bool8_xxl → bool
void agent_log_clear_flash(void);
void agent_log_hexdump(const char* prefix, const uint8_xxl* data, uint16_xxl len); // uint8→uint8_xxl,uint16→uint16_xxl
void agent_log_printf(const char* format, ...);
void agent_log_deinit(void);

#ifdef __cplusplus
}
#endif

#endif // AGENT_LOG_H
