// 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_LEDGER_APP_INSTANCE_FACTORY_H_
#define PERIDOT_BIN_LEDGER_TESTING_LEDGER_APP_INSTANCE_FACTORY_H_

#include <functional>
#include <memory>

#include <fuchsia/ledger/cloud/cpp/fidl.h>
#include <fuchsia/ledger/internal/cpp/fidl.h>
#include <lib/fxl/macros.h>

#include "peridot/bin/ledger/testing/loop_controller.h"
#include "peridot/lib/rng/random.h"
#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"

namespace ledger {

class LedgerAppInstanceFactory;

// Class that creates instances of |LedgerAppInstanceFactory|.
class LedgerAppInstanceFactoryBuilder {
 public:
  virtual ~LedgerAppInstanceFactoryBuilder(){};
  // Returns a new LedgerAppInstanceFactory.
  virtual std::unique_ptr<LedgerAppInstanceFactory> NewFactory() const = 0;
};

// Base class for client tests.
//
// Client tests are tests that act as clients to the Ledger as a whole. These
// are integration tests or end-to-end tests (apptests).
class LedgerAppInstanceFactory {
 public:
  // A Ledger app instance
  class LedgerAppInstance {
   public:
    LedgerAppInstance(
        LoopController* loop_controller,
        std::vector<uint8_t> test_ledger_name,
        ledger_internal::LedgerRepositoryFactoryPtr ledger_repository_factory);
    virtual ~LedgerAppInstance();

    // Returns the LedgerRepositoryFactory associated with this application
    // instance.
    ledger_internal::LedgerRepositoryFactory* ledger_repository_factory();
    // Builds and returns a new connection to the default LedgerRepository
    // object.
    ledger_internal::LedgerRepositoryPtr GetTestLedgerRepository();
    // Builds and returns a new connection to the default Ledger object.
    LedgerPtr GetTestLedger();
    // Builds and returns a new connection to a new random page on the default
    // Ledger object.
    PagePtr GetTestPage();
    // Returns a connection to the given page on the default Ledger object.
    PagePtr GetPage(const PageIdPtr& page_id, Status expected_status);

   private:
    virtual cloud_provider::CloudProviderPtr MakeCloudProvider() = 0;
    virtual std::string GetUserId() = 0;

    LoopController* loop_controller_;
    std::vector<uint8_t> test_ledger_name_;
    ledger_internal::LedgerRepositoryFactoryPtr ledger_repository_factory_;

    scoped_tmpfs::ScopedTmpFS tmpfs_;

    FXL_DISALLOW_COPY_AND_ASSIGN(LedgerAppInstance);
  };

  virtual ~LedgerAppInstanceFactory() {}

  // Starts a new instance of the Ledger. The |loop_controller| must allow to
  // control the loop that is used to access the LedgerAppInstance.
  virtual std::unique_ptr<LedgerAppInstance> NewLedgerAppInstance() = 0;

  // Returns the Loop controller controlling the loops of the LedgerAppInstances
  // created by this.
  virtual LoopController* GetLoopController() = 0;

  // Returns a random instance to control the randomness of the test.
  virtual rng::Random* GetRandom() = 0;
};

// Returns the list of LedgerAppInstanceFactoryBuilder to be passed as
// parameters to the tests. The implementation of this function changes
// depending on whether the tests are ran as integration tests, or end to end
// tests.
std::vector<const LedgerAppInstanceFactoryBuilder*>
GetLedgerAppInstanceFactoryBuilders();

}  // namespace ledger

#endif  // PERIDOT_BIN_LEDGER_TESTING_LEDGER_APP_INSTANCE_FACTORY_H_
