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

use fidl_fuchsia_hardware_power_statecontrol as fpower;

/// Type alias for the reboot reasons defined in fuchsia.hardware.power.statecontrol.RebootReason.
pub type RebootReason = fpower::RebootReason;

/// Represents the available shutdown types of the system. These are intended to mirror the
/// supported shutdown APIs of fuchsia.hardware.power.statecontrol.Admin.
#[derive(Debug, PartialEq, PartialOrd, Copy, Clone)]
pub enum ShutdownRequest {
    PowerOff,
    Reboot(RebootReason),
    RebootBootloader,
    RebootRecovery,
}

/// Converts a ShutdownRequest into a fuchsia.hardare.power.statecontrol.SystemPowerState value.
impl Into<fpower::SystemPowerState> for ShutdownRequest {
    fn into(self) -> fpower::SystemPowerState {
        match self {
            ShutdownRequest::PowerOff => fpower::SystemPowerState::Poweroff,
            ShutdownRequest::Reboot(fpower::RebootReason::OutOfMemory) => {
                fpower::SystemPowerState::RebootKernelInitiated
            }
            ShutdownRequest::Reboot(_) => fpower::SystemPowerState::Reboot,
            ShutdownRequest::RebootBootloader => fpower::SystemPowerState::RebootBootloader,
            ShutdownRequest::RebootRecovery => fpower::SystemPowerState::RebootRecovery,
        }
    }
}
