Private/Azure/Get-PolicyDefinitionCached.ps1

function Get-PolicyDefinitionCached {
    <#
    .SYNOPSIS
        Retrieve Azure Policy definition with caching support.
     
    .DESCRIPTION
        Wrapper around Get-AzPolicyDefinition with in-memory caching to reduce
        redundant API calls. Includes retry logic for throttling and tracks cache statistics.
     
    .PARAMETER PolicyDefinitionId
        Resource ID of the policy definition to retrieve.
     
    .PARAMETER Cache
        Hashtable for caching policy definitions (shared across calls).
     
    .EXAMPLE
        $cache = @{}
        $policy = Get-PolicyDefinitionCached -PolicyDefinitionId $id -Cache $cache
     
    .OUTPUTS
        Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.Policy.PsPolicyDefinition
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$PolicyDefinitionId,
        
        [hashtable]$Cache = @{}
    )
    
    # Initialize statistics if not already done
    if (-not $script:ApiCallStats) {
        Initialize-ApiStatistics
    }
    
    # Check cache first
    if ($Cache.ContainsKey($PolicyDefinitionId)) {
        Write-Debug "Cache HIT for policy definition: $PolicyDefinitionId"
        $script:ApiCallStats.CacheHits++
        return $Cache[$PolicyDefinitionId]
    }
    
    # Cache miss
    Write-Debug "Cache MISS for policy definition: $PolicyDefinitionId"
    $script:ApiCallStats.CacheMisses++
    
    # Fetch with retry logic
    try {
        Write-Debug "Fetching policy definition: $PolicyDefinitionId"
        
        $definition = Invoke-AzCommandWithRetry -Command {
            Get-AzPolicyDefinition -Id $PolicyDefinitionId -ErrorAction Stop
        } -OperationName "PolicyDefinition"
        
        # Track API type
        $script:ApiCallStats.PolicyDefinitionCalls++
        
        # Cache the result
        $Cache[$PolicyDefinitionId] = $definition
        
        return $definition
    }
    catch {
        Write-Warning "Failed to get policy definition: $PolicyDefinitionId - $($_.Exception.Message)"
        throw
    }
}