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

#include <memory>
#include <string>
#include <vector>

#include "base/callback.h"
#include "base/macros.h"
#include "mojo/common/binding_set.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/services/ui/views/interfaces/view_associates.mojom.h"
#include "mojo/services/ui/views/interfaces/view_manager.mojom.h"

namespace view_manager {

// Maintains a table of all connected view associates.
class ViewAssociateTable : public mojo::ui::ViewAssociateOwner {
 public:
  using AssociateConnectionErrorCallback =
      base::Callback<void(const std::string&)>;

  ViewAssociateTable();
  ~ViewAssociateTable() override;

  void RegisterViewAssociate(
      mojo::ui::ViewInspector* inspector,
      mojo::ui::ViewAssociatePtr associate,
      mojo::InterfaceRequest<mojo::ui::ViewAssociateOwner> view_associate_owner,
      const mojo::String& label);

  void FinishedRegisteringViewAssociates();

  // Connects to services offered by the view associates.
  void ConnectToViewService(mojo::ui::ViewTokenPtr view_token,
                            const mojo::String& service_name,
                            mojo::ScopedMessagePipeHandle client_handle);
  void ConnectToViewTreeService(mojo::ui::ViewTreeTokenPtr view_tree_token,
                                const mojo::String& service_name,
                                mojo::ScopedMessagePipeHandle client_handle);

  void OnConnected(uint32_t index, mojo::ui::ViewAssociateInfoPtr info);

  size_t associate_count();

 private:
  struct AssociateData {
    AssociateData(const std::string& label,
                  mojo::ui::ViewAssociatePtr associate,
                  mojo::ui::ViewAssociateOwner* associate_owner_impl,
                  mojo::ui::ViewInspector* inspector);
    ~AssociateData();

    void BindOwner(mojo::InterfaceRequest<mojo::ui::ViewAssociateOwner>
                       view_associate_owner_request);

    const std::string label;
    mojo::ui::ViewAssociatePtr associate;
    mojo::Binding<mojo::ui::ViewAssociateOwner> associate_owner;
    mojo::ui::ViewAssociateInfoPtr info;
    mojo::Binding<mojo::ui::ViewInspector> inspector_binding;
  };

  bool RemoveAssociateData(AssociateData* associate_data, std::string& label);
  void CompleteDeferredWorkIfReady();
  void OnAssociateOwnerConnectionError(AssociateData* associate_data);
  void OnAssociateConnectionError(AssociateData* associate_data);

  std::vector<std::unique_ptr<AssociateData>> associates_;

  uint32_t pending_connection_count_ = 0u;
  bool waiting_to_register_associates_ = true;
  std::vector<base::Closure> deferred_work_;

  DISALLOW_COPY_AND_ASSIGN(ViewAssociateTable);
};

}  // namespace view_manager

#endif  // SERVICES_UI_VIEW_MANAGER_VIEW_ASSOCIATE_TABLE_H_
