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

#include "peridot/bin/ledger/app/merging/custom_merge_strategy.h"

#include <memory>

#include <lib/fit/function.h>

#include "peridot/bin/ledger/app/page_manager.h"

namespace ledger {
CustomMergeStrategy::CustomMergeStrategy(ConflictResolverPtr conflict_resolver)
    : conflict_resolver_(std::move(conflict_resolver)) {
  conflict_resolver_.set_error_handler([this](zx_status_t status) {
    // If a merge is in progress, it must be terminated.
    if (in_progress_merge_) {
      // The actual cleanup of in_progress_merge_ will happen in its on_done
      // callback.
      in_progress_merge_->Cancel();
    }
    if (on_error_) {
      // It is safe to call |on_error_| because the error handler waits for the
      // merges to finish before deleting this object.
      on_error_();
    }
  });
}

CustomMergeStrategy::~CustomMergeStrategy() {}

void CustomMergeStrategy::SetOnError(fit::closure on_error) {
  on_error_ = std::move(on_error);
}

void CustomMergeStrategy::Merge(storage::PageStorage* storage,
                                PageManager* page_manager,
                                std::unique_ptr<const storage::Commit> head_1,
                                std::unique_ptr<const storage::Commit> head_2,
                                std::unique_ptr<const storage::Commit> ancestor,
                                fit::function<void(Status)> callback) {
  FXL_DCHECK(head_1->GetTimestamp() <= head_2->GetTimestamp());
  FXL_DCHECK(!in_progress_merge_);

  in_progress_merge_ = std::make_unique<ConflictResolverClient>(
      storage, page_manager, conflict_resolver_.get(), std::move(head_2),
      std::move(head_1), std::move(ancestor),
      [this, callback = std::move(callback)](Status status) {
        in_progress_merge_.reset();
        callback(status);
      });

  in_progress_merge_->Start();
}

void CustomMergeStrategy::Cancel() {
  if (in_progress_merge_) {
    in_progress_merge_->Cancel();
  }
}

}  // namespace ledger
