// Copyright 2018 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.control;

using fuchsia.bluetooth;

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

enum OutputCapabilityType {
    NONE = 0;
    DISPLAY = 1;
};

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

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

    // 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 = 2;

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

enum PairingKeypressType {
    // The user has entered a single digit.
    DIGIT_ENTERED = 0;

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

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

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

protocol PairingDelegate {
    // Called for most pairing requests. 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 |device|.
    OnPairingRequest(RemoteDevice device, PairingMethod method, string? displayed_passkey)
        -> (bool accept, string? entered_passkey);

    // 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 |status|.
    OnPairingComplete(string device_id, fuchsia.bluetooth.Status status);

    // 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(string device_id, PairingKeypressType keypress);

    // The delegate can send this event to notify the peer of local keypresses
    // during pairing using PairingMethod.PASSKEY_ENTRY.
    -> OnLocalKeypress(string device_id, PairingKeypressType keypress);
};
