modules/Azure/Discovery/Private/ResolveCIEMScopeLabel.ps1

function ResolveCIEMScopeLabel {
    <#
    .SYNOPSIS
        Converts an Azure ARM scope string to a friendly display label.
    .PARAMETER Scope
        The ARM scope string (e.g., /subscriptions/{id}/resourceGroups/{name}).
    .PARAMETER SubscriptionNameLookup
        Hashtable of subscription ID to friendly name.
    #>

    param(
        [Parameter(Mandatory)]
        [string]$Scope,

        [Parameter()]
        [hashtable]$SubscriptionNameLookup = @{}
    )

    $ErrorActionPreference = 'Stop'

    # Root scope
    if ($Scope -eq '/') {
        return 'Root Scope'
    }

    # Parse the scope into segments
    $segments = $Scope.Trim('/') -split '/'

    # /subscriptions/{id}
    if ($segments.Count -eq 2 -and $segments[0] -eq 'subscriptions') {
        $subId = $segments[1]
        $subName = $SubscriptionNameLookup[$subId]
        if ($subName) {
            return "$subName (subscription)"
        }
        return "$subId (subscription)"
    }

    # /subscriptions/{id}/resourceGroups/{name}
    if ($segments.Count -eq 4 -and $segments[0] -eq 'subscriptions' -and $segments[2] -eq 'resourceGroups') {
        return "$($segments[3]) (resource group)"
    }

    # /subscriptions/{id}/resourceGroups/{rg}/providers/{type}/{name}[/subtype/subname...]
    if ($segments.Count -ge 6 -and $segments[0] -eq 'subscriptions' -and $segments[2] -eq 'resourceGroups' -and $segments[4] -eq 'providers') {
        # Return the last segment (resource name)
        return $segments[-1]
    }

    # Fallback: return the last path segment
    return $segments[-1]
}