// Copyright 2015 The Chromium 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 COMPONENTS_BROWSER_SYNC_SIGNIN_CONFIRMATION_HELPER_H_
#define COMPONENTS_BROWSER_SYNC_SIGNIN_CONFIRMATION_HELPER_H_

#include <stddef.h>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/task/cancelable_task_tracker.h"

namespace base {
class SequencedTaskRunner;
}

namespace history {
class HistoryService;
class QueryResults;
}

namespace browser_sync {

// Helper class for sync signin to check some asynchronous conditions. Call
// either CheckHasHistory or CheckHasTypedUrls or both, and |return_result|
// will be called with true if either returns true, otherwise false.
class SigninConfirmationHelper {
 public:
  SigninConfirmationHelper(history::HistoryService* history_service,
                           base::OnceCallback<void(bool)> return_result);

  // This helper checks if there are history entries in the history service.
  void CheckHasHistory(int max_entries);

  // This helper checks if there are typed URLs in the history service.
  void CheckHasTypedURLs();

 private:
  // Deletes itself.
  ~SigninConfirmationHelper();

  // Callback helper function for CheckHasHistory.
  void OnHistoryQueryResults(size_t max_entries,
                             history::QueryResults* results);

  // Posts the given result to the origin sequence.
  void PostResult(bool result);

  // Calls |return_result_| if |result| == true or if it's the result of the
  // last pending check.
  void ReturnResult(bool result);

  // The task runner for the sequence this object was constructed on.
  const scoped_refptr<base::SequencedTaskRunner> origin_sequence_;

  // Pointer to the history service.
  history::HistoryService* history_service_;

  // Used for async tasks.
  base::CancelableTaskTracker task_tracker_;

  // Keep track of how many async requests are pending.
  int pending_requests_;

  // Callback to pass the result back to the caller.
  base::OnceCallback<void(bool)> return_result_;

  DISALLOW_COPY_AND_ASSIGN(SigninConfirmationHelper);
};

}  // namespace browser_sync

#endif  // COMPONENTS_BROWSER_SYNC_SIGNIN_CONFIRMATION_HELPER_H_
