DSCResources/MSFT_xPowerPlan/MSFT_xPowerPlan.psm1

Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) `
                               -ChildPath 'CommonResourceHelper.psm1')
$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xPowerPlan'

<#
    .SYNOPSIS
        Returns the current state of the power plan.
 
    .PARAMETER IsSingleInstance
        Specifies the resource is a single instance, the value must be 'Yes'.
 
    .PARAMETER Name
        Specifies the name of the power plan to assign to the node.
 
    .EXAMPLE
        Get-TargetResource -IsSingleInstance 'Yes' -Name 'High performance'
#>

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        # This is best practice when writing a single-instance DSC resource.
        [Parameter(Mandatory = $true)]
        [ValidateSet('Yes')]
        [System.String]
        $IsSingleInstance,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $Name
    )

    $arguments = @{
        Name = 'root\cimv2\power'
        Class = 'Win32_PowerPlan'
        Filter = "ElementName = '$Name'"
    }

    try
    {
        $plan = Get-CimInstance @arguments
    }
    catch
    {
        throw ($script:localizedData.PowerPlanCIMError -f $($arguments.Class) )
    }

    if ($plan)
    {
        if ($plan.IsActive)
        {
            Write-Verbose -Message ($script:localizedData.PowerPlanIsActive -f $Name)
            $activePlanName = $Name
        }
        else
        {
            Write-Verbose -Message ($script:localizedData.PowerPlanIsNotActive -f $Name)
            $activePlanName = $null
        }
    }
    else
    {
        throw ($script:localizedData.PowerPlanNotFound -f $Name)
    }

    return @{
        IsSingleInstance = $IsSingleInstance
        Name = $activePlanName
    }
}

<#
    .SYNOPSIS
        Assign the power plan to the node.
 
    .PARAMETER IsSingleInstance
        Specifies the resource is a single instance, the value must be 'Yes'.
 
    .PARAMETER Name
        Specifies the name of the power plan to assign to the node.
 
    .EXAMPLE
        Set-TargetResource -IsSingleInstance 'Yes' -Name 'High performance'
#>

function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        # This is best practice when writing a single-instance DSC resource.
        [Parameter(Mandatory = $true)]
        [ValidateSet('Yes')]
        [System.String]
        $IsSingleInstance,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $Name
    )

    Write-Verbose -Message ($script:localizedData.PowerPlanIsBeingActivated -f $Name)

    $arguments = @{
        Name = 'root\cimv2\power'
        Class = 'Win32_PowerPlan'
        Filter = "ElementName = '$Name'"
    }

    try
    {
        $plan = Get-CimInstance @arguments
    }
    catch
    {
        throw ($script:localizedData.PowerPlanCIMError -f $($arguments.Class) )
    }

    try
    {
        $plan | Invoke-CimMethod -MethodName Activate
    }
    catch
    {
        throw ($script:localizedData.PowerPlanWasUnableToBeSet -f $Name, $($_.Exception.Message))
    }
}

<#
    .SYNOPSIS
        Tests if the power plan is assigned to the node.
 
    .PARAMETER IsSingleInstance
        Specifies the resource is a single instance, the value must be 'Yes'.
 
    .PARAMETER Name
        Specifies the name of the power plan to assign to the node.
 
    .EXAMPLE
        Test-TargetResource -IsSingleInstance 'Yes' -Name 'High performance'
#>

function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        # This is best practice when writing a single-instance DSC resource.
        [Parameter(Mandatory = $true)]
        [ValidateSet('Yes')]
        [System.String]
        $IsSingleInstance,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $Name
    )

    $returnValue = $false

    Write-Verbose -Message ($script:localizedData.PowerPlanIsBeingValidated -f $Name)

    $getTargetResourceResult = Get-TargetResource -IsSingleInstance $IsSingleInstance -Name $Name
    if ($getTargetResourceResult.Name -eq $Name)
    {
        $returnValue = $true
    }

    return $returnValue
}

Export-ModuleMember -Function *-TargetResource