// 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=7)
library fuchsia.power.clientlevel;

/// A value that represents the type of client using the protocol.
///
/// `ClientType` is used as a parameter for:
///   1) [`Connector.Connect`] to connect a [`Watcher`] to the power level of
///   the specified client type
///   2) [`fuchsia.power.systemmode/ClientConfigurator.Get`] and
///   [`fuchsia.power.systemmode/ClientConfigurator.Set`] to update the power
///   configuration of the specified client type
type ClientType = flexible enum {
    WLAN = 1;
};

/// Allows a client to connect a [`Watcher`] to the power level of a given
/// [`ClientType`].
@discoverable
closed protocol Connector {
    /// Connects a [`Watcher`] to the power level of the specified
    /// [`ClientType`].
    ///
    /// A client may call this method and begin using the [`Watcher`] client
    /// endpoint immediately.
    ///
    /// If a power configuration does not exist for the provided `client_type`,
    /// then the request will fail. On failure, both the `watcher` server
    /// endpoint as well as the current `Connector` connection will be
    /// terminated.
    ///
    /// + `client_type` specifies to which [`ClientType`] power level that
    /// `watcher` should be connected. The value is valid iff a power
    /// configuration exists for the provided `client_type`.
    ///
    /// + `watcher` is the server endpoint of a [`Watcher`] channel that will be
    /// connected to the [`ClientType`] power level.
    strict Connect(resource struct {
        client_type ClientType;
        watcher server_end:Watcher;
    });
};

/// Allows a client to watch for changes to the power level of a given
/// [`ClientType`].
///
/// This protocol cannot be connected to the service directly. Instead, the
/// server endpoint of a `Watcher` channel must first be connected to the power
/// level of the desired [`ClientType`] using the [`Connector.Connect`] method.
/// The client endpoint of a `Watcher` channel is only useful after it has been
/// connected in this way.
closed protocol Watcher {
    /// Watches for changes to the power level of the connected [`ClientType`].
    ///
    /// The power level for a given [`ClientType`] is determined according to
    /// the power configuration for that [`ClientType`]. See the
    /// [README.md](/src/power/power-manager/system_power_mode_config/README.md)
    /// for more details.
    ///
    /// On a given connection, the first call will return immediately with the
    /// current power level for the connected [`ClientType`]. Subsequent `Watch`
    /// requests will only return a new `level` if the power level of the
    /// connected [`ClientType`] has changed. This follows the [hanging
    /// get](https://fuchsia.dev/fuchsia-src/concepts/api/fidl#hanging-get)
    /// pattern.
    ///
    /// - `level` is an unsigned integer representing the power level of the
    /// connected [`ClientType`].
    strict Watch() -> (struct {
        level uint64;
    });
};
