/*
 * 构建配置检测头文件
 * 用于在代码中区分 Debug/Release 构建和串口使用模式
 */

#ifndef BUILD_CONFIG_H
#define BUILD_CONFIG_H

#include "sdkconfig.h"

/* ========================
 * 编译优化级别检测
 * ======================== */

#if defined(CONFIG_ROBO_APP_FW_RELEASE)
    #define BUILD_IS_RELEASE        1
    #define BUILD_IS_DEBUG          0
    #define BUILD_OPTIMIZATION        "Os"
#else
    #define BUILD_IS_RELEASE        0
    #define BUILD_IS_DEBUG          1
    #define BUILD_OPTIMIZATION        "Og"
#endif

/* ========================
 * 串口 / 日志输出
 * ======================== */

/*
 * Release：关闭串口调试打印（sdkconfig 建议 CONFIG_ESP_CONSOLE_NONE），
 * W/E 经 BLE 0xFFE3 Notify 推送（见 link_ble.c）。
 *
 * Release + APP_UART_MODE_DEBUG：指定 UART 给 uart_comm，同样无 ESP_LOG。
 */
#if defined(CONFIG_APP_UART_MODE_DEBUG) && defined(CONFIG_ROBO_APP_FW_RELEASE)
    #define UART_MODE_COMMUNICATION 1
    #define UART_MODE_DEBUG         0
    #define BUILD_SERIAL_LOG_ENABLED 0
#else
    #define UART_MODE_COMMUNICATION 0
    #define UART_MODE_DEBUG         1
    #if BUILD_IS_RELEASE
        #define BUILD_SERIAL_LOG_ENABLED 0
    #else
        #define BUILD_SERIAL_LOG_ENABLED 1
    #endif
#endif

/* ========================
 * 条件日志宏（Release 或无串口时禁用 LOG_* 宏）
 * ======================== */

#if !BUILD_SERIAL_LOG_ENABLED
    #define BUILD_LOG_LEVEL_NONE    1
    #define LOG_I(tag, fmt, ...)    ((void)0)
    #define LOG_W(tag, fmt, ...)    ((void)0)
    #define LOG_E(tag, fmt, ...)    ((void)0)
    #define LOG_D(tag, fmt, ...)    ((void)0)
#else
    #include "esp_log.h"
    #define BUILD_LOG_LEVEL_NONE    0
    #define LOG_I(tag, fmt, ...)    ESP_LOGI(tag, fmt, ##__VA_ARGS__)
    #define LOG_W(tag, fmt, ...)    ESP_LOGW(tag, fmt, ##__VA_ARGS__)
    #define LOG_E(tag, fmt, ...)    ESP_LOGE(tag, fmt, ##__VA_ARGS__)
    #define LOG_D(tag, fmt, ...)    ESP_LOGD(tag, fmt, ##__VA_ARGS__)
#endif

#ifdef __cplusplus
extern "C" {
#endif

static inline const char* build_get_type(void) {
    return BUILD_IS_RELEASE ? "Release" : "Debug";
}

static inline const char* build_get_uart_mode(void) {
    return UART_MODE_COMMUNICATION ? "Communication" : "Debug";
}

static inline int build_can_log(void) {
    return BUILD_SERIAL_LOG_ENABLED;
}

#ifdef __cplusplus
}
#endif

#endif /* BUILD_CONFIG_H */
