// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/ledger/bin/storage/impl/file_index.h"

#include "src/ledger/bin/storage/impl/object_identifier_encoding.h"

namespace storage {

bool FileIndexSerialization::CheckValidFileIndexSerialization(
    fxl::StringView data) {
  flatbuffers::Verifier verifier(
      reinterpret_cast<const unsigned char*>(data.data()), data.size());
  return VerifyFileIndexBuffer(verifier);
}

Status FileIndexSerialization::ParseFileIndex(fxl::StringView content,
                                              const FileIndex** file_index) {
  if (!CheckValidFileIndexSerialization(content)) {
    return Status::FORMAT_ERROR;
  }
  *file_index = GetFileIndex(content.data());
  return Status::OK;
}

void FileIndexSerialization::BuildFileIndex(
    const std::vector<ObjectIdentifierAndSize>& children,
    std::unique_ptr<DataSource::DataChunk>* output, size_t* total_size) {
  auto builder = std::make_unique<flatbuffers::FlatBufferBuilder>();
  size_t local_total_size = 0u;

  std::vector<flatbuffers::Offset<ObjectChild>> object_children;
  for (const auto& identifier_and_size : children) {
    local_total_size += identifier_and_size.size;
    object_children.push_back(
        CreateObjectChild(*builder, identifier_and_size.size,
                          ToObjectIdentifierStorage(
                              builder.get(), identifier_and_size.identifier)));
  }
  FinishFileIndexBuffer(
      *builder, CreateFileIndex(*builder, local_total_size,
                                builder->CreateVector(object_children.data(),
                                                      object_children.size())));

  *output = DataSource::DataChunk::Create(std::move(builder));
  *total_size = local_total_size;
}

}  // namespace storage
