#include "LibraryInterface.h"

#include <Common/logger_useful.h>

namespace
{
const char DICT_LOGGER_NAME[] = "LibraryDictionarySourceExternal";
}

namespace ClickHouseLibrary
{

std::string_view LIBRARY_CREATE_NEW_FUNC_NAME = "ClickHouseDictionary_v3_libNew";
std::string_view LIBRARY_CLONE_FUNC_NAME = "ClickHouseDictionary_v3_libClone";
std::string_view LIBRARY_DELETE_FUNC_NAME = "ClickHouseDictionary_v3_libDelete";

std::string_view LIBRARY_DATA_NEW_FUNC_NAME = "ClickHouseDictionary_v3_dataNew";
std::string_view LIBRARY_DATA_DELETE_FUNC_NAME = "ClickHouseDictionary_v3_dataDelete";

std::string_view LIBRARY_LOAD_ALL_FUNC_NAME = "ClickHouseDictionary_v3_loadAll";
std::string_view LIBRARY_LOAD_IDS_FUNC_NAME = "ClickHouseDictionary_v3_loadIds";
std::string_view LIBRARY_LOAD_KEYS_FUNC_NAME = "ClickHouseDictionary_v3_loadKeys";

std::string_view LIBRARY_IS_MODIFIED_FUNC_NAME = "ClickHouseDictionary_v3_isModified";
std::string_view LIBRARY_SUPPORTS_SELECTIVE_LOAD_FUNC_NAME = "ClickHouseDictionary_v3_supportsSelectiveLoad";

void log(LogLevel level, CString msg)
{
    auto & logger = Poco::Logger::get(DICT_LOGGER_NAME);
    switch (level)
    {
        case LogLevel::TRACE:
            if (logger.trace())
                logger.trace(msg);
            break;
        case LogLevel::DEBUG:
            if (logger.debug())
                logger.debug(msg);
            break;
        case LogLevel::INFORMATION:
            if (logger.information())
                logger.information(msg);
            break;
        case LogLevel::NOTICE:
            if (logger.notice())
                logger.notice(msg);
            break;
        case LogLevel::WARNING:
            if (logger.warning())
                logger.warning(msg);
            break;
        case LogLevel::ERROR:
            if (logger.error())
                logger.error(msg);
            break;
        case LogLevel::CRITICAL:
            if (logger.critical())
                logger.critical(msg);
            break;
        case LogLevel::FATAL:
            if (logger.fatal())
                logger.fatal(msg);
            break;
    }
}

}