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

#include <map>
#include <memory>

#include <lib/callback/auto_cleanable.h>
#include <lib/fidl/cpp/interface_ptr.h>
#include <lib/fit/function.h>
#include <lib/fxl/macros.h>

#include "peridot/bin/ledger/app/merging/merge_resolver.h"
#include "peridot/bin/ledger/fidl/include/types.h"
#include "peridot/bin/ledger/storage/public/commit.h"
#include "peridot/bin/ledger/storage/public/page_storage.h"

namespace ledger {

// Manages the strategies for handling merges and conflicts for a ledger as
// managed by |LedgerManager|.
// Holds a ConflictResolverFactory if the client provides one.
// |LedgerMergeManager| must outlive all MergeResolver it provides.
class LedgerMergeManager {
 public:
  explicit LedgerMergeManager(Environment* environment);
  ~LedgerMergeManager();

  void AddFactory(fidl::InterfaceHandle<ConflictResolverFactory> factory);

  std::unique_ptr<MergeResolver> GetMergeResolver(
      storage::PageStorage* storage);

 private:
  void ResetFactory();
  void RemoveResolver(const storage::PageId& page_id);
  void GetResolverStrategyForPage(
      const storage::PageId& page_id,
      fit::function<void(std::unique_ptr<MergeStrategy>)> strategy_callback);
  void ResetStrategyForPage(storage::PageId page_id);

  Environment* const environment_;

  class ConflictResolverFactoryPtrContainer;

  // Inactive, available conflict resolver factories
  callback::AutoCleanableSet<ConflictResolverFactoryPtrContainer>
      conflict_resolver_factories_;
  // The ConflictResolverFactory that is currently in use
  fidl::InterfacePtr<ConflictResolverFactory>
      current_conflict_resolver_factory_;
  // |true| if using the default last-one-wins conflict resolver factory
  bool using_default_conflict_resolver_ = true;

  std::map<storage::PageId, MergeResolver*> resolvers_;

  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerMergeManager);
};
}  // namespace ledger
#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_LEDGER_MERGE_MANAGER_H_
