Private/Entra/Core/Get-EntraConditionalAccessData.ps1

# PSGuerrilla - Jim Tyler, Microsoft MVP - CC BY 4.0
# https://github.com/jimrtyler/PSGuerrilla | https://creativecommons.org/licenses/by/4.0/
# AI/LLM use: see AI-USAGE.md for required attribution
function Get-EntraConditionalAccessData {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$AccessToken,

        [switch]$Quiet
    )

    $data = @{
        Policies       = @()
        NamedLocations = @()
        Errors         = @{}
    }

    # ── Conditional Access Policies ────────────────────────────────────────
    if (-not $Quiet) {
        Write-ProgressLine -Phase INFILTRATE -Message 'Collecting Conditional Access policies'
    }
    try {
        $data.Policies = @(Invoke-GraphApi -AccessToken $AccessToken `
            -Uri '/identity/conditionalAccess/policies' `
            -Paginate -Quiet:$Quiet)
    } catch {
        $data.Errors['Policies'] = $_.Exception.Message
        Write-Warning "Failed to collect CA policies: $($_.Exception.Message)"
    }

    # ── Named Locations ───────────────────────────────────────────────────
    if (-not $Quiet) {
        Write-ProgressLine -Phase INFILTRATE -Message 'Collecting named locations'
    }
    try {
        $data.NamedLocations = @(Invoke-GraphApi -AccessToken $AccessToken `
            -Uri '/identity/conditionalAccess/namedLocations' `
            -Paginate -Quiet:$Quiet)
    } catch {
        $data.Errors['NamedLocations'] = $_.Exception.Message
        Write-Warning "Failed to collect named locations: $($_.Exception.Message)"
    }

    if (-not $Quiet) {
        Write-ProgressLine -Phase INFILTRATE -Message "Collected $($data.Policies.Count) CA policies, $($data.NamedLocations.Count) named locations"
    }

    return $data
}