/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
 * Copyright (c) 2014  Regents of the University of California,
 *                     Arizona Board of Regents,
 *                     Colorado State University,
 *                     University Pierre & Marie Curie, Sorbonne University,
 *                     Washington University in St. Louis,
 *                     Beijing Institute of Technology
 *
 * This file is part of NFD (Named Data Networking Forwarding Daemon).
 * See AUTHORS.md for complete list of NFD authors and contributors.
 *
 * NFD is free software: you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation,
 * either version 3 of the License, or (at your option) any later version.
 *
 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
 **/

#ifndef NFD_CORE_LOGGER_HPP
#define NFD_CORE_LOGGER_HPP

#include "common.hpp"
#include <ndn-cpp-dev/util/time.hpp>

/// \todo use when we enable C++11 (see todo in now())
// #include <cinttypes>

namespace nfd {

enum LogLevel {
  LOG_NONE           = 0, // no messages
  LOG_ERROR          = 1, // serious error messages
  LOG_WARN           = 2, // warning messages
  LOG_INFO           = 3, // informational messages
  LOG_DEBUG          = 4, // debug messages
  LOG_TRACE          = 5, // trace messages (most verbose)
  // LOG_FATAL is not a level and is logged unconditionally
  LOG_ALL            = 255, // all messages
};

class Logger
{
public:

  Logger(const std::string& name, LogLevel level)
    : m_moduleName(name)
    , m_enabledLogLevel(level)
  {
  }

  bool
  isEnabled(LogLevel level) const
  {
    // std::cerr << m_moduleName <<
    //   " enabled = " << m_enabledLogLevel
    //           << " level = " << level << std::endl;
    return (m_enabledLogLevel >= level);
  }

  void
  setLogLevel(LogLevel level)
  {
    m_enabledLogLevel = level;
  }

  const std::string&
  getName() const
  {
    return m_moduleName;
  }

  void
  setName(const std::string& name)
  {
    m_moduleName = name;
  }


  /// \brief return a string representation of time since epoch: seconds.microseconds
  static std::string
  now()
  {
    using namespace ndn::time;

    static const microseconds::rep ONE_SECOND = 1000000;

    // 10 (whole seconds) + '.' + 6 (fraction) + 1 (\0)
    char buffer[10 + 1 + 6 + 1];

    microseconds::rep microseconds_since_epoch =
      duration_cast<microseconds>(system_clock::now().time_since_epoch()).count();

    ::snprintf(buffer, sizeof(buffer), "%lld.%06lld",
               static_cast<long long int>(microseconds_since_epoch / ONE_SECOND),
               static_cast<long long int>(microseconds_since_epoch % ONE_SECOND));

    /// \todo use this version when we enable C++11 to avoid casting
    // ::snprintf(buffer, sizeof(buffer), "%" PRIdLEAST64 ".%06" PRIdLEAST64,
    //            microseconds_since_epoch / ONE_SECOND,
    //            microseconds_since_epoch % ONE_SECOND);

    return std::string(buffer);
  }

private:
  std::string m_moduleName;
  LogLevel    m_enabledLogLevel;
};

inline std::ostream&
operator<<(std::ostream& output, const Logger& logger)
{
  output << logger.getName();
  return output;
}

} // namespace nfd

#include "core/logger-factory.hpp"

namespace nfd {

#define NFD_LOG_INIT(name)                                              \
static nfd::Logger& g_logger = nfd::LoggerFactory::create(name);

#define NFD_LOG_INCLASS_DECLARE()               \
static nfd::Logger& g_logger;

#define NFD_LOG_INCLASS_DEFINE(cls, name)                       \
nfd::Logger& cls::g_logger = nfd::LoggerFactory::create(name);

#define NFD_LOG_INCLASS_TEMPLATE_DEFINE(cls, name)                      \
template<class T>                                                       \
nfd::Logger& cls<T>::g_logger = nfd::LoggerFactory::create(name);

#define NFD_LOG_INCLASS_TEMPLATE_SPECIALIZATION_DEFINE(cls, specialization, name) \
template<>                                                              \
nfd::Logger& cls<specialization>::g_logger = nfd::LoggerFactory::create(name);

#define NFD_LOG_INCLASS_2TEMPLATE_SPECIALIZATION_DEFINE(cls, s1, s2, name) \
template<>                                                              \
nfd::Logger& cls<s1, s2>::g_logger = nfd::LoggerFactory::create(name);


#define NFD_LOG(level, expression)                                      \
do {                                                                    \
  if (g_logger.isEnabled(::nfd::LOG_##level))                           \
    std::clog << ::nfd::Logger::now() << " "#level": "                  \
              << "[" << g_logger << "] " << expression << "\n";         \
} while (false)

#define NFD_LOG_TRACE(expression) NFD_LOG(TRACE, expression)
#define NFD_LOG_DEBUG(expression) NFD_LOG(DEBUG, expression)
#define NFD_LOG_INFO(expression) NFD_LOG(INFO, expression)
#define NFD_LOG_ERROR(expression) NFD_LOG(ERROR, expression)

// specialize WARN because the message is "WARNING" instead of "WARN"
#define NFD_LOG_WARN(expression)                                        \
do {                                                                    \
  if (g_logger.isEnabled(::nfd::LOG_WARN))                              \
    std::clog << ::nfd::Logger::now() << " WARNING: "                   \
              << "[" << g_logger << "] " << expression << "\n";         \
} while (false)

#define NFD_LOG_FATAL(expression)                                       \
do {                                                                    \
  std::clog << ::nfd::Logger::now() << " FATAL: "                       \
            << "[" << g_logger << "] " << expression << "\n";           \
} while (false)

} //namespace nfd

#endif
