// 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;
using zx;

/// Information about a Bluetooth controller and its associated host-subsystem state.
table HostInfo {
    /// Uniquely identifies a host on the current system.
    ///
    /// This field is always present.
    1: bt.HostId id;

    /// The Bluetooth technologies that are supported by this adapter.
    ///
    /// This field is always present.
    2: TechnologyType technology;

    /// The identity address.
    ///
    /// This field is always present.
    3: bt.Address address;

    /// Indicates whether or not this is the active host. The system has one active host which
    /// handles all Bluetooth procedures.
    4: bool active;

    /// The local name of this host. This is the name that is visible to other devices when this
    /// host is in the discoverable mode.
    5: bt.DeviceName local_name;

    /// Whether or not the local adapter is currently discoverable over BR/EDR and
    /// LE physical channels.
    6: bool discoverable;

    /// Whether or not device discovery is currently being performed.
    7: bool discovering;
};

/// Protocol used to observe and manage the Bluetooth controllers on the system.
[Discoverable]
protocol HostWatcher {
    /// Obtain a list of all available Bluetooth controllers and their state. A response is sent
    /// only if this list has changed since the last time the client has sent this message.
    Watch() -> (vector<HostInfo>:MAX hosts);

    /// Designates the host with the given `id` as active. All Bluetooth procedures will be routed
    /// over this host. Any previously assigned active host will be disabled and all of its pending
    /// procedures will be terminated.
    ///
    /// * error This can fail if a host with `id` was not found.
    SetActive(bt.HostId id) -> () error zx.status;
};
