#ifndef PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_PROTO_READER_H_
#define PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_PROTO_READER_H_

#include <filesystem>  // NOLINT(build/c++17)
#include <string>

#include "absl/log/log.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"

namespace proto_reader {

absl::StatusOr<std::string> ReadBinaryFile(
    const std::filesystem::path& file_name);

absl::Status WriteBinaryFile(const std::filesystem::path& file_name,
                             absl::string_view content);
template <typename T>
inline absl::StatusOr<T> ReadProto(const std::filesystem::path& proto_path) {
  if (!std::filesystem::exists(proto_path) ||
      !std::filesystem::is_regular_file(proto_path)) {
    LOG(ERROR) << "proto file " << proto_path << " not found";
    return absl::NotFoundError("proto file error");
  }
  absl::StatusOr<std::string> serialized_proto = ReadBinaryFile(proto_path);
  if (!serialized_proto.ok()) {
    return serialized_proto.status();
  }
  if (T proto; proto.ParseFromString(*serialized_proto)) {
    return proto;
  } else {
    LOG(ERROR) << "Failed to deserialize the proto file" << proto_path;
    return absl::InvalidArgumentError("Failed to deserialize the proto file");
  }
}

template <typename T>
inline absl::Status WriteProto(const std::filesystem::path& proto_path,
                               T in_proto) {
  std::string str_proto;
  if (!in_proto.SerializeToString(&str_proto)) {
    LOG(ERROR) << "Failed to serialize message.";
    return absl::InvalidArgumentError("Failed to serialize the proto file");
  }
  return WriteBinaryFile(proto_path, str_proto);
}

}  // namespace proto_reader

#endif  // PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_PROTO_READER_H_
