DSCResources/DSC_CMClientSettingsCloudService/DSC_CMClientSettingsCloudService.psm1

$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common'
$script:configMgrResourcehelper = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\ConfigMgrCBDsc.ResourceHelper'

Import-Module -Name $script:dscResourceCommonPath
Import-Module -Name $script:configMgrResourcehelper

$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US'

<#
    .SYNOPSIS
        This will return a hashtable of results.
 
    .PARAMETER SiteCode
        Specifies the site code for Configuration Manager site.
 
    .Parameter ClientSettingName
        Specifies which client settings policy to modify.
#>

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [Parameter(Mandatory = $true)]
        [String]
        $SiteCode,

        [Parameter(Mandatory = $true)]
        [String]
        $ClientSettingName
    )

    Write-Verbose -Message $script:localizedData.RetrieveSettingValue
    Import-ConfigMgrPowerShellModule -SiteCode $SiteCode
    Set-Location -Path "$($SiteCode):\"

    $clientSetting = Get-CMClientSetting -Name $ClientSettingName

    if ($clientSetting)
    {
        $type = @('Default','Device','User')[$clientSetting.Type]
        $settings = Get-CMClientSetting -Name $ClientSettingName -Setting Cloud

        if ($settings)
        {
            $cdp = [System.Convert]::ToBoolean($settings.AllowCloudDP)
            $autoAZJoin = [System.Convert]::ToBoolean($settings.AutoAADJoin)
            $cmg = [System.Convert]::ToBoolean($settings.AllowCMG)
        }

        $status = 'Present'
    }
    else
    {
        $status = 'Absent'
    }

    return @{
        SiteCode                    = $SiteCode
        ClientSettingName           = $ClientSettingName
        AllowCloudDistributionPoint = $cdp
        AutoAzureADJoin             = $autoAZJoin
        AllowCloudManagementGateway = $cmg
        ClientSettingStatus         = $status
        ClientType                  = $type
    }
}

<#
    .SYNOPSIS
        This will set the desired state.
 
    .PARAMETER SiteCode
        Specifies a site code for the Configuration Manager site.
 
    .Parameter ClientSettingName
        Specifies which client settings policy to modify.
 
    .PARAMETER AllowCloudDistributionPoint
        Specifies if allow access to cloud distribution point is enabled or disabled.
 
    .PARAMETER AutoAzureADJoin
        Specifies whether to automatically register new Windows 10 domain joined devices with
        Azure Active Directory.
 
    .PARAMETER AllowCloudManagementGateway
        Specifies if allow access to cloud management gateway is enabled or disabled.
#>

function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        [String]
        $SiteCode,

        [Parameter(Mandatory = $true)]
        [String]
        $ClientSettingName,

        [Parameter()]
        [Boolean]
        $AllowCloudDistributionPoint,

        [Parameter()]
        [Boolean]
        $AutoAzureADJoin,

        [Parameter()]
        [Boolean]
        $AllowCloudManagementGateway
    )

    Import-ConfigMgrPowerShellModule -SiteCode $SiteCode
    Set-Location -Path "$($SiteCode):\"
    $state = Get-TargetResource -SiteCode $SiteCode -ClientSettingName $ClientSettingName

    try
    {
        if ($state.ClientSettingStatus -eq 'Absent')
        {
            throw ($script:localizedData.ClientPolicySetting -f $ClientSettingName)
        }

        if ($state.ClientType -eq 'User')
        {
            $defaultValues = @('AllowCloudDistributionPoint')
            if ($PSBoundParameters.ContainsKey('AutoAzureADJoin') -or
                $PSBoundParameters.ContainsKey('AllowCloudManagementGateway'))
            {
                Write-Warning -Message $script:localizedData.DeviceSettings
            }
        }
        else
        {
            $defaultValues = @('AllowCloudDistributionPoint','AutoAzureADJoin','AllowCloudManagementGateway')
        }

        foreach ($param in $PSBoundParameters.GetEnumerator())
        {
            if ($defaultValues -contains $param.Key)
            {
                if ($param.Value -ne $state[$param.Key])
                {
                    Write-Verbose -Message ($script:localizedData.SettingValue -f $param.Key, $param.Value)
                    $buildingParams += @{
                        $param.Key = $param.Value
                    }
                }
            }
        }

        if ($buildingParams)
        {
            if ($state.ClientType -eq 'Default')
            {
                Set-CMClientSettingCloudService -DefaultSetting @buildingParams
            }
            else
            {
                Set-CMClientSettingCloudService -Name $ClientSettingName @buildingParams
            }
        }
    }
    catch
    {
        throw $_
    }
    finally
    {
        Set-Location -Path "$env:temp"
    }
}

<#
    .SYNOPSIS
        This will test the desired state.
 
    .PARAMETER SiteCode
        Specifies a site code for the Configuration Manager site.
 
    .Parameter ClientSettingName
        Specifies which client settings policy to modify.
 
    .PARAMETER AllowCloudDistributionPoint
        Specifies if allow access to cloud distribution point is enabled or disabled.
 
    .PARAMETER AutoAzureADJoin
        Specifies whether to automatically register new Windows 10 domain joined devices with
        Azure Active Directory.
 
    .PARAMETER AllowCloudManagementGateway
        Specifies if allow access to cloud management gateway is enabled or disabled.
#>

function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [Parameter(Mandatory = $true)]
        [String]
        $SiteCode,

        [Parameter(Mandatory = $true)]
        [String]
        $ClientSettingName,

        [Parameter()]
        [Boolean]
        $AllowCloudDistributionPoint,

        [Parameter()]
        [Boolean]
        $AutoAzureADJoin,

        [Parameter()]
        [Boolean]
        $AllowCloudManagementGateway
    )

    Import-ConfigMgrPowerShellModule -SiteCode $SiteCode
    Set-Location -Path "$($SiteCode):\"
    $state = Get-TargetResource -SiteCode $SiteCode -ClientSettingName $ClientSettingName
    $result = $true

    if ($state.ClientSettingStatus -eq 'Absent')
    {
        Write-Warning -Message ($script:localizedData.ClientPolicySetting -f $ClientSettingName)
        $result = $false
    }
    else
    {
        if ($state.ClientType -eq 'User')
        {
            $defaultValues = @('AllowCloudDistributionPoint')
            if ($PSBoundParameters.ContainsKey('AutoAzureADJoin') -or
                $PSBoundParameters.ContainsKey('AllowCloudManagementGateway'))
            {
                Write-Warning -Message $script:localizedData.DeviceSettings
            }
        }
        else
        {
            $defaultValues = @('AllowCloudDistributionPoint','AutoAzureADJoin','AllowCloudManagementGateway')
        }

        $testParams = @{
            CurrentValues = $state
            DesiredValues = $PSBoundParameters
            ValuesToCheck = $defaultValues
        }

        $result = Test-DscParameterState @testParams -TurnOffTypeChecking -Verbose
    }

    Write-Verbose -Message ($script:localizedData.TestState -f $result)
    Set-Location -Path "$env:temp"
    return $result
}

Export-ModuleMember -Function *-TargetResource