// 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_handle.h"

#include "src/connectivity/bluetooth/core/bt-host/public/pw_bluetooth_sapphire/internal/host/gap/low_energy_connection.h"
#include "src/connectivity/bluetooth/core/bt-host/public/pw_bluetooth_sapphire/internal/host/gap/low_energy_connection_manager.h"

namespace bt::gap {

LowEnergyConnectionHandle::LowEnergyConnectionHandle(
    PeerId peer_id,
    hci_spec::ConnectionHandle handle,
    fit::callback<void(LowEnergyConnectionHandle*)> release_cb,
    fit::function<sm::BondableMode()> bondable_cb,
    fit::function<sm::SecurityProperties()> security_cb,
    fit::function<pw::bluetooth::emboss::ConnectionRole()> role_cb)
    : active_(true),
      peer_id_(peer_id),
      handle_(handle),
      release_cb_(std::move(release_cb)),
      bondable_cb_(std::move(bondable_cb)),
      security_cb_(std::move(security_cb)),
      role_cb_(std::move(role_cb)) {
  BT_ASSERT(peer_id_.IsValid());
}

LowEnergyConnectionHandle::~LowEnergyConnectionHandle() {
  if (active_) {
    Release();
  }
}

void LowEnergyConnectionHandle::Release() {
  BT_ASSERT(active_);
  active_ = false;
  if (release_cb_) {
    release_cb_(this);
  }
}

void LowEnergyConnectionHandle::MarkClosed() {
  active_ = false;
  if (closed_cb_) {
    // Move the callback out of |closed_cb_| to prevent it from deleting itself
    // by deleting |this|.
    auto f = std::move(closed_cb_);
    f();
  }
}

sm::BondableMode LowEnergyConnectionHandle::bondable_mode() const {
  BT_ASSERT(active_);
  return bondable_cb_();
}

sm::SecurityProperties LowEnergyConnectionHandle::security() const {
  BT_ASSERT(active_);
  return security_cb_();
}

pw::bluetooth::emboss::ConnectionRole LowEnergyConnectionHandle::role() const {
  BT_ASSERT(active_);
  return role_cb_();
}

}  // namespace bt::gap
