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

#ifndef SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_SM_DELEGATE_H_
#define SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_SM_DELEGATE_H_

#include "src/connectivity/bluetooth/core/bt-host/gap/pairing_delegate.h"
#include "src/connectivity/bluetooth/core/bt-host/sm/error.h"
#include "src/connectivity/bluetooth/core/bt-host/sm/types.h"
#include "src/connectivity/bluetooth/core/bt-host/transport/error.h"

namespace bt::sm {

// Delegate interface for pairing and bonding events.
class Delegate {
 public:
  virtual ~Delegate() = default;

  using ConfirmCallback = fit::callback<void(bool confirm)>;
  // Asks higher-level protocols outside bt-host to confirm the pairing request from the device.
  virtual void ConfirmPairing(ConfirmCallback confirm) = 0;

  using DisplayMethod = gap::PairingDelegate::DisplayMethod;
  // Show the user the 6-digit |passkey| that should be compared to the peer's passkey or entered
  // into the peer. |confirm| may be called to accept a comparison or to reject the pairing.
  virtual void DisplayPasskey(uint32_t passkey, DisplayMethod method, ConfirmCallback confirm) = 0;

  // Ask the user to enter a 6-digit passkey or reject pairing. Reports the result by invoking
  // |respond| with |passkey| - a negative value of |passkey| indicates entry failed.
  using PasskeyResponseCallback = fit::callback<void(int64_t passkey)>;
  virtual void RequestPasskey(PasskeyResponseCallback respond) = 0;

  // Called to obtain the local identity information to distribute to the
  // peer. The delegate should return std::nullopt if there is no identity
  // information to share. Otherwise, the delegate should return the IRK and
  // the identity address to distribute.
  virtual std::optional<IdentityInfo> OnIdentityInformationRequest() = 0;

  // Called when an ongoing pairing is completed with the given |status|.
  virtual void OnPairingComplete(Result<> status) = 0;

  // Called when new pairing data has been obtained for this peer.
  virtual void OnNewPairingData(const PairingData& data) = 0;

  // Called when the link layer authentication procedure fails. This likely indicates that
  // the LTK or STK used to encrypt the connection was rejected by the peer device.
  //
  // The underlying link should disconnect after this callback runs.
  virtual void OnAuthenticationFailure(hci::Result<> status) = 0;

  // Called when the security properties of the link change.
  virtual void OnNewSecurityProperties(const SecurityProperties& sec) = 0;
};

}  // namespace bt::sm
#endif  // SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_SM_DELEGATE_H_
