#include "SpdLog.h"

#include <chrono>
#include <QApplication>

#include "spdlog/spdlog.h"
#include "spdlog/sinks/rotating_file_sink.h"

static std::shared_ptr<spdlog::logger> logHander_;

static void LogMessageOutput(QtMsgType type, const QMessageLogContext& context, const QString& msg) {
    if (!logHander_) {
        return;
    }

    switch (type) {
    case QtDebugMsg:
        logHander_->debug(msg.toStdString());
        break;
    case QtInfoMsg:
        logHander_->info(msg.toStdString());
        break;
    case QtWarningMsg:
        logHander_->warn(msg.toStdString());
        break;
    case QtCriticalMsg:
        logHander_->critical(msg.toStdString());
        break;
    case QtFatalMsg:
        logHander_->critical(msg.toStdString());
        break;
    }
}

void InitSpdlog(const std::string &logger_name, const std::string &filename,  int flush) {
      constexpr std::size_t max_size = 1024 * 1024 * 5;
    constexpr std::size_t max_files = 3;
    logHander_ = spdlog::rotating_logger_mt(logger_name, filename, max_size, max_files);
    logHander_->set_level(spdlog::level::debug);

    if (flush > 0) {
        spdlog::flush_every(std::chrono::seconds(flush));
    }
    logHander_->info("main enter");
    qInstallMessageHandler(LogMessageOutput);
}
void UninitSpdlog() {
    logHander_->info("main exit");
    spdlog::drop_all();
}