#ifndef LOGGER_H
#define LOGGER_H

#include <iostream>

namespace Logger {
    enum Level { L_NONE, L_ERROR, L_WARNING, L_INFO, L_DEBUG };
    extern Level level;
}

#if LOG_LEVEL >= 1
#define LOG_ERROR(text)                                                        \
    if(Logger::level >= Logger::Level::L_ERROR) {                              \
        std::cout << "\33[1;31m[ERROR] " << (text) << "\33[39;49m\n";          \
    }
#else
#define LOG_ERROR(text) (void)text;
#endif

#if LOG_LEVEL >= 2
#define LOG_WARNING(text)                                                      \
    if(Logger::level >= Logger::Level::L_WARNING) {                            \
        std::cout << "\33[1;33m[WARNING] " << (text) << "\33[39;49m\n";        \
    }
#else
#define LOG_WARNING(text) (void)text;
#endif

#if LOG_LEVEL >= 3
#define LOG_INFO(text)                                                         \
    if(Logger::level >= Logger::Level::L_INFO) {                               \
        std::cout << "\33[1;37m[INFO] " << (text) << "\33[39;49m\n";           \
    }
#else
#define LOG_INFO(text) (void)text;
#endif

#if LOG_LEVEL >= 4
#define LOG_DEBUG(text)                                                        \
    if(Logger::level >= Logger::Level::L_DEBUG) {                              \
        std::cout << "\33[1;32m[DEBUG] " << (text) << "\33[39;49m\n";          \
    }
#else
#define LOG_DEBUG(text) (void)text;
#endif

#endif