Private/Resolve-InforcerTenantId.ps1

function Resolve-InforcerTenantId {
    <#
    .SYNOPSIS
        Resolves a tenant ID (GUID or numeric) to client tenant ID (integer).
    .DESCRIPTION
        If the value is a numeric string or integer, returns it as int.
        If it is a GUID (Microsoft Tenant ID), resolves to client tenant ID using -TenantData when provided,
        otherwise calls the API to fetch tenants.
    .PARAMETER TenantId
        Client Tenant ID (integer) or Microsoft Tenant ID (GUID string).
    .PARAMETER TenantData
        Optional. Pre-fetched array of tenant objects (e.g. from GET /beta/tenants). When provided and TenantId is a GUID,
        resolution is done from this data instead of calling the API.
    .OUTPUTS
        System.Int32 - The resolved client tenant ID.
    #>

    [CmdletBinding()]
    [OutputType([int])]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [object]$TenantId,

        [Parameter(Mandatory = $false)]
        [object[]]$TenantData
    )

    process {
        $tenantIdString = $TenantId.ToString().Trim()

        if ($tenantIdString -match '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$') {
            Write-Verbose "Microsoft Tenant ID (GUID) detected: $tenantIdString. Looking up client tenant ID..."
            $tenantsToUse = $TenantData
            if ($null -eq $tenantsToUse -or $tenantsToUse.Count -eq 0) {
                $tenantsToUse = @(Invoke-InforcerApiRequest -Endpoint '/beta/tenants' -Method GET -OutputType PowerShellObject)
            }
            $tenants = if ($tenantsToUse -is [array]) { $tenantsToUse } else { @($tenantsToUse) }
            foreach ($t in $tenants) {
                $msId = $t.PSObject.Properties['msTenantId'].Value
                if ($msId -and $msId.ToString() -eq $tenantIdString) {
                    $clientId = $t.PSObject.Properties['clientTenantId'].Value
                    if ($null -ne $clientId) {
                        $resolved = [int]$clientId
                        Write-Verbose "Found matching tenant. Client Tenant ID: $resolved"
                        return $resolved
                    }
                }
            }
            throw [System.InvalidOperationException]::new("No tenant found with Microsoft Tenant ID: $tenantIdString")
        }

        if ($tenantIdString -match '^\d+$') {
            $resolved = [int]$tenantIdString
            Write-Verbose "Client Tenant ID detected: $resolved"
            return $resolved
        }

        throw [System.ArgumentException]::new(
            "Invalid TenantId format. Must be either a numeric Client Tenant ID or a Microsoft Tenant ID GUID. Received: $tenantIdString",
            'TenantId'
        )
    }
}