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

#include "fuchsia/base/agent_manager.h"

#include <utility>

#include "base/fuchsia/fuchsia_logging.h"
#include "base/logging.h"

namespace cr_fuchsia {

AgentManager::AgentManager(
    const base::fuchsia::ServiceDirectoryClient* incoming)
    : component_context_(
          incoming->ConnectToService<fuchsia::modular::ComponentContext>()) {}

AgentManager::~AgentManager() = default;

void AgentManager::ConnectToAgentServiceUnsafe(base::StringPiece agent,
                                               base::StringPiece interface,
                                               zx::channel request) {
  auto it = agents_.find(agent);
  if (it == agents_.end()) {
    it = agents_.emplace(agent.as_string(), AgentConnection()).first;
    component_context_->ConnectToAgent(agent.as_string(),
                                       it->second.services.NewRequest(),
                                       it->second.controller.NewRequest());
    it->second.services.set_error_handler(
        [agent = agent.as_string()](zx_status_t status) {
          ZX_LOG(FATAL, status) << "Agent disconnected: " << agent;
        });
  }
  it->second.services->ConnectToService(interface.as_string(),
                                        std::move(request));
}

AgentManager::AgentConnection::AgentConnection() = default;

AgentManager::AgentConnection::AgentConnection(AgentConnection&& other) =
    default;

AgentManager::AgentConnection& AgentManager::AgentConnection::operator=(
    AgentConnection&& other) = default;

AgentManager::AgentConnection::~AgentConnection() = default;

}  // namespace cr_fuchsia
