#pragma once

#include <memory>
#include <string>
#include <vector>

#include <spdlog/logger.h>
#include <spdlog/sinks/sink.h>

#include "libvideo2x_export.h"

namespace video2x {
namespace logger_manager {

class LIBVIDEO2X_API LoggerManager {
   public:
    LoggerManager(const LoggerManager&) = delete;
    LoggerManager& operator=(const LoggerManager&) = delete;

    static LoggerManager& instance();

    std::shared_ptr<spdlog::logger> logger();

    bool reconfigure_logger(
        const std::string& logger_name,
        const std::vector<spdlog::sink_ptr>& sinks,
        const std::string& pattern = "%+"
    );

    bool set_log_level(const std::string& level_str);

    void hook_ffmpeg_logging();
    void unhook_ffmpeg_logging();

   private:
    LoggerManager();

    std::shared_ptr<spdlog::logger> logger_ = nullptr;
};

}  // namespace logger_manager

// Convenience function to get the logger instance
inline std::shared_ptr<spdlog::logger> logger() {
    return logger_manager::LoggerManager::instance().logger();
}

}  // namespace video2x