// 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 PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_CLOUD_PROVIDER_H_
#define PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_CLOUD_PROVIDER_H_

#include <fuchsia/ledger/cloud/cpp/fidl.h>
#include <lib/callback/auto_cleanable.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fxl/macros.h>

#include "peridot/bin/ledger/fidl_helpers/bound_interface_set.h"
#include "peridot/bin/ledger/testing/cloud_provider/fake_device_set.h"
#include "peridot/bin/ledger/testing/cloud_provider/fake_page_cloud.h"
#include "peridot/bin/ledger/testing/cloud_provider/types.h"

namespace ledger {

class FakeCloudProvider : public cloud_provider::CloudProvider {
 public:
  class Builder {
   public:
    Builder();
    ~Builder();

    Builder& SetInjectNetworkError(InjectNetworkError inject_network_error);
    Builder& SetCloudEraseOnCheck(CloudEraseOnCheck cloud_erase_on_check);
    Builder& SetCloudEraseFromWatcher(
        CloudEraseFromWatcher cloud_erase_from_watcher);

    std::unique_ptr<FakeCloudProvider> Build();

   private:
    friend FakeCloudProvider;

    InjectNetworkError inject_network_error_ = InjectNetworkError::NO;
    CloudEraseOnCheck cloud_erase_on_check_ = CloudEraseOnCheck::NO;
    CloudEraseFromWatcher cloud_erase_from_watcher_ = CloudEraseFromWatcher::NO;
  };

  FakeCloudProvider();
  explicit FakeCloudProvider(const Builder& builder);
  ~FakeCloudProvider() override;

 private:
  void GetDeviceSet(
      fidl::InterfaceRequest<cloud_provider::DeviceSet> device_set,
      GetDeviceSetCallback callback) override;

  void GetPageCloud(
      std::vector<uint8_t> app_id, std::vector<uint8_t> page_id,
      fidl::InterfaceRequest<cloud_provider::PageCloud> page_cloud,
      GetPageCloudCallback callback) override;

  fidl_helpers::BoundInterfaceSet<cloud_provider::DeviceSet, FakeDeviceSet>
      device_set_;

  callback::AutoCleanableMap<std::string, FakePageCloud> page_clouds_;

  InjectNetworkError inject_network_error_;

  FXL_DISALLOW_COPY_AND_ASSIGN(FakeCloudProvider);
};

}  // namespace ledger

#endif  // PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_CLOUD_PROVIDER_H_
