Private/Resolve-AzureUtilsScope.ps1

function Resolve-AzureUtilsScope {
    <#
        .SYNOPSIS
            Resolves a Resource Graph scope and a subscriptionId -> name lookup.
        .DESCRIPTION
            Given an optional management-group or subscription scope, returns the
            Search-AzGraph scope splat (ManagementGroup / Subscription), a
            subscriptionId -> display-name map for enrichment, and a friendly
            scope label/type for reports. Used by the Find-/Export- cmdlets.
        .OUTPUTS
            PSCustomObject with: Scope (hashtable), NameMap (hashtable),
            Label (string), Type (string), HasSubscriptions (bool)
    #>

    [CmdletBinding()]
    [OutputType([pscustomobject])]
    param(
        [string[]] $SubscriptionId,
        [string[]] $ManagementGroupId
    )

    $scope   = @{}
    $nameMap = @{}

    if ($ManagementGroupId) {
        $scope['ManagementGroup'] = $ManagementGroupId
        foreach ($s in (Resolve-AzureUtilsSubscription)) { $nameMap[$s.Id] = $s.Name }  # best-effort names
        return [pscustomobject]@{
            Scope            = $scope
            NameMap          = $nameMap
            Label            = ($ManagementGroupId -join ', ')
            Type             = 'Management Group'
            HasSubscriptions = $true
        }
    }

    $subs = Resolve-AzureUtilsSubscription -SubscriptionId $SubscriptionId
    foreach ($s in $subs) { $nameMap[$s.Id] = $s.Name }
    if ($subs.Count -gt 0) { $scope['Subscription'] = @($subs.Id) }

    [pscustomobject]@{
        Scope            = $scope
        NameMap          = $nameMap
        Label            = if ($SubscriptionId) { ($subs.Name -join ', ') } else { 'All enabled subscriptions' }
        Type             = 'Subscription'
        HasSubscriptions = ($subs.Count -gt 0)
    }
}