// 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.

#ifndef SRC_LEDGER_BIN_TESTING_DATA_GENERATOR_H_
#define SRC_LEDGER_BIN_TESTING_DATA_GENERATOR_H_

#include <lib/fidl/cpp/vector.h>

#include <climits>
#include <random>
#include <vector>

#include "peridot/lib/rng/random.h"
#include "src/ledger/bin/fidl/include/types.h"

namespace ledger {

class DataGenerator {
 public:
  explicit DataGenerator(rng::Random* random);

  ~DataGenerator();

  // Builds a key of the given |size| as "<random data>-<i>". The id (|i|) of
  // the result can be retrieved by calling |GetKeyId|.
  std::vector<uint8_t> MakeKey(int i, size_t size);

  // Builds a random value that can be used as a page id.
  PageId MakePageId();

  // Builds a random value of the given length.
  fidl::VectorPtr<uint8_t> MakeValue(size_t size);

  // Builds a vector of length |key_count| containing keys of size |key_size|,
  // |unique_key_count| of which are unique.
  std::vector<std::vector<uint8_t>> MakeKeys(size_t key_count, size_t key_size,
                                             size_t unique_key_count);

  // Returns the id of |key|. |key| is assumed to have been created by this
  // DataGenerator, using either |MakeKey| or |MakeKeys|.
  size_t GetKeyId(const std::vector<uint8_t>& key);

 private:
  std::independent_bits_engine<rng::Random::BitGenerator<uint64_t>, CHAR_BIT,
                               uint8_t>
      generator_;
};

}  // namespace ledger

#endif  // SRC_LEDGER_BIN_TESTING_DATA_GENERATOR_H_
