// Copyright 2017 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_ACQUIRERS_STORY_INFO_LINK_WATCHER_IMPL_H_
#define PERIDOT_BIN_ACQUIRERS_STORY_INFO_LINK_WATCHER_IMPL_H_

#include <map>
#include <memory>
#include <string>

#include <fuchsia/modular/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fxl/macros.h>

namespace maxwell {

class StoryWatcherImpl;

class LinkWatcherImpl : fuchsia::modular::LinkWatcher {
 public:
  LinkWatcherImpl(StoryWatcherImpl* const owner,
                  fuchsia::modular::StoryController* const story_controller,
                  const std::string& story_id,
                  fuchsia::modular::ContextValueWriter* story_value,
                  fuchsia::modular::LinkPath link_path);

  ~LinkWatcherImpl() override;

 private:
  // |LinkWatcher|
  void Notify(fuchsia::mem::Buffer json) override;

  void ProcessNewValue(const fidl::StringPtr& value);
  void MaybeProcessContextLink(const fidl::StringPtr& value);

  StoryWatcherImpl* const owner_;
  fuchsia::modular::StoryController* const story_controller_;

  const std::string story_id_;
  const fuchsia::modular::LinkPath link_path_;

  // Allows us to write the initial fuchsia::modular::Link node in the Context
  // engine, and then create child nodes for each fuchsia::modular::Entity we
  // see in the fuchsia::modular::Link.
  fuchsia::modular::ContextValueWriterPtr link_node_writer_;

  // When applicable: Per top-level JSON member key in the
  // fuchsia::modular::Link value, a value writer that allows us to store the
  // contained fuchsia::modular::Entity.
  //
  // See the documentation in ProcessNewValue() for more details.
  std::map<std::string, fuchsia::modular::ContextValueWriterPtr>
      entity_node_writers_;
  // TODO(thatguy): When Bundles come online, remove |entity_values_| in favor
  // of this. Rename to |entity_value_|.
  fuchsia::modular::ContextValueWriterPtr single_entity_node_writer_;

  // Per context link topic, the context value.
  // TODO(thatguy): Deprecate this usage in favor of Links.
  std::map<fidl::StringPtr, fuchsia::modular::ContextValueWriterPtr>
      topic_node_writers_;

  fuchsia::modular::LinkPtr link_ptr_;
  fidl::Binding<fuchsia::modular::LinkWatcher> link_watcher_binding_;

  FXL_DISALLOW_COPY_AND_ASSIGN(LinkWatcherImpl);
};

}  // namespace maxwell

#endif  // PERIDOT_BIN_ACQUIRERS_STORY_INFO_LINK_WATCHER_IMPL_H_
