#include "image_io/base/byte_buffer.h"

#include <utility>

namespace photos_editing_formats {
namespace image_io {

using std::string;
using std::unique_ptr;

/// @param byte_data The byte data to write to the buffer at pos.
/// @param pos The location in a buffer to write the byte data to.
/// @return The number of bytes written to the buffer at pos.
static size_t WriteBytes(const ByteData& byte_data, Byte* pos) {
  size_t byte_count = byte_data.GetByteCount();
  if (!byte_count) {
    return 0;
  }
  if (byte_data.GetType() == ByteData::kHex) {
    const string& value = byte_data.GetValue();
    for (size_t index = 0; index < byte_count; ++index) {
      if (!ByteData::Hex2Byte(value[2 * index], value[2 * index + 1], pos++)) {
        return 0;
      }
    }
  } else {
    memcpy(pos, byte_data.GetValue().c_str(), byte_count);
  }
  return byte_count;
}

ByteBuffer::ByteBuffer(size_t size, std::unique_ptr<Byte[]> buffer)
    : buffer_(std::move(buffer)), size_(size) {
  if (!buffer_) {
    size_ = 0;
  }
  if (!size_) {
    buffer_.reset();
  }
}

ByteBuffer::ByteBuffer(const std::vector<ByteData>& byte_data_vector) {
  size_ = 0;
  for (const auto& byte_data : byte_data_vector) {
    size_ += byte_data.GetByteCount();
  }
  if (!size_) {
    return;
  }
  // Note that within google3, std::make_unique is not available, and clangtidy
  // says use absl::make_unique. This library attempts to minimize the number of
  // dependencies on google3, hence the no lint on the next line.
  buffer_.reset(new Byte[size_]);  // NOLINT
  Byte* pos = buffer_.get();
  for (const auto& byte_data : byte_data_vector) {
    size_t bytes_written = WriteBytes(byte_data, pos);
    if (bytes_written == 0 && byte_data.GetByteCount() != 0) {
      size_ = 0;
      buffer_.reset(nullptr);
    }
    pos += bytes_written;
  }
}

bool ByteBuffer::SetBigEndianValue(size_t location, std::uint16_t value) {
  if (location + 1 >= size_) {
    return false;
  }
  buffer_[location] = static_cast<Byte>(value >> 8);
  buffer_[location + 1] = static_cast<Byte>(value & 0xFF);
  return true;
}

Byte* ByteBuffer::Release() {
  size_ = 0;
  return buffer_.release();
}

}  // namespace image_io
}  // namespace photos_editing_formats
