// Copyright 2016 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_APP_PAGE_SNAPSHOT_IMPL_H_
#define SRC_LEDGER_BIN_APP_PAGE_SNAPSHOT_IMPL_H_

#include <memory>

#include "src/ledger/bin/fidl/error_notifier.h"
#include "src/ledger/bin/fidl/include/types.h"
#include "src/ledger/bin/storage/public/commit.h"
#include "src/ledger/bin/storage/public/page_storage.h"

namespace ledger {

// An implementation of the |PageSnapshot| FIDL interface.
class PageSnapshotImpl
    : public fuchsia::ledger::PageSnapshotErrorNotifierDelegate {
 public:
  PageSnapshotImpl(storage::PageStorage* page_storage,
                   std::unique_ptr<const storage::Commit> commit,
                   std::string key_prefix);
  ~PageSnapshotImpl() override;

 private:
  // PageSnapshot:
  void GetEntries(
      std::vector<uint8_t> key_start, std::unique_ptr<Token> token,
      fit::function<void(Status, IterationStatus, std::vector<Entry>,
                         std::unique_ptr<Token>)>
          callback) override;
  void GetEntriesInline(
      std::vector<uint8_t> key_start, std::unique_ptr<Token> token,
      fit::function<void(Status, IterationStatus, std::vector<InlinedEntry>,
                         std::unique_ptr<Token>)>
          callback) override;
  void GetKeys(std::vector<uint8_t> key_start, std::unique_ptr<Token> token,
               fit::function<void(Status, IterationStatus,
                                  std::vector<std::vector<uint8_t>>,
                                  std::unique_ptr<Token>)>
                   callback) override;
  void Get(std::vector<uint8_t> key,
           fit::function<void(Status, fuchsia::ledger::PageSnapshot_Get_Result)>
               callback) override;
  void GetInline(std::vector<uint8_t> key,
                 fit::function<void(
                     Status, fuchsia::ledger::PageSnapshot_GetInline_Result)>
                     callback) override;
  void Fetch(
      std::vector<uint8_t> key,
      fit::function<void(Status, fuchsia::ledger::PageSnapshot_Fetch_Result)>
          callback) override;
  void FetchPartial(
      std::vector<uint8_t> key, int64_t offset, int64_t max_size,
      fit::function<void(Status,
                         fuchsia::ledger::PageSnapshot_FetchPartial_Result)>
          callback) override;

  storage::PageStorage* page_storage_;
  std::unique_ptr<const storage::Commit> commit_;
  const std::string key_prefix_;
};

}  // namespace ledger

#endif  // SRC_LEDGER_BIN_APP_PAGE_SNAPSHOT_IMPL_H_
