/*******************************************************************************
 *
 * File:     log.cpp
 *
 * Contents: Facility for logging
 *
 * Copyright 2017
 *
 * Author: David Juhasz (david.juhasz@tuwien.ac.at)
 *
 ******************************************************************************/

#include "rosa/support/log.h"

#include "rosa/support/debug.hpp"
#include "rosa/support/terminal_colors.h"

#include <array>

namespace rosa {

// Textual representation of LogLevels.
// NOTE: Do not index with LogLevel::NumLogLevels!
constexpr std::array<const char *, static_cast<size_t>(LogLevel::NumLogLevels)>
    LogLevelStrings{{"ERROR", "WARNING", "INFO", "DEBUG", "TRACE"}};

// Terminal colors associated to LogLevels.
// NOTE: Do not index with LogLevel::NumLogLevels!
constexpr std::array<terminal::Color,
                     static_cast<size_t>(LogLevel::NumLogLevels)>
    LogLevelColors{{
        terminal::Color::Red,     // LogLevel::Error
        terminal::Color::Yellow,  // LogLevel::Warning
        terminal::Color::Green,   // LogLevel::Info
        terminal::Color::Blue,    // LogLevel::Debug
        terminal::Color::Default, // LogLevel::Trace
    }};

std::string logLevelToString(const LogLevel logLevel) {
  ASSERT(logLevel != LogLevel::NumLogLevels);
  return LogLevelStrings[static_cast<size_t>(logLevel)];
}

std::ostream &operator<<(std::ostream &os, const LogLevel logLevel) {
  ASSERT(logLevel != LogLevel::NumLogLevels);
  os << LogLevelColors[static_cast<size_t>(logLevel)] << "["
     << logLevelToString(logLevel) << "]" << terminal::Color::Default;
  return os;
}

std::ostream LogSink(nullptr);

} // End namespace rosa

