// Copyright 2020 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 "src/connectivity/bluetooth/core/bt-host/public/pw_bluetooth_sapphire/internal/host/gap/low_energy_connection_request.h"

namespace bt::gap::internal {

LowEnergyConnectionRequest::LowEnergyConnectionRequest(
    PeerId peer_id,
    ConnectionResultCallback first_callback,
    LowEnergyConnectionOptions connection_options,
    Peer::InitializingConnectionToken peer_conn_token)
    : peer_id_(peer_id, MakeToStringInspectConvertFunction()),
      callbacks_(/*convert=*/[](const auto& cbs) { return cbs.size(); }),
      connection_options_(connection_options),
      peer_conn_token_(std::move(peer_conn_token)) {
  callbacks_.Mutable()->push_back(std::move(first_callback));
}

void LowEnergyConnectionRequest::NotifyCallbacks(
    fit::result<HostError, RefFunc> result) {
  peer_conn_token_.reset();

  for (const auto& callback : *callbacks_) {
    if (result.is_error()) {
      callback(fit::error(result.error_value()));
      continue;
    }
    auto conn_ref = result.value()();
    callback(fit::ok(std::move(conn_ref)));
  }
}

void LowEnergyConnectionRequest::AttachInspect(inspect::Node& parent,
                                               std::string name) {
  inspect_node_ = parent.CreateChild(name);
  peer_id_.AttachInspect(inspect_node_, "peer_id");
  callbacks_.AttachInspect(inspect_node_, "callbacks");
}

}  // namespace bt::gap::internal
