// 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.
type HostInfo = table {
    /// Uniquely identifies a host on the current system.
    ///
    /// This field is always present.
    1: id bt.HostId;

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

    /// The identity address - this is always the Public address of the host.
    ///
    /// # Deprecation
    /// The `addresses` field provides more information about the host.
    ///
    /// This field is always present.
    @available(deprecated=11, removed=12, note="Removed in 12, use HostInfo.addresses instead")
    3: address bt.Address;

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

    /// 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: local_name bt.DeviceName;

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

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

    /// The addresses (LE and/or BR/EDR) associated with the host.
    ///
    /// The Public address is always reported first.
    ///
    /// This field is always present.
    @available(added=11)
    8: addresses vector<bt.Address>:MAX;
};

/// Protocol used to observe and manage the Bluetooth controllers on the system.
@discoverable(server="platform")
closed 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.
    strict Watch() -> (struct {
        hosts vector<HostInfo>:MAX;
    });

    /// 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.
    strict SetActive(struct {
        id bt.HostId;
    }) -> () error zx.Status;
};
