#ifndef jfxoffline_log_h
#define jfxoffline_log_h

// #include "spdlog/spdlog.h"

#include <memory>
#include <string>

#define jf_log_init(...) jf::logger::init(__VA_ARGS__)
#define jf_log_info(...) jf::logger::log_info(__VA_ARGS__)
#define jf_log_profiler(...) jf::logger::log_profiler(__VA_ARGS__)
#define jf_log_error(...) jf::logger::log_error(__VA_ARGS__)
#define jf_log_flush(...) jf::logger::flush()

// #define jf_log_init(...)
// #define jf_log_info(...)
// #define jf_log_profiler(...)
// #define jf_log_error(...)
// #define jf_log_flush(...)

namespace jf {

class logger {
   public:
    template <typename... Args>
    static void log_info(Args &&... args) {
        if (!inited) init();
#if ANDROID
        spdlog::get("android")->info(std::forward<Args>(args)...);
#else
            // spdlog::get("file_log")->info(std::forward<Args>(args)...);
            // spdlog::get("console_log")->info(std::forward<Args>(args)...);
#endif
    }

    template <typename... Args>
    static void log_profiler(Args &&... args) {
        if (!inited) init();
#if ANDROID
        spdlog::get("android")->info(std::forward<Args>(args)...);
#else
            // spdlog::get("file_profiler")->info(std::forward<Args>(args)...);
            // spdlog::get("console_log")->info(std::forward<Args>(args)...);
#endif
    }

    template <typename... Args>
    static void log_error(Args &&... args) {
        if (!inited) init();
#if ANDROID
        spdlog::get("android")->error(std::forward<Args>(args)...);
#else
            // spdlog::get("file_log")->error(std::forward<Args>(args)...);
            // spdlog::get("file_error")->error(std::forward<Args>(args)...);
            // spdlog::get("console_log")->error(std::forward<Args>(args)...);
#endif
    }

    static void flush() {
        if (!inited) init();
#if ANDROID
        spdlog::get("android")->flush();
#else
            // spdlog::get("file_log")->flush();
            // spdlog::get("file_error")->flush();
            // spdlog::get("file_profiler")->flush();
            // spdlog::get("console_log")->flush();
#endif
    }

   private:
    static void init();
    static bool inited;
};

}  // namespace jf

#endif