// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMIUMOS_WIDE_PROFILING_MYBASE_BASE_LOGGING_H_
#define CHROMIUMOS_WIDE_PROFILING_MYBASE_BASE_LOGGING_H_

#include <errno.h>   // for errno
#include <string.h>  // for strerror

#include <iostream>  // NOLINT(readability/streams)
#include <sstream>
#include <string>

#include "base/macros.h"

// Emulate Chrome-like logging.

// LogLevel is an enumeration that holds the log levels like libbase does.
enum LogLevel {
  INFO,
  WARNING,
  ERROR,
  FATAL,
};

namespace logging {

// Sets the log level. Anything at or above this level will be written to the
// log file/displayed to the user (if applicable). Anything below this level
// will be silently ignored. The log level defaults to 0 (everything is logged
// up to level INFO) if this function is not called.
// Note that log messages for VLOG(x) are logged at level -x, so setting
// the min log level to negative values enables verbose logging.
void SetMinLogLevel(int level);

// Gets the current log level.
int GetMinLogLevel();

// Gets the VLOG verbosity level.
int GetVlogVerbosity();

// Generic logging class that emulates logging from libbase. Do not use this
// class directly.
class LogBase {
 public:
  virtual ~LogBase() {}

  template <class T> LogBase& operator <<(const T& x) {
    ss_ << x;
    return *this;
  }

 protected:
  LogBase(const std::string label, const char* file, int line) {
    ss_ << "[" << label << ":"<< file << ":" << line << "] ";
  }

  // Accumulates the contents to be printed.
  std::ostringstream ss_;
};

// For general logging.
class Log : public LogBase {
 public:
  Log(LogLevel level, const char* level_str, const char* file, int line)
      : LogBase(level_str, file, line) {
    level_ = level;
  }

  ~Log() {
    if (level_ >= GetMinLogLevel())
      std::cerr << ss_.str() << std::endl;
    if (level_ >= FATAL)
      exit(EXIT_FAILURE);
  }

 protected:
  LogLevel level_;
};

// Like LOG but appends errno's string description to the logging.
class PLog : public Log {
 public:
  PLog(LogLevel level, const char* level_str, const char* file, int line)
      : Log(level, level_str, file, line) {}

  ~PLog() {
    if (level_ >= GetMinLogLevel())
      std::cerr << ss_.str() << ": " << strerror(errnum_) << std::endl;
  }

 private:
  // Cached error value, in case errno changes during this object's lifetime.
  int errnum_;
};

// Like LOG but conditional upon the logging verbosity level.
class VLog : public LogBase {
 public:
  VLog(int vlog_level, const char* file, int line)
      : LogBase(std::string("VLOG(") + std::to_string(vlog_level) + ")",
                file, line),
        vlog_level_(vlog_level) {}

  ~VLog() {
    if (vlog_level_ <= GetVlogVerbosity())
      std::cerr << ss_.str() << std::endl;
  }

 private:
  // Logging verbosity level. The logging will be printed if this value is less
  // than or equal to GetVlogVerbosity().
  int vlog_level_;
};

}  // namespace logging

// These macros are for LOG() and related logging commands.
#define LOG(level) logging::Log(level, #level, __FILE__, __LINE__)
#define PLOG(level) logging::PLog(level, #level, __FILE__, __LINE__)
#define VLOG(level) logging::VLog(level, __FILE__, __LINE__)

// Some macros from libbase that we use.
#define CHECK(x) if (!(x)) LOG(FATAL) << #x
#define CHECK_GT(x, y) if (!(x > y)) LOG(FATAL) << #x << " > " << #y << "failed"
#define CHECK_GE(x, y) if (!(x >= y)) LOG(FATAL) << #x << " >= " << #y \
                                                 << "failed"
#define CHECK_LE(x, y) if (!(x <= y)) LOG(FATAL) << #x << " <= " << #y \
                                                 << "failed"
#define CHECK_NE(x, y) if (!(x != y)) LOG(FATAL) << #x << " != " << #y \
                                                 << "failed"
#define CHECK_EQ(x, y) if (!(x == y)) LOG(FATAL) << #x << " == " << #y \
                                                 << "failed"
#define DLOG(x) LOG(x)
#define DCHECK(x) CHECK(x)

#endif  // CHROMIUMOS_WIDE_PROFILING_MYBASE_BASE_LOGGING_H_
