#ifndef AOS_LOGGING_LOGGING_H_
#define AOS_LOGGING_LOGGING_H_

// This file contains the logging client interface. It works with both C and C++
// code.

#include <errno.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "aos/libc/aos_strerror.h"
#include "aos/macros.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef uint8_t log_level;

#define DECL_LEVELS                                                       \
  DECL_LEVEL(DEBUG, 0); /* stuff that gets printed out every cycle */     \
  DECL_LEVEL(INFO, 1);  /* things like PosEdge/NegEdge */                 \
  /* things that might still work if they happen occasionally */          \
  DECL_LEVEL(WARNING, 2);                                                 \
  /*-1 so that vxworks macro of same name will have same effect if used*/ \
  DECL_LEVEL(ERROR, -1); /* errors */                                     \
  /* serious errors. the logging code will terminate the process/task */  \
  DECL_LEVEL(FATAL, 4);                                                   \
  DECL_LEVEL(LOG_UNKNOWN, 5); /* unknown logging level */
#define DECL_LEVEL(name, value) static const log_level name = value;
DECL_LEVELS;
#undef DECL_LEVEL

#ifdef __cplusplus
extern "C" {
#endif

// Actually implements the basic logging call.
// Does not check that level is valid.
void log_do(log_level level, const char *format, ...)
    __attribute__((format(GOOD_PRINTF_FORMAT_TYPE, 2, 3)));

#ifdef __cplusplus
}
#endif

// A magical static const char[] or string literal that communicates the name
// of the enclosing function.
// It's currently using __PRETTY_FUNCTION__ because both GCC and Clang support
// that and it gives nicer results in C++ than the standard __func__ (which
// would also work).
//#define LOG_CURRENT_FUNCTION __PRETTY_FUNCTION__
#define LOG_CURRENT_FUNCTION __func__

#define LOG_SOURCENAME __FILE__

// The basic logging call.
#define AOS_LOG(level, format, args...)                                        \
  do {                                                                         \
    log_do(level, LOG_SOURCENAME ": " AOS_STRINGIFY(__LINE__) ": %s: " format, \
           LOG_CURRENT_FUNCTION, ##args);                                      \
    /* so that GCC knows that it won't return */                               \
    if (level == FATAL) {                                                      \
      fprintf(stderr, "log_do(FATAL) fell through!!!!!\n");                    \
      printf("see stderr\n");                                                  \
      abort();                                                                 \
    }                                                                          \
  } while (0)

// Same as LOG except appends " due to %d (%s)\n" (formatted with errno and
// aos_strerror(errno)) to the message.
#define AOS_PLOG(level, format, args...) AOS_PELOG(level, errno, format, ##args)

// Like PLOG except allows specifying an error other than errno.
#define AOS_PELOG(level, error_in, format, args...)           \
  do {                                                        \
    const int error = error_in;                               \
    AOS_LOG(level, format " due to %d (%s)\n", ##args, error, \
            aos_strerror(error));                             \
  } while (0);

// Allows format to not be a string constant.
#define AOS_LOG_DYNAMIC(level, format, args...)                             \
  do {                                                                      \
    static char log_buf[LOG_MESSAGE_LEN];                                   \
    int ret = snprintf(log_buf, sizeof(log_buf), format, ##args);           \
    if (ret < 0 || (uintmax_t)ret >= LOG_MESSAGE_LEN) {                     \
      AOS_LOG(ERROR, "next message was too long so not subbing in args\n"); \
      AOS_LOG(level, "%s", format);                                         \
    } else {                                                                \
      AOS_LOG(level, "%s", log_buf);                                        \
    }                                                                       \
  } while (0)

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus

namespace aos {

// CHECK* macros, similar to glog
// (<http://google-glog.googlecode.com/svn/trunk/doc/glog.html>)'s, except they
// don't support streaming in extra text. Some of the implementation is borrowed
// from there too.
// They all LOG(FATAL) with a helpful message when the check fails.
// Portions copyright (c) 1999, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// CHECK dies with a fatal error if condition is not true.  It is *not*
// controlled by NDEBUG, so the check will be executed regardless of
// compilation mode.  Therefore, it is safe to do things like:
//    CHECK(fp->Write(x) == 4)
// TODO(austin): We want to be pushing people to glog instead of AOS_CHECK here.
// You are crashing anyways.  If we want glog to tee to AOS_LOG as well, we'll
// implement that through that path.
#define AOS_CHECK(condition)                          \
  if (__builtin_expect(!(condition), 0)) {            \
    AOS_LOG(FATAL, "CHECK(%s) failed\n", #condition); \
  }

// Helper functions for CHECK_OP macro.
// The (int, int) specialization works around the issue that the compiler
// will not instantiate the template version of the function on values of
// unnamed enum type.
#define AOS_DEFINE_CHECK_OP_IMPL(name, op)                          \
  template <typename T1, typename T2>                               \
  inline void LogImpl##name(const T1 &v1, const T2 &v2,             \
                            const char *exprtext) {                 \
    if (!__builtin_expect(v1 op v2, 1)) {                           \
      log_do(FATAL,                                                 \
             LOG_SOURCENAME                                         \
             ": " AOS_STRINGIFY(__LINE__) ": CHECK(%s) failed\n",   \
             exprtext);                                             \
      fprintf(stderr, "log_do(FATAL) fell through!!!!!\n");         \
      printf("see stderr\n");                                       \
      abort();                                                      \
    }                                                               \
  }                                                                 \
  inline void LogImpl##name(int v1, int v2, const char *exprtext) { \
    ::aos::LogImpl##name<int, int>(v1, v2, exprtext);               \
  }

// We use the full name Check_EQ, Check_NE, etc. in case the file including
// base/logging.h provides its own #defines for the simpler names EQ, NE, etc.
// This happens if, for example, those are used as token names in a
// yacc grammar.
AOS_DEFINE_CHECK_OP_IMPL(Check_EQ, ==)  // Compilation error with CHECK_EQ(NULL, x)?
AOS_DEFINE_CHECK_OP_IMPL(Check_NE, !=)  // Use CHECK(x == NULL) instead.
AOS_DEFINE_CHECK_OP_IMPL(Check_LE, <=)
AOS_DEFINE_CHECK_OP_IMPL(Check_LT, <)
AOS_DEFINE_CHECK_OP_IMPL(Check_GE, >=)
AOS_DEFINE_CHECK_OP_IMPL(Check_GT, >)

#define AOS_CHECK_OP(name, op, val1, val2) \
  ::aos::LogImplCheck##name(               \
      val1, val2, AOS_STRINGIFY(val1) AOS_STRINGIFY(op) AOS_STRINGIFY(val2))

#define AOS_CHECK_EQ(val1, val2) AOS_CHECK_OP(_EQ, ==, val1, val2)
#define AOS_CHECK_NE(val1, val2) AOS_CHECK_OP(_NE, !=, val1, val2)
#define AOS_CHECK_LE(val1, val2) AOS_CHECK_OP(_LE, <=, val1, val2)
#define AOS_CHECK_LT(val1, val2) AOS_CHECK_OP(_LT, <, val1, val2)
#define AOS_CHECK_GE(val1, val2) AOS_CHECK_OP(_GE, >=, val1, val2)
#define AOS_CHECK_GT(val1, val2) AOS_CHECK_OP(_GT, >, val1, val2)

// A small helper for CHECK_NOTNULL().
template <typename T>
inline T *CheckNotNull(const char *value_name, T *t) {
  if (t == NULL) {
    AOS_LOG(FATAL, "'%s' must not be NULL\n", value_name);
  }
  return t;
}

// Check that the input is non NULL.  This very useful in constructor
// initializer lists.
#define AOS_CHECK_NOTNULL(val) ::aos::CheckNotNull(AOS_STRINGIFY(val), val)

inline int CheckSyscall(const char *syscall_string, int value) {
  if (__builtin_expect(value == -1, false)) {
    AOS_PLOG(FATAL, "%s failed", syscall_string);
  }
  return value;
}

inline void CheckSyscallReturn(const char *syscall_string, int value) {
  if (__builtin_expect(value != 0, false)) {
    AOS_PELOG(FATAL, value, "%s failed", syscall_string);
  }
}

// Check that syscall does not return -1. If it does, PLOG(FATAL)s. This is
// useful for quickly checking syscalls where it's not very useful to print out
// the values of any of the arguments. Returns the result otherwise.
//
// Example: const int fd = AOS_PCHECK(open("/tmp/whatever", O_WRONLY))
#define AOS_PCHECK(syscall) ::aos::CheckSyscall(AOS_STRINGIFY(syscall), syscall)

// PELOG(FATAL)s with the result of syscall if it returns anything other than 0.
// This is useful for quickly checking things like many of the pthreads
// functions where it's not very useful to print out the values of any of the
// arguments.
//
// Example: AOS_PRCHECK(munmap(address, length))
#define AOS_PRCHECK(syscall) \
  ::aos::CheckSyscallReturn(AOS_STRINGIFY(syscall), syscall)

}  // namespace aos

#endif  // __cplusplus

#endif
