// Copyright 2018 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_SUGGESTION_ENGINE_QUERY_RUNNER_H_
#define PERIDOT_BIN_SUGGESTION_ENGINE_QUERY_RUNNER_H_

#include <set>

#include <fuchsia/modular/cpp/fidl.h>
#include <lib/fxl/memory/weak_ptr.h>

namespace modular {

struct QueryHandlerRecord;

// QueryRunner is in charge of executing a query and interacting with the query
// handlers, making sure all of them return or timeout if the query takes too
// long to resolve. Through its callbacks it notifies when a query response
// arrives and when all handlers finish processing the query or it times out.
class QueryRunner {
 public:
  QueryRunner(fidl::InterfaceHandle<fuchsia::modular::QueryListener> listener,
              fuchsia::modular::UserInput input, int count);
  ~QueryRunner();

  // Starts running a query notifying the provided handlers and processes their
  // responses.
  void Run(const std::vector<QueryHandlerRecord>& query_handlers);

  // Sets a callback that will be executed when a query request ends.
  void SetEndRequestCallback(std::function<void()> callback);

  // Sets a callback that will be executed when a response for the query in
  // execution is received.
  void SetResponseCallback(
      std::function<void(std::string, fuchsia::modular::QueryResponse)>
          callback);

  fuchsia::modular::QueryListener* listener() const { return listener_.get(); }
  size_t max_results() const { return max_results_; }

 private:
  class HandlerRequest;

  void DispatchQuery(const QueryHandlerRecord& handler_record);
  void TimeOut();
  void EndRequest();

  fuchsia::modular::QueryListenerPtr listener_;
  const fuchsia::modular::UserInput input_;
  const size_t max_results_;
  bool request_ended_;
  fxl::WeakPtrFactory<QueryRunner> weak_ptr_factory_;

  std::function<void(std::string, fuchsia::modular::QueryResponse)>
      on_query_response_callback_;
  std::function<void()> on_end_request_callback_;

  std::multiset<std::string> outstanding_handlers_;
};

struct QueryHandlerRecord {
  QueryHandlerRecord(fuchsia::modular::QueryHandlerPtr handler, std::string url)
      : handler(std::move(handler)), url(std::move(url)) {}

  fuchsia::modular::QueryHandlerPtr handler;
  std::string url;
};

}  // namespace modular

#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_QUERY_RUNNER_H_
