functions/azure/Wait-BcAdminAzOperation.ps1

function Wait-BcAdminAzOperation {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$OperationUri,
        [string]$SuccessStatusDescription = 'Created',
        [int]$TimeoutSeconds = 3600,
        [int]$PollIntervalSeconds = 20
    )

    if (-not (Connect-ToAzure)) {
        Write-Warning "Not connected to Microsoft Azure! Plase run Connect-ToAzure first!"
        return $false
    }

    $startTime = Get-Date
    $headers = @{
        Authorization = $BcAdminSession.AzureRequestHeaderAuthorization
    }

    while ($true) {
        try {
            $response = Invoke-WebRequest -Uri $OperationUri -Headers $headers -Method Get
            $StatusCode = $response.StatusCode
            $StatusDescription = $response.StatusDescription
            Write-Verbose "Waiting. StatusCode: $StatusCode - StatusDescription: $StatusDescription"
            # $statusCode = $response.StatusCode

            if ($StatusDescription -eq $SuccessStatusDescription) {
                Write-Verbose "Operation succeeded."
                return $true
            } elseif ($StatusDescription -eq 'OK') {
                Write-Warning "Operation did not start or failed!"
                return $false
            }

            try {
                $retryAfter = $response.Headers.'Retry-After'[0]
                if ($retryAfter) {
                    if ($retryAfter -ne $PollIntervalSeconds) {
                        Write-Verbose "New value for Retry-After: $retryAfter. Updating PollIntervalSeconds."
                        $PollIntervalSeconds = [int]$retryAfter
                    }
                }
            }
            catch {
                Write-Warning "Failed to read Retry-After from header!"
            }

            Write-Information "Status: $StatusCode $StatusDescription – warte $PollIntervalSeconds Sekunden..."
        }
        catch {
            Write-Warning "Fehler beim Abfragen des Status: $($_.Exception.Message)"
            return $false
        }

        if ((Get-Date) -gt $startTime.AddSeconds($TimeoutSeconds)) {
            Write-Warning "Wait timeout $TimeoutSeconds seconds!"
            return $false
        }

        Start-Sleep -Seconds $PollIntervalSeconds
    }
}