// 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;
};

interface 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);
};
