// Copyright 2016 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_PROPOSAL_PUBLISHER_IMPL_H_
#define PERIDOT_BIN_SUGGESTION_ENGINE_PROPOSAL_PUBLISHER_IMPL_H_

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

#include "peridot/lib/bound_set/bound_set.h"

namespace modular {

class SuggestionEngineImpl;

/*
  ProposalPublisherImpl tracks proposals and their resulting suggestions
  from a single suggestion agent. Source entries are created on demand and kept
  alive as long as any proposals or publisher bindings exist.

 TODO: The component_url should eventually be replaced with a more consistent
  identifier that's reused across components to identify specific executables.
*/
class ProposalPublisherImpl : public fuchsia::modular::ProposalPublisher {
 public:
  ProposalPublisherImpl(SuggestionEngineImpl* engine,
                        const std::string& component_url);

  ~ProposalPublisherImpl() override;

  void AddBinding(
      fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher> request);

  void Propose(fuchsia::modular::Proposal proposal) override;
  void Remove(std::string proposal_id) override;

  void ProposeNavigation(
      fuchsia::modular::NavigationAction navigation) override;

  const std::string component_url() { return component_url_; }

 private:
  class BindingSet
      : public ::modular::BindingSet<fuchsia::modular::ProposalPublisher> {
   public:
    BindingSet(ProposalPublisherImpl* impl);
    ~BindingSet() override;

   protected:
    void OnConnectionError(
        fidl::Binding<fuchsia::modular::ProposalPublisher>* binding) override;

   private:
    ProposalPublisherImpl* const impl_;
  };

  bool ShouldEraseSelf() const;
  void EraseSelf();

  SuggestionEngineImpl* const engine_;
  const std::string component_url_;
  BindingSet bindings_;

  fxl::WeakPtrFactory<ProposalPublisherImpl> weak_ptr_factory_;
};

}  // namespace modular

#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_PROPOSAL_PUBLISHER_IMPL_H_
