// Copyright 2020 The Pigweed 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
//
//     https://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.

// This is test verifies that the logging backend:
//
// - Compiles as plain C
// - Runs when compiled as C
//
// Unfortunately, since we do not know where the log sink actually goes, the
// logging functionality itself is not verified beyond compiling and running.

#define PW_LOG_MODULE_NAME "CTS"

#include "pw_log/log.h"

#ifdef __cplusplus
#error "This file must be compiled as plain C to verify C compilation works."
#endif  // __cplusplus

static void LoggingFromFunctionPlainC(void) { PW_LOG_INFO("From a function!"); }

static void CustomFormatStringTest(void);

void BasicLogTestPlainC(void) {
  int n = 3;

  // Debug level
  PW_LOG_DEBUG("This log statement should be at DEBUG level; no args");
  for (int i = 0; i < n; ++i) {
    PW_LOG_DEBUG("Counting: %d", i);
  }
  PW_LOG_DEBUG("Here is a string: %s; with another string %s", "foo", "bar");

  // Info level
  PW_LOG_INFO("This log statement should be at INFO level; no args");
  for (int i = 0; i < n; ++i) {
    PW_LOG_INFO("Counting: %d", i);
  }
  PW_LOG_INFO("Here is a string: %s; with another string %s", "foo", "bar");

  // Warn level
  PW_LOG_WARN("This log statement should be at WARN level; no args");
  for (int i = 0; i < n; ++i) {
    PW_LOG_WARN("Counting: %d", i);
  }
  PW_LOG_WARN("Here is a string: %s; with another string %s", "foo", "bar");

  // Error level.
  PW_LOG_ERROR("This log statement should be at ERROR level; no args");
  for (int i = 0; i < n; ++i) {
    PW_LOG_ERROR("Counting: %d", i);
  }
  PW_LOG_ERROR("Here is a string: %s; with another string %s", "foo", "bar");

  // Critical level.
  PW_LOG_CRITICAL("This log is the last one; device should reboot");

  // Core log macro, with manually specified level and flags.
  PW_LOG(PW_LOG_LEVEL_DEBUG,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         0,
         "A manual DEBUG-level message");
  PW_LOG(PW_LOG_LEVEL_DEBUG,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         1,
         "A manual DEBUG-level message; with a flag");

  PW_LOG(PW_LOG_LEVEL_INFO,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         0,
         "A manual INFO-level message");
  PW_LOG(PW_LOG_LEVEL_INFO,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         1,
         "A manual INFO-level message; with a flag");

  PW_LOG(PW_LOG_LEVEL_WARN,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         0,
         "A manual WARN-level message");
  PW_LOG(PW_LOG_LEVEL_WARN,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         1,
         "A manual WARN-level message; with a flag");

  PW_LOG(PW_LOG_LEVEL_ERROR,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         0,
         "A manual ERROR-level message");
  PW_LOG(PW_LOG_LEVEL_ERROR,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         1,
         "A manual ERROR-level message; with a flag");

  PW_LOG(PW_LOG_LEVEL_CRITICAL,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         0,
         "A manual CRITICAL-level message");
  PW_LOG(PW_LOG_LEVEL_CRITICAL,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         1,
         "A manual CRITICAL-level message; with a flag");

  // Log levels other than the standard ones work; what each backend does is
  // implementation defined.
  PW_LOG(
      0, PW_LOG_LEVEL, PW_LOG_MODULE_NAME, PW_LOG_FLAGS, "Custom log level: 0");
  PW_LOG(
      1, PW_LOG_LEVEL, PW_LOG_MODULE_NAME, PW_LOG_FLAGS, "Custom log level: 1");
  PW_LOG(
      2, PW_LOG_LEVEL, PW_LOG_MODULE_NAME, PW_LOG_FLAGS, "Custom log level: 2");
  PW_LOG(
      3, PW_LOG_LEVEL, PW_LOG_MODULE_NAME, PW_LOG_FLAGS, "Custom log level: 3");
  PW_LOG(100,
         PW_LOG_LEVEL,
         PW_LOG_MODULE_NAME,
         PW_LOG_FLAGS,
         "Custom log level: 100");

  // Logging from a function.
  LoggingFromFunctionPlainC();

  // Changing the module name mid-file.
#undef PW_LOG_MODULE_NAME
#define PW_LOG_MODULE_NAME "XYZ"
  PW_LOG_INFO("This has a custom module name");
  PW_LOG_INFO("So does this");

  CustomFormatStringTest();
}

#undef PW_LOG
#define PW_LOG(level, verbosity, module, flags, message, ...)            \
  DoNothingFakeFunction(module,                                          \
                        "%d/%d/%d: incoming transmission [" message "]", \
                        level,                                           \
                        __LINE__,                                        \
                        flags PW_COMMA_ARGS(__VA_ARGS__))

static void DoNothingFakeFunction(const char* module, const char* f, ...)
    PW_PRINTF_FORMAT(2, 3);

static void DoNothingFakeFunction(const char* module, const char* f, ...) {
  (void)module;
  (void)f;
}

static void CustomFormatStringTest(void) {
  PW_LOG_DEBUG("Abc");
  PW_LOG_INFO("Abc %d", 123);
  PW_LOG_WARN("Abc %d %s", 123, "four");
}
