//
// Created by koncord on 15.08.16.
//

#ifndef OPENMW_LOG_HPP
#define OPENMW_LOG_HPP

#if defined(NOLOGS)
#define LOG_INIT(logLevel)
#define LOG_QUIT()
#define LOG_MESSAGE(level, msg, ...)
#define LOG_MESSAGE_SIMPLE(level, msg, ...)
#else
#define LOG_INIT(logLevel) Log::Create(logLevel)
#define LOG_QUIT() Log::Delete()
#define LOG_MESSAGE(level, msg, ...) Log::Get().print((level), (1), (__FILE__), (__LINE__), (msg), __VA_ARGS__)
#define LOG_MESSAGE_SIMPLE(level, msg, ...) Log::Get().print((level), (1), (0), (0), (msg), __VA_ARGS__)
#define LOG_APPEND(level, msg, ...) Log::Get().print((level), (0), (0), (0), (msg), __VA_ARGS__)
#endif

class Log
{
    public:
        enum
        {
            LOG_VERBOSE = 0,
            LOG_INFO,
            LOG_WARN,
            LOG_ERROR,
            LOG_FATAL
        };
        static void Create(int logLevel);
        static void Delete();
        static const Log &Get();
        static void SetLevel(int level);
        void print(int level, bool hasPrefix, const char *file, int line, const char *message, ...) const;
    private:
        Log(int logLevel);
        /// Not implemented
        Log( const Log& );
        /// Not implemented
        Log& operator=(Log& );
        static Log *sLog;
        int logLevel;
};


#endif //OPENMW_LOG_HPP
