internal/functions/Invoke-EPODeferredGroupPolicies.ps1

#Requires -Version 5.1

function Invoke-EPODeferredGroupPolicies {
    [CmdletBinding(SupportsShouldProcess=$true)]
    param (
        [Parameter(Mandatory = $true)]
        [string]$TenantId,
        [Parameter(Mandatory = $false)]
        [ValidateSet('delta','initial')]
        [string]$Mode = 'delta'
    )

    if (-not $script:EasyPIM_DeferredGroupPolicies -or $script:EasyPIM_DeferredGroupPolicies.Count -eq 0) {
        Write-Verbose "No deferred group policies to process."
        return @{ Attempted = 0; Applied = 0; Failed = 0; Skipped = 0 }
    }

    $attempted = 0; $applied = 0; $failed = 0; $skipped = 0
    foreach ($policyDef in @($script:EasyPIM_DeferredGroupPolicies)) {
        $attempted++
        $target = "Group $($policyDef.GroupId) role $($policyDef.RoleName)"
        if ($PSCmdlet.ShouldProcess($target, "Apply deferred group policy")) {
            try {
                $res = Set-EPOGroupPolicy -PolicyDefinition $policyDef -TenantId $TenantId -Mode $Mode -SkipEligibilityCheck -WhatIf:$WhatIfPreference
                switch ($res.Status) {
                    'Applied' { $applied++ }
                    'Failed' { $failed++ }
                    default { $skipped++ }
                }
            } catch {
                Write-Warning "Deferred group policy apply failed for $($target): $($_.Exception.Message)"
                $failed++
            }
        } else {
            $skipped++
        }
    }

    # Clear after attempt
    $script:EasyPIM_DeferredGroupPolicies = @()

    return @{ Attempted = $attempted; Applied = $applied; Failed = $failed; Skipped = $skipped }
}