// 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_CONTEXT_ENGINE_CONTEXT_ENGINE_IMPL_H_
#define PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_ENGINE_IMPL_H_

#include <fuchsia/modular/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>

#include "peridot/bin/context_engine/context_repository.h"
#include "peridot/bin/context_engine/debug.h"

namespace modular {

class EntityResolver;

class ContextReaderImpl;
class ContextWriterImpl;

class ContextEngineImpl : fuchsia::modular::ContextEngine {
 public:
  // Does not take ownership of |entity_resolver|.
  ContextEngineImpl(fuchsia::modular::EntityResolver* entity_resolver);
  ~ContextEngineImpl() override;

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

  fxl::WeakPtr<ContextDebugImpl> debug();

 private:
  // |fuchsia::modular::ContextEngine|
  void GetWriter(
      fuchsia::modular::ComponentScope client_info,
      fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request) override;

  // |fuchsia::modular::ContextEngine|
  void GetReader(
      fuchsia::modular::ComponentScope client_info,
      fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) override;

  // |fuchsia::modular::ContextEngine|
  void GetContextDebug(
      fidl::InterfaceRequest<fuchsia::modular::ContextDebug> request) override;

  fuchsia::modular::EntityResolver* const entity_resolver_;

  ContextRepository repository_;

  fidl::BindingSet<fuchsia::modular::ContextEngine> bindings_;

  std::vector<std::unique_ptr<ContextReaderImpl>> readers_;
  std::vector<std::unique_ptr<ContextWriterImpl>> writers_;

  FXL_DISALLOW_COPY_AND_ASSIGN(ContextEngineImpl);
};

}  // namespace modular

#endif  // PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_ENGINE_IMPL_H_
