// Copyright 2025 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=HEAD)
library fuchsia.power.internal;

using zx;

/// A scheduler of collaborative device reboots.
///
/// Collaborative reboot is a mechanism that allows multiple actors to work
/// together to schedule a device reboot at a time that avoids user disruption.
/// Actors fulfill one of two roles: Scheduler or Initiator. The scheduler
/// registers the desire to reboot the device at a later point in time, while
/// the initiator identifies appropriate times to perform a reboot and actuates
/// any scheduled requests. This protocol fulfills the scheduler role. For the
/// initiator role's protocol, see
/// [`fuchsia.power/CollaborativeRebootInitiator`].
///
/// Collaborative reboot can be used when the platform is configured to let the
/// product drive reboot scheduling.
///
/// As a concrete example, this mechanism can be used to drive software updates.
/// When the platform identifies that there is an outstanding software update to
/// apply, it can download the update, and schedule a collaborative reboot.
/// Later, when the product identifies that it is an appropriate time for the
/// device to reboot (say, after it's observed a sufficient period of user
/// inactivity), it can initate the collaborative reboot.
@discoverable
@available(added=HEAD)
closed protocol CollaborativeRebootScheduler {
    /// Schedules a collaborative reboot.
    ///
    /// Notifies the server of a new reason to perform collaborative reboot.
    /// This method may be called multiple times, by multiple actors for a
    /// single collaborative reboot.
    ///
    /// The server will not respond to the method until the request has been
    /// scheduled.
    ///
    /// Arguments:
    ///  - reason: The reason for requesting the collaborative reboot.
    ///  - cancel: An optional Zircon Eventpair. If provided, the caller may
    ///            cancel their request by signaling the event's peer. A
    ///            canceled request will not cause a future call to
    ///            [`CollaborativeRebootInitiator.PerformPendingReboot`]
    ///            to initiate a reboot.
    ///            Any `ZX_USER_SIGNAL_*` can be used to cancel the request.
    ///            If the server observes `ZX_OBJECT_PEER_CLOSED` (i.e. because
    ///            the client dropped the event pair), it will be interpretted
    ///            as a cancellation.
    strict ScheduleReboot(resource struct {
        reason CollaborativeRebootReason;
        cancel zx.Handle:<EVENTPAIR, zx.Rights.WAIT, optional>;
    }) -> ();
};

/// The reason why a collaborative reboot was scheduled.
// Note: This enum is strict while it is internal-only. If it's ever stabilized,
// convert it to a flexible enum.
@available(added=HEAD)
type CollaborativeRebootReason = strict enum {
    /// A new system update has been downloaded. A reboot is required to apply
    /// the update.
    SYSTEM_UPDATE = 1;
    /// The configured netstack version on the system has changed. A reboot is
    /// required to start the new Netstack.
    // TODO(https://fxbug.dev/42081574): Remove this reason once Netstack2 is
    // fully migrated to Netstack3.
    NETSTACK_MIGRATION = 2;
};
