functions/Set-XdrConfigurationPreviewFeatures.ps1

function Set-XdrConfigurationPreviewFeatures {
    <#
    .SYNOPSIS
        Sets the configuration for Defender XDR Preview features.

    .DESCRIPTION
        Sets the configuration for Defender XDR Preview features.
        This function includes caching support with a 30-minute TTL to reduce API calls.
    
    .PARAMETER EnableXdrAndMdi
        Boolean to enable or disable preview features for Microsoft Defender XDR + Microsoft Defender for Identity.

    .PARAMETER EnableMde
        Boolean to enable or disable preview features for Microsoft Defender for Endpoint.

    .PARAMETER EnableMda
        Boolean to enable or disable preview features for Microsoft Defender for Cloud Apps.

    .PARAMETER Confirm
    Prompts for confirmation before creating each rule.

    .PARAMETER WhatIf
    Shows what would happen if the cmdlet runs. The cmdlet is not run.
    
    .EXAMPLE
        Set-XdrConfigurationPreviewFeatures
        Sets the configuration for Defender XDR Preview features.

    .EXAMPLE
        Set-XdrConfigurationPreviewFeatures -EnableXdrAndMdi $true
        Enables preview features for Microsoft Defender XDR + Microsoft Defender for Identity.

    .EXAMPLE
        Set-XdrConfigurationPreviewFeatures -EnableMde $false
        Disables preview features for Microsoft Defender for Endpoint.

    .EXAMPLE
        Set-XdrConfigurationPreviewFeatures -EnableMda $true
        Enables preview features for Microsoft Defender for Cloud Apps.

    .EXAMPLE
        Set-XdrConfigurationPreviewFeatures -EnableXdrAndMdi $true -WhatIf
        Shows what would happen if preview features were enabled for XDR and MDI.

    .OUTPUTS
        System.Collections.Specialized.OrderedDictionary
        Returns the API response.
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '')]
    [CmdletBinding(SupportsShouldProcess)]
    [OutputType([System.Collections.Specialized.OrderedDictionary])]
    param (
        [Parameter()]
        [bool]$EnableXdrAndMdi,

        [Parameter()]
        [bool]$EnableMde,

        [Parameter()]
        [bool]$EnableMda
    )

    begin {
        Update-XdrConnectionSettings
    }

    process {
        # Enable or disable preview features for XDR and MDI (if not null)
        if ($PSBoundParameters.ContainsKey('EnableXdrAndMdi')) {
            $target = "Microsoft Defender XDR + Microsoft Defender for Identity"
            $action = if ($EnableXdrAndMdi) { "Enable" } else { "Disable" }
            if ($PSCmdlet.ShouldProcess($target, "$action preview features")) {
                try {
                    Write-Verbose "Setting preview features for $target"
                    $XdrAndMdiBody = @{ "IsOptIn" = $EnableXdrAndMdi } | ConvertTo-Json
                    $null = Invoke-RestMethod -Uri "https://security.microsoft.com/apiproxy/mtp/settings/SavePreviewExperienceSetting?context=MtpContext" -Method POST -Body $XdrAndMdiBody -ContentType "application/json" -WebSession $script:session -Headers $script:headers
                } catch {
                    Write-Error "Failed to update preview features for ${target}: $_"
                }
            }
        }

        # Enable or disable preview features for MDE (if not null)
        if ($PSBoundParameters.ContainsKey('EnableMde')) {
            $target = "Microsoft Defender for Endpoint"
            $action = if ($EnableMde) { "Enable" } else { "Disable" }
            if ($PSCmdlet.ShouldProcess($target, "$action preview features")) {
                try {
                    Write-Verbose "Setting preview features for $target"
                    $MdeBody = @{ "IsOptIn" = $EnableMde } | ConvertTo-Json
                    $null = Invoke-RestMethod -Uri "https://security.microsoft.com/apiproxy/mtp/settings/SavePreviewExperienceSetting?context=MdatpContext" -Method POST -Body $MdeBody -ContentType "application/json" -WebSession $script:session -Headers $script:headers
                } catch {
                    Write-Error "Failed to update preview features for ${target}: $_"
                }
            }
        }
    
        # Enable or disable preview features for MDA (if not null)
        if ($PSBoundParameters.ContainsKey('EnableMda')) {
            $target = "Microsoft Defender for Cloud Apps"
            $action = if ($EnableMda) { "Enable" } else { "Disable" }
            if ($PSCmdlet.ShouldProcess($target, "$action preview features")) {
                try {
                    Write-Verbose "Setting preview features for $target"
                    $MdaBody = @{ "previewFeaturesEnabled" = $EnableMda } | ConvertTo-Json
                    $null = Invoke-RestMethod -Uri "https://security.microsoft.com/apiproxy/mcas/cas/api/v1/preview_features/update/" -Method POST -Body $MdaBody -ContentType "application/json" -WebSession $script:session -Headers $script:headers
                } catch {
                    Write-Error "Failed to update preview features for ${target}: $_"
                }
            }
        }

        # Clear cache for preview features configuration before re-reading values
        Clear-XdrCache -CacheKey "GetXdrConfigurationPreviewFeatures" -ErrorAction SilentlyContinue
        # Check current values after changes (skip when running with -WhatIf)
        if (-not $WhatIfPreference) {
            $result = Get-XdrConfigurationPreviewFeatures -Force
            return $result
        }
    }

    end {

    }
}