/*
 * Copyright 2019 The libgav1 Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef LIBGAV1_SRC_UTILS_LOGGING_H_
#define LIBGAV1_SRC_UTILS_LOGGING_H_

#include <cstddef>

#include "src/utils/compiler_attributes.h"

#if !defined(LIBGAV1_ENABLE_LOGGING)
#if defined(NDEBUG) || defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
#define LIBGAV1_ENABLE_LOGGING 0
#else
#define LIBGAV1_ENABLE_LOGGING 1
#endif
#endif

#if LIBGAV1_ENABLE_LOGGING
// LIBGAV1_DLOG(severity, printf-format-string)
// Debug logging that can optionally be enabled in release builds by explicitly
// setting LIBGAV1_ENABLE_LOGGING.
// Severity is given as an all-caps version of enum LogSeverity with the
// leading 'k' removed: LIBGAV1_DLOG(INFO, "...");
#define LIBGAV1_DLOG(severity, ...)                                       \
  do {                                                                    \
    constexpr const char* libgav1_logging_internal_basename =             \
        ::libgav1::internal::Basename(__FILE__, sizeof(__FILE__) - 1);    \
    ::libgav1::internal::Log(LIBGAV1_LOGGING_INTERNAL_##severity,         \
                             libgav1_logging_internal_basename, __LINE__, \
                             __VA_ARGS__);                                \
  } while (0)
#else
#define LIBGAV1_DLOG(severity, ...) \
  do {                              \
  } while (0)
#endif  // LIBGAV1_ENABLE_LOGGING

#define LIBGAV1_LOGGING_INTERNAL_ERROR ::libgav1::internal::LogSeverity::kError
#define LIBGAV1_LOGGING_INTERNAL_WARNING \
  ::libgav1::internal::LogSeverity::kWarning
#define LIBGAV1_LOGGING_INTERNAL_INFO ::libgav1::internal::LogSeverity::kInfo

namespace libgav1 {
namespace internal {

enum class LogSeverity : int {
  kError,
  kWarning,
  kInfo,
};

// Helper function to implement LIBGAV1_DLOG
// Logs |format, ...| at |severity| level, reporting it as called from
// |file|:|line|.
void Log(libgav1::internal::LogSeverity severity, const char* file, int line,
         const char* format, ...) LIBGAV1_PRINTF_ATTRIBUTE(4, 5);

// Compile-time function to get the 'base' file_name, that is, the part of
// a file_name after the last '/' or '\' path separator. The search starts at
// the end of the string; the second parameter is the length of the string.
constexpr const char* Basename(const char* file_name, size_t offset) {
  return (offset == 0 || file_name[offset - 1] == '/' ||
          file_name[offset - 1] == '\\')
             ? file_name + offset
             : Basename(file_name, offset - 1);
}

}  // namespace internal
}  // namespace libgav1

#endif  // LIBGAV1_SRC_UTILS_LOGGING_H_
