#include "google/protobuf/unredacted_debug_format_for_test.h"

#include <string>

#include "absl/log/absl_check.h"
#include "google/protobuf/message.h"
#include "google/protobuf/message_lite.h"
#include "google/protobuf/text_format.h"

namespace google {
namespace protobuf {
namespace util {

std::string UnredactedDebugFormatForTest(const google::protobuf::Message& message) {
  std::string debug_string;

  google::protobuf::TextFormat::Printer printer;
  printer.SetExpandAny(true);
  printer.SetReportSensitiveFields(
      internal::FieldReporterLevel::kUnredactedDebugFormatForTest);

  ABSL_CHECK(printer.PrintToString(message, &debug_string));

  return debug_string;
}

std::string UnredactedShortDebugFormatForTest(const google::protobuf::Message& message) {
  std::string debug_string;

  google::protobuf::TextFormat::Printer printer;
  printer.SetSingleLineMode(true);
  printer.SetExpandAny(true);
  printer.SetReportSensitiveFields(
      internal::FieldReporterLevel::kUnredactedShortDebugFormatForTest);

  ABSL_CHECK(printer.PrintToString(message, &debug_string));
  // Single line mode currently might have an extra space at the end.
  if (!debug_string.empty() && debug_string[debug_string.size() - 1] == ' ') {
    debug_string.resize(debug_string.size() - 1);
  }

  return debug_string;
}

std::string UnredactedUtf8DebugFormatForTest(const google::protobuf::Message& message) {
  std::string debug_string;

  google::protobuf::TextFormat::Printer printer;
  printer.SetUseUtf8StringEscaping(true);
  printer.SetExpandAny(true);
  printer.SetReportSensitiveFields(
      internal::FieldReporterLevel::kUnredactedUtf8DebugFormatForTest);

  ABSL_CHECK(printer.PrintToString(message, &debug_string));

  return debug_string;
}

std::string UnredactedDebugFormatForTest(const google::protobuf::MessageLite& message) {
  return message.DebugString();
}

std::string UnredactedShortDebugFormatForTest(
    const google::protobuf::MessageLite& message) {
  return message.ShortDebugString();
}

std::string UnredactedUtf8DebugFormatForTest(
    const google::protobuf::MessageLite& message) {
  return message.Utf8DebugString();
}

}  // namespace util
}  // namespace protobuf
}  // namespace google
