// Copyright 2022 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.
@available(added=10)
library fuchsia.bluetooth.fastpair;

using fuchsia.bluetooth;
using zx;

/// Represents an active Fast Pair Provider service. The lifetime of the service is tied to this
/// protocol.
///
/// Closing the protocol disables the service.
///
/// The system may close the protocol to communicate that the service was terminated
/// for internal reasons.
closed protocol ProviderWatcher {
    /// Called if the Fast Pair pairing procedure for a peer is successfully complete.
    ///
    /// + request `id` The unique ID associated with the connected Fast Pair Seeker peer.
    /// - response Each `OnPairingComplete` request should be acknowledged.
    strict OnPairingComplete(struct {
        id fuchsia.bluetooth.PeerId;
    }) -> ();
};

/// Protocol to enable the Bluetooth Fast Pair Provider service on the system.
@discoverable
closed protocol Provider {
    /// Request to enable the Fast Pair Provider service.
    ///
    /// Only one client can register to enable the Fast Pair service. An Error will be returned
    /// for subsequent requests.
    ///
    /// The lifetime of the service is tied to the provided `watcher`. To disable Fast Pair
    /// functionality, close the `watcher`.
    ///
    /// + request `watcher` The client end of the ProviderWatcher which determines the lifetime of
    ///   the Fast Pair service.
    /// - response An empty response will be sent when the server has processed the
    ///   request.
    /// * error Returns `ALREADY_BOUND` if a subsequent request is made to enable
    ///   the service.
    strict Enable(resource struct {
        watcher client_end:ProviderWatcher;
    }) -> () error zx.Status;
};
