#include "bmc/proto_reader.h"

#include <cerrno>
#include <cstring>
#include <filesystem>  // NOLINT(build/c++17)
#include <fstream>
#include <ios>
#include <iterator>
#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) {
  std::ifstream f(file_name.c_str(), std::ios_base::in | std::ios::binary);
  if (!f.is_open()) {
    char* st_err = strerror(errno);
    LOG(ERROR) << "read: Failed to open file " << file_name << " " << st_err;
    return absl::InvalidArgumentError("read: Failed to open file");
  }
  std::string content{std::istreambuf_iterator<char>(f),
                      std::istreambuf_iterator<char>()};
  if (!f) {
    char* st_err = strerror(errno);
    LOG(ERROR) << "read: Failed to read file " << file_name << " " << st_err;
    return absl::UnavailableError("read: Failed to read file");
  }
  f.close();
  if (!f) {
    char* st_err = strerror(errno);
    LOG(ERROR) << "read: Failed to close file " << file_name << " " << st_err;
    return absl::UnavailableError("read: Failed to close file");
  }
  return content;
}

absl::Status WriteBinaryFile(const std::filesystem::path& file_name,
                             absl::string_view content) {
  std::ofstream f(file_name.c_str(), std::ios_base::out | std::ios::binary);
  if (!f.is_open()) {
    char* st_err = strerror(errno);
    LOG(ERROR) << "write: Failed to open file " << file_name << " " << st_err;
    return absl::InvalidArgumentError("write: Failed to open file");
  }
  f.write(content.data(), content.size());
  if (!f) {
    char* st_err = strerror(errno);
    LOG(ERROR) << "write: Failed to write file " << file_name << " " << st_err;
    return absl::UnavailableError("write: Failed to write file");
  }
  f.close();
  if (!f) {
    char* st_err = strerror(errno);
    LOG(ERROR) << "write: Failed to close file " << file_name << " " << st_err;
    return absl::UnavailableError("write: Failed to close file");
  }
  return absl::OkStatus();
}

}  // namespace proto_reader
