// Copyright 2019 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 "src/ledger/bin/tests/integration/test_page_watcher.h"

namespace ledger {

TestPageWatcher::TestPageWatcher(fidl::InterfaceRequest<PageWatcher> request,
                                 fit::closure change_callback)
    : binding_(this, std::move(request)),
      change_callback_(std::move(change_callback)) {}

void TestPageWatcher::DelayCallback(bool delay_callback) {
  delay_callback_ = delay_callback;
}

void TestPageWatcher::CallOnChangeCallback() {
  FXL_CHECK(on_change_callback_);
  on_change_callback_(last_snapshot_.NewRequest());
  on_change_callback_ = nullptr;
}

uint TestPageWatcher::GetChangesSeen() { return changes_seen_; }

ResultState TestPageWatcher::GetLastResultState() { return last_result_state_; }

PageSnapshotPtr* TestPageWatcher::GetLastSnapshot() { return &last_snapshot_; }

const PageChange& TestPageWatcher::GetLastPageChange() {
  return last_page_change_;
}

void TestPageWatcher::OnChange(PageChange page_change, ResultState result_state,
                               OnChangeCallback callback) {
  changes_seen_++;
  last_result_state_ = result_state;
  last_page_change_ = std::move(page_change);
  last_snapshot_.Unbind();
  FXL_CHECK(!on_change_callback_);
  on_change_callback_ = std::move(callback);
  if (!delay_callback_) {
    CallOnChangeCallback();
  }
  change_callback_();
}

}  // namespace ledger
