// 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.

#include "peridot/bin/context_engine/context_engine_impl.h"

#include <lib/component/cpp/startup_context.h>

#include "peridot/bin/context_engine/context_reader_impl.h"
#include "peridot/bin/context_engine/context_repository.h"
#include "peridot/bin/context_engine/context_writer_impl.h"

namespace modular {

ContextEngineImpl::ContextEngineImpl(
    fuchsia::modular::EntityResolver* const entity_resolver)
    : entity_resolver_(entity_resolver) {}
ContextEngineImpl::~ContextEngineImpl() = default;

fxl::WeakPtr<ContextDebugImpl> ContextEngineImpl::debug() {
  return repository_.debug()->GetWeakPtr();
}

void ContextEngineImpl::AddBinding(
    fidl::InterfaceRequest<fuchsia::modular::ContextEngine> request) {
  bindings_.AddBinding(this, std::move(request));
}

void ContextEngineImpl::GetWriter(
    fuchsia::modular::ComponentScope client_info,
    fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request) {
  writers_.emplace_back(std::make_unique<ContextWriterImpl>(
      std::move(client_info), &repository_, entity_resolver_,
      std::move(request)));
}

void ContextEngineImpl::GetReader(
    fuchsia::modular::ComponentScope client_info,
    fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) {
  readers_.emplace_back(std::make_unique<ContextReaderImpl>(
      std::move(client_info), &repository_, std::move(request)));
}

void ContextEngineImpl::GetContextDebug(
    fidl::InterfaceRequest<fuchsia::modular::ContextDebug> request) {
  repository_.AddDebugBinding(std::move(request));
}

}  // namespace modular
