#ifndef LOGGER_H
#define LOGGER_H

#include <stdio.h>

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

#if defined(LOG_LEVEL) && LOG_LEVEL >= 1
#define LOG_ERROR(text)                                                        \
    if(Logger::level >= Logger::Level::L_ERROR) {                              \
        StringBuffer<512> s("\33[1;31m[ERROR] ");                              \
        s.append(text);                                                        \
        s.append("\33[39;49m");                                                \
        s.printLine();                                                         \
    }
#else
#define LOG_ERROR(text)
#endif

#if defined(LOG_LEVEL) && LOG_LEVEL >= 2
#define LOG_WARNING(text)                                                      \
    if(Logger::level >= Logger::Level::L_WARNING) {                            \
        StringBuffer<512> s("\33[1;33m[WARNING] ");                            \
        s.append(text);                                                        \
        s.append("\33[39;49m");                                                \
        s.printLine();                                                         \
    }
#else
#define LOG_WARNING(text)
#endif

#if defined(LOG_LEVEL) && LOG_LEVEL >= 3
#define LOG_INFO(text)                                                         \
    if(Logger::level >= Logger::Level::L_INFO) {                               \
        StringBuffer<512> s("\33[1;37m[INFO] ");                               \
        s.append(text);                                                        \
        s.append("\33[39;49m");                                                \
        s.printLine();                                                         \
    }
#else
#define LOG_INFO(text)
#endif

#if defined(LOG_LEVEL) && LOG_LEVEL >= 4
#define LOG_DEBUG(text)                                                        \
    if(Logger::level >= Logger::Level::L_DEBUG) {                              \
        StringBuffer<512> s("\33[1;32m[DEBUG] ");                              \
        s.append(text);                                                        \
        s.append("\33[39;49m");                                                \
        s.printLine();                                                         \
    }
#else
#define LOG_DEBUG(text)
#endif

#endif