#include <string>

#include "absl/log/absl_check.h"
#include "google/protobuf/descriptor.h"
#include "google/protobuf/message.h"
#include "google/protobuf/message_lite.h"
#include "rust/cpp_kernel/strings.h"
#include "google/protobuf/text_format.h"

extern "C" {

// Returns the full name of the message from its Descriptor.
google::protobuf::rust::PtrAndLen proto2_rust_Descriptor_full_name(
    const google::protobuf::Descriptor* desc) {
  ABSL_CHECK(desc != nullptr) << "Descriptor is null.";
  return google::protobuf::rust::PtrAndLen{desc->full_name().data(),
                                 desc->full_name().size()};
}

// Converts a message to its TextFormat representation.
google::protobuf::rust::RustStringRawParts proto2_rust_Message_print_to_text_format(
    const google::protobuf::MessageLite* m, bool single_line, bool hide_unknown_fields) {
  const auto* msg = google::protobuf::DynamicCastMessage<google::protobuf::Message>(m);
  // This should always hold because the Rust API requires `WithReflection`.
  ABSL_CHECK(msg != nullptr) << "Message does not support reflection.";
  google::protobuf::TextFormat::Printer printer;
  printer.SetSingleLineMode(single_line);
  printer.SetHideUnknownFields(hide_unknown_fields);
  std::string text;
  ABSL_CHECK(printer.PrintToString(*msg, &text));
  return google::protobuf::rust::RustStringRawParts(text);
}

// Parses a message from its TextFormat representation.
bool proto2_rust_Message_parse_from_text_format(google::protobuf::MessageLite* m,
                                                google::protobuf::rust::PtrAndLen input) {
  auto* msg = google::protobuf::DynamicCastMessage<google::protobuf::Message>(m);
  // This should always hold because the Rust API requires `WithReflection`.
  ABSL_CHECK(msg != nullptr) << "Message does not support reflection.";
  return google::protobuf::TextFormat::ParseFromString(input.AsStringView(), msg);
}

}  // extern "C"
