/**
 * @file hal_log.h
 * @brief 日志 HAL 接口
 */

#ifndef BD_LOG_H
#define BD_LOG_H

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <string.h>

#ifdef __cplusplus
extern "C" {
#endif

/** 日志级别 */
typedef enum {
    BD_LOG_LEVEL_DEBUG = 0,  /* 详细 */
    BD_LOG_LEVEL_INFO,       /* 信息 */
    BD_LOG_LEVEL_WARN,       /* 警告 */
    BD_LOG_LEVEL_ERROR,      /* 错误 */
} hal_log_level_t;

/**
 * @brief 输出日志
 * @param level 日志级别
 * @param tag   模块标签
 * @param fmt   printf 格式串
 */
void hal_log(hal_log_level_t level, const char *tag, const char *fmt, ...);

/* 便捷日志宏 */
#define BD_LOGD(tag, fmt, ...) \
    hal_log(BD_LOG_LEVEL_DEBUG, tag, fmt, ##__VA_ARGS__)

#define BD_LOGI(tag, fmt, ...) \
    hal_log(BD_LOG_LEVEL_INFO, tag, fmt, ##__VA_ARGS__)

#define BD_LOGW(tag, fmt, ...) \
    hal_log(BD_LOG_LEVEL_WARN, tag, fmt, ##__VA_ARGS__)

#define BD_LOGE(tag, fmt, ...) \
    hal_log(BD_LOG_LEVEL_ERROR, tag, fmt, ##__VA_ARGS__)

/**
 * @brief 打印非 null 终止子串的日志宏
 *
 * PI32V2 工具链不支持 %.*s，需先拷贝为 null 终止串再打印。
 *
 * @param log_macro 日志宏（BD_LOGD/BD_LOGI/BD_LOGW/BD_LOGE）
 * @param tag       模块标签
 * @param buf       源数据指针（可为 NULL）
 * @param len       数据长度
 * @param fmt       格式串，末尾 %s 接收预览串
 */
#define BD_LOGB(log_macro, tag, buf, len, fmt, ...) do { \
    char _prv[121]; \
    size_t _n = (len) < sizeof(_prv) - 1 ? (size_t)(len) : sizeof(_prv) - 1; \
    if ((buf) && _n > 0) { \
        memcpy(_prv, (buf), _n); \
    } \
    _prv[_n] = '\0'; \
    log_macro(tag, fmt, ##__VA_ARGS__, _prv); \
} while (0)

#ifdef __cplusplus
}
#endif

#endif /* BD_LOG_H */
