// 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.

library fuchsia.bluetooth.power;

using fuchsia.bluetooth;
using fuchsia.power.battery;
using zx;

/// An identifier of a peripheral that is assigned by the system.
type Identifier = flexible union {
    // Identifier reserved for the local device.
    1: local_device struct {};

    // Unique identifier for peripherals connected via Bluetooth - assigned by the Bluetooth stack.
    2: peer_id fuchsia.bluetooth.PeerId;
};

/// Information about a peripheral.
type Information = table {
    /// Mandatory - unique identifier assigned by the system for the peripheral.
    1: identifier Identifier;

    /// Mandatory - Describes the current battery information of the peripheral.
    ///
    /// `level_percent` will always be present.
    /// `level_status` is optional.
    ///
    /// The remaining fields in `BatteryInfo` are ignored.
    2: battery_info fuchsia.power.battery.BatteryInfo;
};

/// Protocol used to observe peripherals owned & discovered by the system.
@discoverable
protocol Watcher {
    /// A hanging get to obtain a list of discovered peripherals and their information.
    ///
    /// A response is sent only if this list has changed since the last time the client has sent
    /// this message. The first call to `Watch` will resolve immediately with the initial set of
    /// peripheral information.
    ///
    ///
    /// + request `ids` is a list of identifiers to filter the peripheral information on. Use an
    ///          empty list to receive updates about all peripherals.
    /// - response `peripherals` is a list of information about the requested peripherals.
    Watch(struct {
        ids vector<Identifier>:MAX;
    }) -> (struct {
        peripherals vector<Information>:MAX;
    });
};


/// A protocol used to report information about a peripheral to the system.
@discoverable
protocol Reporter {
    /// Report information about a connected peripheral.
    ///
    /// Each `Report` request will be acknowledged. The client shall wait for the acknowledgement
    /// before sending a subsequent request.
    ///
    /// + request `info` is the current information associated with the peripheral.
    /// - response An empty response will be sent when the server has processed the request.
    /// * error Returns `ZX_ERR_INVALID_ARGS` if the provided `info` is invalidly formatted.
    Report(resource struct {
        info Information;
    }) -> (struct {}) error zx.status;
};
