#include "library_loader.h"
#include "../../include/log/logging.h"
#include <dlfcn.h>

namespace systrace {

DynamicLibraryLoader::DynamicLibraryLoader(const std::string &library_path)
    : library_handle_(nullptr), is_usable_(false), library_path_(library_path) {
    LoadDynamicLibrary();
}

DynamicLibraryLoader::~DynamicLibraryLoader() {
    if (library_handle_) {
        dlclose(library_handle_);
        library_handle_ = nullptr;
    }
}

void DynamicLibraryLoader::LoadDynamicLibrary() {
    if (library_handle_) {
        LOG(WARN) << "Library already loaded: " << library_path_;
        return;
    }

    dlerror();

    library_handle_ = dlopen(library_path_.c_str(), RTLD_LAZY);
    if (!library_handle_) {
        const char *error_message = dlerror();
        LOG(WARN) << "Failed to load library: "
                  << (error_message ? error_message : "Unknown error");
        is_usable_ = false;
        return;
    }

    is_usable_ = true;
}

} // namespace systrace