Commands/Package/Eigenverft.Manifested.Package.Cmd.GetPackageAssignmentPlan.ps1

<#
    Public read-only package assignment/materialization preview.
#>


function Write-PackageAssignmentPlanView {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [psobject]$Plan
    )

    Write-Host ("Package assignment plan: {0} | mode={1} | offline={2} | nodes={3}" -f $Plan.Status, $Plan.Mode, $Plan.Offline, @($Plan.Nodes).Count)
    if (@($Plan.Roots).Count -gt 0) {
        $rootText = @($Plan.Roots | Select-Object DefinitionId, Version, PlannedAction, Status | Format-Table -AutoSize | Out-String).TrimEnd()
        Write-Host $rootText
    }
    if (@($Plan.Blockers).Count -gt 0) {
        Write-Host 'Blockers:'
        $blockerText = @($Plan.Blockers | Select-Object Code, DefinitionId, ArtifactFileId, Message | Format-Table -Wrap -AutoSize | Out-String).TrimEnd()
        Write-Host $blockerText
    }
    if (@($Plan.Warnings).Count -gt 0) {
        Write-Host 'Warnings:'
        $warningText = @($Plan.Warnings | Select-Object Code, DefinitionId, Message | Format-Table -Wrap -AutoSize | Out-String).TrimEnd()
        Write-Host $warningText
    }
    Write-Host ("Next: {0}" -f $Plan.NextCommand)
}

function Get-PackageAssignmentPlan {
    <#
    .SYNOPSIS
        Previews package assignment or depot materialization without changing machine state.
 
    .DESCRIPTION
        Uses the same definition, trust, dependency, release, path, acquisition, discovery,
        ownership, and readiness rules as Invoke-Package. It performs no downloads and does
        not write trust, endpoint, depot, staging, inventory, history, PATH, or installation data.
 
    .PARAMETER VerifyDepotContent
        Hashes and verifies present depot files during an online preview. Offline previews
        always verify present depot content.
 
    .PARAMETER Raw
        Suppresses the compact console view. The returned structured plan is unchanged.
    #>

    [CmdletBinding()]
    param(
        [AllowNull()]
        [string]$PublisherId = $null,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string[]]$DefinitionId,

        [AllowNull()]
        [string]$PackageVersion = $null,

        [switch]$Offline,

        [switch]$MaterializeOnly,

        [switch]$VerifyDepotContent,

        [switch]$Raw
    )

    $packageVersionOverrideSpecified = $PSBoundParameters.ContainsKey('PackageVersion') -and -not [string]::IsNullOrWhiteSpace([string]$PackageVersion)
    $normalizedPackageVersion = if ($packageVersionOverrideSpecified) { ([string]$PackageVersion).Trim() } else { $null }
    $hadMessageSuppression = Test-Path Variable:script:SuppressPackageExecutionMessages
    $priorMessageSuppression = $script:SuppressPackageExecutionMessages
    try {
        $script:SuppressPackageExecutionMessages = $true
        $plan = New-PackageAssignmentPlanCore -PublisherId $PublisherId -DefinitionId $DefinitionId -PackageVersion $normalizedPackageVersion -PackageVersionOverrideSpecified $packageVersionOverrideSpecified -Purpose Inspection -Offline:$Offline -MaterializeOnly:$MaterializeOnly -VerifyDepotContent:$VerifyDepotContent
    }
    finally {
        if ($hadMessageSuppression) {
            $script:SuppressPackageExecutionMessages = $priorMessageSuppression
        }
        else {
            Remove-Variable -Name SuppressPackageExecutionMessages -Scope Script -ErrorAction SilentlyContinue
        }
    }

    if (-not $Raw.IsPresent) {
        Write-PackageAssignmentPlanView -Plan $plan
    }
    return $plan
}