LogWrapper.h
//
//  LogWrapper.h
//  
//
//  Created by Chris Galzerano on 2/9/26.
//

#ifndef LOG_WRAPPER_H
#define LOG_WRAPPER_H

// ==========================================
// ESP32 IMPLEMENTATION (Passthrough)
// ==========================================
#ifdef ESP_PLATFORM

    #include "esp_log.h"

    // Direct mapping to ESP-IDF logging
    #define FreeOSLogI(tag, format, ...) ESP_LOGI(tag, format, ##__VA_ARGS__)
    #define FreeOSLogE(tag, format, ...) ESP_LOGE(tag, format, ##__VA_ARGS__)
    #define FreeOSLogW(tag, format, ...) ESP_LOGW(tag, format, ##__VA_ARGS__)
    #define FreeOSLogD(tag, format, ...) ESP_LOGD(tag, format, ##__VA_ARGS__)
    #define FreeOSLogV(tag, format, ...) ESP_LOGV(tag, format, ##__VA_ARGS__)

// ==========================================
// LINUX IMPLEMENTATION (Printf + Colors)
// ==========================================
#else

    #include <stdio.h>
    #include <time.h>
    #include <sys/time.h>

    // ANSI Color Codes
    #define LOG_COLOR_RESET  "\033[0m"
    #define LOG_COLOR_RED    "\033[0;31m"
    #define LOG_COLOR_GREEN  "\033[0;32m"
    #define LOG_COLOR_YELLOW "\033[0;33m"
    #define LOG_COLOR_BLUE   "\033[0;34m"
    #define LOG_COLOR_CYAN   "\033[0;36m"

    // Helper to get milliseconds since boot (mimics ESP timestamp)
    static inline unsigned long _linux_get_time_ms(void) {
        struct timeval tv;
        gettimeofday(&tv, NULL);
        return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
    }

    // Generic Logger Macro
    // Output Format: I (1234) TAG: Message
    #define _LINUX_LOG(level_char, color, tag, format, ...) \
        do { \
            unsigned long time = _linux_get_time_ms(); \
            printf("%s%c (%lu) %s: " format "%s\n", \
                   color, level_char, time, tag, ##__VA_ARGS__, LOG_COLOR_RESET); \
        } while(0)

    // The Replacement Macros
    #define FreeOSLogI(tag, format, ...) _LINUX_LOG('I', LOG_COLOR_GREEN,  tag, format, ##__VA_ARGS__)
    #define FreeOSLogE(tag, format, ...) _LINUX_LOG('E', LOG_COLOR_RED,    tag, format, ##__VA_ARGS__)
    #define FreeOSLogW(tag, format, ...) _LINUX_LOG('W', LOG_COLOR_YELLOW, tag, format, ##__VA_ARGS__)
    #define FreeOSLogD(tag, format, ...) _LINUX_LOG('D', LOG_COLOR_CYAN,   tag, format, ##__VA_ARGS__)
    #define FreeOSLogV(tag, format, ...) _LINUX_LOG('V', LOG_COLOR_BLUE,   tag, format, ##__VA_ARGS__)

#endif // ESP_PLATFORM

#endif // LOG_WRAPPER_H