// Copyright 2019 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.
library fuchsia.bluetooth.sys;

using fuchsia.bluetooth as bt;

/// Input and Output Capabilities for pairing exchanges.
/// See Volume 3, Part C, Table 5.3 and 5.4
type InputCapability = strict enum {
    NONE = 1;
    CONFIRMATION = 2;
    KEYBOARD = 3;
};

type OutputCapability = strict enum {
    NONE = 1;
    DISPLAY = 2;
};

/// Different types required by the Security Manager for pairing methods.
/// Bluetooth SIG has different requirements for different device capabilities.
type PairingMethod = strict enum {
    /// The user is asked to accept or reject pairing.
    CONSENT = 1;

    /// The user is shown a 6-digit numerical passkey which they must enter on the
    /// peer device.
    PASSKEY_DISPLAY = 2;

    /// The user is shown a 6-digit numerical passkey which will also shown on the
    /// peer device. The user must compare the passkeys and accept the pairing if
    /// the passkeys match.
    PASSKEY_COMPARISON = 3;

    /// The user is asked to enter a 6-digit passkey.
    PASSKEY_ENTRY = 4;
};

type PairingKeypress = strict enum {
    /// The user has entered a single digit.
    DIGIT_ENTERED = 1;

    /// The user has erased a single digit.
    DIGIT_ERASED = 2;

    /// The user has cleared the entire passkey.
    PASSKEY_CLEARED = 3;

    /// The user has finished entering the passkey.
    PASSKEY_ENTERED = 4;
};

protocol PairingDelegate {
    /// Called to initiate a pairing request. The delegate must respond with "true" or "false" to
    /// either accept or reject the pairing request. If the pairing method requires a passkey
    /// this is returned as well.
    ///
    /// Any response from this method will be ignored if the OnPairingComplete
    /// event has already been sent for `peer`.
    ///
    /// The `displayed_passkey` parameter should be displayed to the user if `method` equals
    /// `PairingMethod.PASSKEY_DISPLAY` or `PairingMethod.PASSKEY_COMPARISON`. Otherwise, this parameter
    /// has no meaning and should be ignored.
    ///
    /// The `entered_passkey` parameter only has meaning if `method` equals
    /// `PairingMethod.PASSKEY_ENTRY`. It will be ignored otherwise.
    OnPairingRequest(struct {
        peer Peer;
        method PairingMethod;
        displayed_passkey uint32;
    }) -> (struct {
        accept bool;
        entered_passkey uint32;
    });

    /// Called if the pairing procedure for the device with the given ID is completed.
    /// This can be due to successful completion or an error (e.g. due to cancellation
    /// by the peer, a timeout, or disconnection) which is indicated by `success`.
    OnPairingComplete(struct {
        id bt.PeerId;
        success bool;
    });

    /// Called to notify keypresses from the peer device during pairing using
    /// `PairingMethod.PASSKEY_DISPLAY`.
    ///
    /// This event is used to provide key press events to the delegate for a responsive user
    /// experience as the user types the passkey on the peer device. This event will be called
    /// once for each key-press.
    OnRemoteKeypress(struct {
        id bt.PeerId;
        keypress PairingKeypress;
    });

    /// The delegate can send this event to notify the peer of local keypresses
    /// during pairing using `PairingMethod.PASSKEY_ENTRY`.
    -> OnLocalKeypress(struct {
        id bt.PeerId;
        keypress PairingKeypress;
    });
};
