manifests/specs/service-collectors.psd1

#
# Collector spec for the service-coverage build-out — Epic AB#6741.
#
# Rendered into manifests/collectors/<Category>/<Name>.psd1 by
# scripts/Build-ScoutServiceCollector.ps1. Edit HERE and regenerate; the generated definitions
# say so in their own headers.
#
# WHAT EACH ENTRY DECLARES
#
# Category the manifests/collectors folder, which IS the Scout category
# Name the definition file basename and the collector's identity
# Worksheet the Excel sheet name — unique across every definition, <= 31 chars
# ResourceTypes Resource Graph type strings, lower-case, as ARG returns them
# ResourceTypeMatching omit to get SinglePass for multi-type, Grouped for single-type
# AdditionalFilter optional Where-Object body over the matched rows ($_ is the resource)
# Preamble optional extra statements, run per row after $data is bound
# Fields the service-specific columns, in worksheet order
#
# The five identity columns (Subscription, Resource Group, Name, Location) plus the retirement
# pair, 'Resource U' and the tag columns are added by the generator — never declare them here.
#
# RESOURCE TYPE PROVENANCE. Every type string below is taken from the ARM template reference on
# Microsoft Learn (learn.microsoft.com/azure/templates/<provider>/<type>), lower-cased to match
# what Resource Graph returns. AB#6444 found three fabricated type strings in Hybrid/ArcSites
# that the fixture generator happily manufactured rows for, so a definition passing its tests
# proves nothing about whether the type exists. tests/ServiceCollectorTypes.Tests.ps1 pins each
# string against this spec; only a live run proves rows come back.
#
@{
    Collectors = @(

        # ---------------------------------------------------------------------------------------
        # Migration — the only category at zero coverage (AB#6750: stories AB#6830, AB#6831).
        # ---------------------------------------------------------------------------------------
        @{
            Category = 'Migration'
            Name = 'AzureMigrateProjects'
            Worksheet = 'Migrate Projects'
            ResourceTypes = @('microsoft.migrate/migrateprojects', 'microsoft.migrate/projects')
            Fields = @(
                @{ Name = 'Project Kind';          Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State';    Expression = '$data.provisioningState' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Service Endpoint';      Expression = '$data.serviceEndpoint' }
                @{ Name = 'Utility Storage';       Expression = '$UtilityStorage' }
            )
            Preamble = @'
$UtilityStorage = if(![string]::IsNullOrEmpty($data.utilityStorageAccountId)){Get-AZSCIdSegment -Id $data.utilityStorageAccountId -Index 8}else{$null}
'@

        }
        @{
            Category = 'Migration'
            Name = 'AzureMigrateAssessments'
            Worksheet = 'Migrate Assessment Projects'
            ResourceTypes = @('microsoft.migrate/assessmentprojects')
            Fields = @(
                @{ Name = 'Project Status';        Expression = '$data.projectStatus' }
                @{ Name = 'Provisioning State';    Expression = '$data.provisioningState' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Assessment Solution';   Expression = '$AssessmentSolution' }
                @{ Name = 'Workspace Location';    Expression = '$data.customerWorkspaceLocation' }
            )
            Preamble = @'
$AssessmentSolution = if(![string]::IsNullOrEmpty($data.assessmentSolutionId)){Get-AZSCIdSegment -Id $data.assessmentSolutionId -Index 8}else{$null}
'@

        }
        @{
            Category = 'Migration'
            Name = 'AzureMigrateDiscoverySites'
            Worksheet = 'Migrate Discovery Sites'
            ResourceTypes = @(
                'microsoft.offazure/vmwaresites'
                'microsoft.offazure/hypervsites'
                'microsoft.offazure/serversites'
                'microsoft.offazure/mastersites'
            )
            Fields = @(
                @{ Name = 'Site Type';             Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State';    Expression = '$data.provisioningState' }
                @{ Name = 'Service Endpoint';      Expression = '$data.serviceEndpoint' }
                @{ Name = 'Discovery Solution';    Expression = '$DiscoverySolution' }
                @{ Name = 'Agent Version';         Expression = '$data.agentDetails.version' }
            )
            Preamble = @'
$DiscoverySolution = if(![string]::IsNullOrEmpty($data.discoverySolutionId)){Get-AZSCIdSegment -Id $data.discoverySolutionId -Index 8}else{$null}
'@

        }
        @{
            Category = 'Migration'
            Name = 'DatabaseMigrationServices'
            Worksheet = 'Database Migration Services'
            ResourceTypes = @('microsoft.datamigration/services', 'microsoft.datamigration/sqlmigrationservices')
            Fields = @(
                @{ Name = 'Service Kind';       Expression = '$1.TYPE' }
                @{ Name = 'SKU';                Expression = '$1.sku.name' }
                @{ Name = 'SKU Tier';           Expression = '$1.sku.tier' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Virtual Network';    Expression = '$VNET' }
                @{ Name = 'Subnet';             Expression = '$Subnet' }
            )
            Preamble = @'
$VNET = if(![string]::IsNullOrEmpty($data.virtualSubnetId)){Get-AZSCIdSegment -Id $data.virtualSubnetId -Index 8}else{$null}
$Subnet = if(![string]::IsNullOrEmpty($data.virtualSubnetId)){Get-AZSCIdSegment -Id $data.virtualSubnetId -Index 10}else{$null}
'@

        }
        @{
            Category = 'Migration'
            Name = 'DataBox'
            Worksheet = 'Data Box Jobs'
            ResourceTypes = @('microsoft.databox/jobs')
            Fields = @(
                @{ Name = 'SKU';              Expression = '$1.sku.name' }
                @{ Name = 'Job Status';       Expression = '$data.status' }
                @{ Name = 'Transfer Type';    Expression = '$data.transferType' }
                @{ Name = 'Delivery Type';    Expression = '$data.deliveryType' }
                @{ Name = 'Start Time';       Expression = '[string]$data.startTime' }
                @{ Name = 'Cancellation Reason'; Expression = '$data.cancellationReason' }
            )
        }
        @{
            Category = 'Migration'
            Name = 'StackEdge'
            Worksheet = 'Stack Edge Devices'
            ResourceTypes = @('microsoft.databoxedge/databoxedgedevices')
            Fields = @(
                @{ Name = 'SKU';               Expression = '$1.sku.name' }
                @{ Name = 'Device Status';     Expression = '$data.dataBoxEdgeDeviceStatus' }
                @{ Name = 'Device Type';       Expression = '$data.deviceType' }
                @{ Name = 'Model';             Expression = '$data.modelDescription' }
                @{ Name = 'Software Version';  Expression = '$data.deviceSoftwareVersion' }
                @{ Name = 'Serial Number';     Expression = '$data.serialNumber' }
            )
        }

        # ---------------------------------------------------------------------------------------
        # General — the third missing category (AB#6838). Largely relocation: SupportTickets moves
        # here from Management, and Reservations/Subscriptions are genuinely new.
        # ---------------------------------------------------------------------------------------
        @{
            Category = 'General'
            Name = 'Reservations'
            Worksheet = 'Reservations'
            ResourceTypes = @('microsoft.capacity/reservationorders', 'microsoft.capacity/reservationorders/reservations')
            Fields = @(
                @{ Name = 'Display Name';       Expression = '$data.displayName' }
                @{ Name = 'SKU';                Expression = '$1.sku.name' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Quantity';           Expression = '[string]$data.quantity' }
                @{ Name = 'Term';               Expression = '$data.term' }
                @{ Name = 'Billing Plan';       Expression = '$data.billingPlan' }
                @{ Name = 'Benefit Start';      Expression = '[string]$data.benefitStartTime' }
                @{ Name = 'Expiry Date';        Expression = '[string]$data.expiryDate' }
                @{ Name = 'Renew';              Expression = '[string]$data.renew' }
            )
        }
        # Quotas is a General service and Scout has ALWAYS fetched the data -- Get-ScoutVmQuotas
        # emits a single 'AZSC/VM/Quotas' envelope per run whose `properties` holds one entry per
        # subscription/region, each carrying the Get-AzVMUsage rows. Nothing rendered it. This is
        # the collector that finally does, so the two nested loops walk the envelope rather than
        # a resource list, and the identity columns come from the quota reading, not from ARM.
        @{
            Category = 'General'
            Name = 'Quotas'
            Worksheet = 'Quotas'
            ResourceTypes = @('AZSC/VM/Quotas')
            Identity = @(
                @{ Name = 'ID';           Expression = '$Loc.SubId' }
                @{ Name = 'Subscription'; Expression = '$Loc.Subscription' }
                @{ Name = 'Location';     Expression = '$Loc.Location' }
            )
            AdditionalRowLoops = @(
                @{ Variable = 'Loc';   Source = '$data' }
                @{ Variable = 'Usage'; Source = '$Loc.Data' }
            )
            TagLoop = $null
            Fields = @(
                @{ Name = 'Quota';         Expression = '$Usage.Name.LocalizedValue' }
                @{ Name = 'Quota Name';    Expression = '$Usage.Name.Value' }
                @{ Name = 'Current Value'; Expression = '[string]$Usage.CurrentValue' }
                @{ Name = 'Limit';         Expression = '[string]$Usage.Limit' }
                # Computed in the field expression, not the row Preamble: the Preamble runs before
                # the AdditionalRowLoops bind $Usage, so a variable assigned there would read $null
                # for every row -- a silently empty column.
                @{ Name = 'Used %';        Expression = '[string]$(if($null -ne $Usage -and $Usage.Limit -and [double]$Usage.Limit -gt 0){[math]::Round((([double]$Usage.CurrentValue / [double]$Usage.Limit) * 100), 1)}else{$null})' }
                @{ Name = 'Unit';          Expression = '$Usage.Unit' }
            )
        }

        # ---------------------------------------------------------------------------------------
        # DevOps — the second missing category. Epic AB#6741's acceptance criteria require all
        # eighteen categories to exist, and DevOps is named in its scope alongside Migration.
        # ---------------------------------------------------------------------------------------
        @{
            Category = 'DevOps'
            Name = 'ChaosStudio'
            Worksheet = 'Chaos Studio'
            ResourceTypes = @('microsoft.chaos/experiments', 'microsoft.chaos/targets')
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Step Count';         Expression = '[string]@($data.steps).Count' }
                @{ Name = 'Selector Count';     Expression = '[string]@($data.selectors).Count' }
                @{ Name = 'Identity Type';      Expression = '$1.identity.type' }
            )
        }
        @{
            Category = 'DevOps'
            Name = 'DevCenters'
            Worksheet = 'Dev Centers'
            ResourceTypes = @('microsoft.devcenter/devcenters', 'microsoft.devcenter/projects')
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Dev Center';         Expression = '$DevCenter' }
                @{ Name = 'Dev Box Limit';      Expression = '[string]$data.maxDevBoxesPerUser' }
                @{ Name = 'Identity Type';      Expression = '$1.identity.type' }
            )
            Preamble = @'
$DevCenter = if(![string]::IsNullOrEmpty($data.devCenterId)){Get-AZSCIdSegment -Id $data.devCenterId -Index 8}else{$null}
'@

        }
        @{
            Category = 'DevOps'
            Name = 'DevBoxPools'
            Worksheet = 'Dev Box Pools'
            ResourceTypes = @('microsoft.devcenter/projects/pools')
            Fields = @(
                @{ Name = 'Provisioning State';  Expression = '$data.provisioningState' }
                @{ Name = 'Definition Name';     Expression = '$data.devBoxDefinitionName' }
                @{ Name = 'Network Connection';  Expression = '$data.networkConnectionName' }
                @{ Name = 'Local Admin';         Expression = '$data.licenseType' }
                @{ Name = 'Admin Status';        Expression = '$data.localAdministrator' }
                @{ Name = 'Stop On Disconnect';  Expression = '$data.stopOnDisconnect.status' }
            )
        }
        @{
            Category = 'DevOps'
            Name = 'DevCenterNetworkConnections'
            Worksheet = 'Dev Center Network Conns'
            ResourceTypes = @('microsoft.devcenter/networkconnections')
            Fields = @(
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Domain Join Type';   Expression = '$data.domainJoinType' }
                @{ Name = 'Domain Name';        Expression = '$data.domainName' }
                @{ Name = 'Virtual Network';    Expression = '$VNET' }
                @{ Name = 'Subnet';             Expression = '$Subnet' }
            )
            Preamble = @'
$VNET = if(![string]::IsNullOrEmpty($data.subnetId)){Get-AZSCIdSegment -Id $data.subnetId -Index 8}else{$null}
$Subnet = if(![string]::IsNullOrEmpty($data.subnetId)){Get-AZSCIdSegment -Id $data.subnetId -Index 10}else{$null}
'@

        }
        @{
            Category = 'DevOps'
            Name = 'DeploymentEnvironments'
            Worksheet = 'Deployment Environments'
            ResourceTypes = @(
                'microsoft.devcenter/devcenters/environmenttypes'
                'microsoft.devcenter/projects/environmenttypes'
                'microsoft.devcenter/devcenters/catalogs'
                'microsoft.devcenter/projects/catalogs'
            )
            Fields = @(
                @{ Name = 'Resource Kind';       Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State';  Expression = '$data.provisioningState' }
                @{ Name = 'Deployment Target';   Expression = '$DeploymentTarget' }
                @{ Name = 'Status';              Expression = '$data.status' }
                @{ Name = 'Sync State';          Expression = '$data.syncState' }
            )
            Preamble = @'
$DeploymentTarget = if(![string]::IsNullOrEmpty($data.deploymentTargetId)){Get-AZSCIdSegment -Id $data.deploymentTargetId -Index 2}else{$null}
'@

        }
        @{
            Category = 'DevOps'
            Name = 'DevTestLabs'
            Worksheet = 'DevTest Labs'
            ResourceTypes = @('microsoft.devtestlab/labs', 'microsoft.devtestlab/schedules')
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Lab Storage Type';     Expression = '$data.labStorageType' }
                @{ Name = 'Premium Data Disks';   Expression = '$data.premiumDataDisks' }
                @{ Name = 'Schedule Status';      Expression = '$data.status' }
                @{ Name = 'Task Type';            Expression = '$data.taskType' }
            )
        }
        @{
            Category = 'DevOps'
            Name = 'LabServices'
            Worksheet = 'Lab Services'
            ResourceTypes = @('microsoft.labservices/labs', 'microsoft.labservices/labplans')
            Fields = @(
                @{ Name = 'Resource Kind';       Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State';  Expression = '$data.provisioningState' }
                @{ Name = 'State';               Expression = '$data.state' }
                @{ Name = 'SKU';                 Expression = '$1.sku.name' }
                @{ Name = 'Security Open Access'; Expression = '$data.securityProfile.openAccess' }
            )
        }
        @{
            Category = 'DevOps'
            Name = 'LoadTesting'
            Worksheet = 'Load Testing'
            ResourceTypes = @('microsoft.loadtestservice/loadtests')
            Fields = @(
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Data Plane URI';     Expression = '$data.dataPlaneURI' }
                @{ Name = 'Description';        Expression = '$data.description' }
                @{ Name = 'Identity Type';      Expression = '$1.identity.type' }
                @{ Name = 'CMK Identity';       Expression = '$data.encryption.identity.type' }
            )
        }
        @{
            Category = 'DevOps'
            Name = 'ManagedDevOpsPools'
            Worksheet = 'Managed DevOps Pools'
            ResourceTypes = @('microsoft.devopsinfrastructure/pools')
            Fields = @(
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Maximum Agents';     Expression = '[string]$data.maximumConcurrency' }
                @{ Name = 'Organisation Kind';  Expression = '$data.organizationProfile.kind' }
                @{ Name = 'Agent OS';           Expression = '$data.fabricProfile.kind' }
                @{ Name = 'Identity Type';      Expression = '$1.identity.type' }
            )
        }
        @{
            Category = 'DevOps'
            Name = 'PlaywrightTesting'
            Worksheet = 'Playwright Workspaces'
            ResourceTypes = @('microsoft.azureplaywrightservice/accounts')
            Fields = @(
                @{ Name = 'Provisioning State';  Expression = '$data.provisioningState' }
                @{ Name = 'Dashboard URI';       Expression = '$data.dashboardUri' }
                @{ Name = 'Local Auth';          Expression = '$data.localAuth' }
                @{ Name = 'Regional Affinity';   Expression = '$data.regionalAffinity' }
                @{ Name = 'Reporting';           Expression = '$data.reporting' }
                @{ Name = 'Scalable Execution';  Expression = '$data.scalableExecution' }
            )
        }
        @{
            Category = 'DevOps'
            Name = 'AppConfiguration'
            Worksheet = 'App Configuration'
            ResourceTypes = @('microsoft.appconfiguration/configurationstores')
            Fields = @(
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Endpoint';             Expression = '$data.endpoint' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Local Auth Disabled';  Expression = '[string]$data.disableLocalAuth' }
                @{ Name = 'Purge Protection';     Expression = '[string]$data.enablePurgeProtection' }
                @{ Name = 'Soft Delete Days';     Expression = '[string]$data.softDeleteRetentionInDays' }
                @{ Name = 'Private Endpoints';    Expression = '[string]@($data.privateEndpointConnections).Count' }
            )
        }
        @{
            Category = 'DevOps'
            Name = 'ApiConnections'
            Worksheet = 'API Connections'
            ResourceTypes = @('microsoft.web/connections')
            Fields = @(
                @{ Name = 'Display Name';   Expression = '$data.displayName' }
                @{ Name = 'API Name';       Expression = '$data.api.name' }
                @{ Name = 'API Type';       Expression = '$data.api.type' }
                @{ Name = 'Status';         Expression = '$Status' }
                @{ Name = 'Created Time';   Expression = '[string]$data.createdTime' }
                @{ Name = 'Changed Time';   Expression = '[string]$data.changedTime' }
            )
            Preamble = @'
$Status = [string]($data.statuses | ForEach-Object { $_.status })
'@

        }

        # ---------------------------------------------------------------------------------------
        # Integration — Scout's thinnest category at 3 of 15 (AB#6836).
        # ---------------------------------------------------------------------------------------
        @{
            Category = 'Integration'
            Name = 'LogicApps'
            Worksheet = 'Logic Apps'
            ResourceTypes = @('microsoft.logic/workflows')
            Fields = @(
                @{ Name = 'State';            Expression = '$data.state' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Version';          Expression = '$data.version' }
                @{ Name = 'Access Endpoint';  Expression = '$data.accessEndpoint' }
                @{ Name = 'Integration Account'; Expression = '$IntegrationAccount' }
                @{ Name = 'Trigger Count';    Expression = '[string]@($data.definition.triggers.psobject.properties).Count' }
                @{ Name = 'Action Count';     Expression = '[string]@($data.definition.actions.psobject.properties).Count' }
                @{ Name = 'Created Time';     Expression = '[string]$data.createdTime' }
                @{ Name = 'Changed Time';     Expression = '[string]$data.changedTime' }
            )
            Preamble = @'
$IntegrationAccount = if(![string]::IsNullOrEmpty($data.integrationAccount.id)){Get-AZSCIdSegment -Id $data.integrationAccount.id -Index 8}else{$null}
'@

        }
        @{
            Category = 'Integration'
            Name = 'IntegrationAccounts'
            Worksheet = 'Integration Accounts'
            ResourceTypes = @('microsoft.logic/integrationaccounts', 'microsoft.logic/integrationserviceenvironments')
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'SKU';                Expression = '$1.sku.name' }
                @{ Name = 'State';              Expression = '$data.state' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Public Network';     Expression = '$data.publicNetworkAccess' }
            )
        }
        @{
            Category = 'Integration'
            Name = 'LogicAppsCustomConnectors'
            Worksheet = 'Logic Apps Connectors'
            ResourceTypes = @('microsoft.web/customapis')
            Fields = @(
                @{ Name = 'Display Name';     Expression = '$data.displayName' }
                @{ Name = 'Description';      Expression = '$data.description' }
                @{ Name = 'Backend Service';  Expression = '$data.backendService.serviceUrl' }
                @{ Name = 'API Type';         Expression = '$data.apiType' }
                @{ Name = 'Connection Params'; Expression = '[string]@($data.connectionParameters.psobject.properties).Count' }
            )
        }
        @{
            Category = 'Integration'
            Name = 'EventGrid'
            Worksheet = 'Event Grid'
            ResourceTypes = @(
                'microsoft.eventgrid/topics'
                'microsoft.eventgrid/systemtopics'
                'microsoft.eventgrid/domains'
                'microsoft.eventgrid/partnertopics'
                'microsoft.eventgrid/namespaces'
            )
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Endpoint';             Expression = '$data.endpoint' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Local Auth Disabled';  Expression = '[string]$data.disableLocalAuth' }
                @{ Name = 'Source Type';          Expression = '$data.topicType' }
                @{ Name = 'Private Endpoints';    Expression = '[string]@($data.privateEndpointConnections).Count' }
            )
        }
        @{
            Category = 'Integration'
            Name = 'EventHubClusters'
            Worksheet = 'Event Hubs Clusters'
            ResourceTypes = @('microsoft.eventhub/clusters')
            Fields = @(
                @{ Name = 'SKU';               Expression = '$1.sku.name' }
                @{ Name = 'Capacity';          Expression = '[string]$1.sku.capacity' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Metric Id';         Expression = '$data.metricId' }
                @{ Name = 'Supports Scaling';  Expression = '[string]$data.supportsScaling' }
            )
        }
        @{
            Category = 'Integration'
            Name = 'Relays'
            Worksheet = 'Relays'
            ResourceTypes = @('microsoft.relay/namespaces', 'microsoft.relay/namespaces/hybridconnections', 'microsoft.relay/namespaces/wcfrelays')
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Service Bus Endpoint'; Expression = '$data.serviceBusEndpoint' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Listener Count';       Expression = '[string]$data.listenerCount' }
            )
        }
        @{
            Category = 'Integration'
            Name = 'HealthDataServices'
            Worksheet = 'Health Data Services'
            ResourceTypes = @(
                'microsoft.healthcareapis/services'
                'microsoft.healthcareapis/workspaces'
                'microsoft.healthcareapis/workspaces/fhirservices'
                'microsoft.healthcareapis/workspaces/dicomservices'
                'microsoft.healthcareapis/workspaces/iotconnectors'
            )
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'Service Kind';         Expression = '$1.KIND' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Authority';            Expression = '$data.authenticationConfiguration.authority' }
                @{ Name = 'SMART Proxy Enabled';  Expression = '[string]$data.authenticationConfiguration.smartProxyEnabled' }
            )
        }

        # ---------------------------------------------------------------------------------------
        # Web and Mobile — 6 of 22 (AB#6836).
        # ---------------------------------------------------------------------------------------
        @{
            Category = 'Web'
            Name = 'AppServiceEnvironments'
            Worksheet = 'App Service Environments'
            ResourceTypes = @('microsoft.web/hostingenvironments')
            Fields = @(
                @{ Name = 'Kind';               Expression = '$1.KIND' }
                @{ Name = 'Status';             Expression = '$data.status' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Internal Load Balancing'; Expression = '$data.internalLoadBalancingMode' }
                @{ Name = 'Dedicated Host Count'; Expression = '[string]$data.dedicatedHostCount' }
                @{ Name = 'Zone Redundant';     Expression = '[string]$data.zoneRedundant' }
                @{ Name = 'Virtual Network';    Expression = '$VNET' }
                @{ Name = 'Subnet';             Expression = '$Subnet' }
            )
            Preamble = @'
$VNET = if(![string]::IsNullOrEmpty($data.virtualNetwork.id)){Get-AZSCIdSegment -Id $data.virtualNetwork.id -Index 8}else{$null}
$Subnet = if(![string]::IsNullOrEmpty($data.virtualNetwork.subnet)){$data.virtualNetwork.subnet}else{$null}
'@

        }
        @{
            Category = 'Web'
            Name = 'StaticWebApps'
            Worksheet = 'Static Web Apps'
            ResourceTypes = @('microsoft.web/staticsites')
            Fields = @(
                @{ Name = 'SKU';                 Expression = '$1.sku.name' }
                @{ Name = 'Default Hostname';    Expression = '$data.defaultHostname' }
                @{ Name = 'Repository URL';      Expression = '$data.repositoryUrl' }
                @{ Name = 'Branch';              Expression = '$data.branch' }
                @{ Name = 'Provider';            Expression = '$data.provider' }
                @{ Name = 'Staging Environments'; Expression = '$data.stagingEnvironmentPolicy' }
                @{ Name = 'Config File Changes'; Expression = '[string]$data.allowConfigFileUpdates' }
                @{ Name = 'Custom Domains';      Expression = '[string]@($data.customDomains).Count' }
            )
        }
        @{
            Category = 'Web'
            Name = 'FunctionApps'
            Worksheet = 'Function Apps'
            ResourceTypes = @('microsoft.web/sites')
            AdditionalFilter = '$_.KIND -like ''*functionapp*'''
            Fields = @(
                @{ Name = 'Kind';                Expression = '$1.KIND' }
                @{ Name = 'State';               Expression = '$data.state' }
                @{ Name = 'Default Hostname';    Expression = '$data.defaultHostName' }
                @{ Name = 'App Service Plan';    Expression = '$ServerFarm' }
                @{ Name = 'HTTPS Only';          Expression = '[string]$data.httpsOnly' }
                @{ Name = 'Client Cert Enabled'; Expression = '[string]$data.clientCertEnabled' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Outbound Subnet';     Expression = '$OutboundSubnet' }
                @{ Name = 'Identity Type';       Expression = '$1.identity.type' }
            )
            Preamble = @'
$ServerFarm = if(![string]::IsNullOrEmpty($data.serverFarmId)){Get-AZSCIdSegment -Id $data.serverFarmId -Index 8}else{$null}
$OutboundSubnet = if(![string]::IsNullOrEmpty($data.virtualNetworkSubnetId)){Get-AZSCIdSegment -Id $data.virtualNetworkSubnetId -Index 10}else{$null}
'@

        }
        @{
            Category = 'Web'
            Name = 'DeploymentSlots'
            Worksheet = 'Deployment Slots'
            ResourceTypes = @('microsoft.web/sites/slots')
            Fields = @(
                @{ Name = 'Kind';               Expression = '$1.KIND' }
                @{ Name = 'Parent Site';        Expression = '$ParentSite' }
                @{ Name = 'State';              Expression = '$data.state' }
                @{ Name = 'Default Hostname';   Expression = '$data.defaultHostName' }
                @{ Name = 'App Service Plan';   Expression = '$ServerFarm' }
                @{ Name = 'HTTPS Only';         Expression = '[string]$data.httpsOnly' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
            )
            Preamble = @'
$ParentSite = if(![string]::IsNullOrEmpty($1.NAME)){Get-AZSCIdSegment -Id $1.NAME -Index 0}else{$null}
$ServerFarm = if(![string]::IsNullOrEmpty($data.serverFarmId)){Get-AZSCIdSegment -Id $data.serverFarmId -Index 8}else{$null}
'@

        }
        @{
            Category = 'Web'
            Name = 'AppServiceCertificates'
            Worksheet = 'App Service Certificates'
            ResourceTypes = @('microsoft.certificateregistration/certificateorders', 'microsoft.web/certificates')
            Fields = @(
                @{ Name = 'Resource Kind';    Expression = '$1.TYPE' }
                @{ Name = 'Status';           Expression = '$data.status' }
                @{ Name = 'Subject Name';     Expression = '$data.subjectName' }
                @{ Name = 'Issuer';           Expression = '$data.issuer' }
                @{ Name = 'Issue Date';       Expression = '[string]$data.issueDate' }
                @{ Name = 'Expiration Date';  Expression = '[string]$Expiration' }
                @{ Name = 'Days To Expiry';   Expression = '[string]$DaysToExpiry' }
                @{ Name = 'Auto Renew';       Expression = '[string]$data.autoRenew' }
                @{ Name = 'Key Vault';        Expression = '$KeyVault' }
            )
            Preamble = @'
$Expiration = if(![string]::IsNullOrEmpty($data.expirationDate)){$data.expirationDate}else{$data.expirationTime}
$DaysToExpiry = if(![string]::IsNullOrEmpty($Expiration)){[math]::Floor(([datetime]$Expiration - [datetime]'2000-01-01').TotalDays)}else{$null}
$KeyVault = if(![string]::IsNullOrEmpty($data.keyVaultId)){Get-AZSCIdSegment -Id $data.keyVaultId -Index 8}else{$null}
'@

        }
        @{
            Category = 'Web'
            Name = 'AppServiceDomains'
            Worksheet = 'App Service Domains'
            ResourceTypes = @('microsoft.domainregistration/domains')
            Fields = @(
                @{ Name = 'Registration Status'; Expression = '$data.registrationStatus' }
                @{ Name = 'Provisioning State';  Expression = '$data.provisioningState' }
                @{ Name = 'Created Time';        Expression = '[string]$data.createdTime' }
                @{ Name = 'Expiration Time';     Expression = '[string]$data.expirationTime' }
                @{ Name = 'Auto Renew';          Expression = '[string]$data.autoRenew' }
                @{ Name = 'Privacy';             Expression = '[string]$data.privacy' }
            )
        }
        @{
            Category = 'Web'
            Name = 'SignalR'
            Worksheet = 'SignalR'
            ResourceTypes = @('microsoft.signalrservice/signalr')
            Fields = @(
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'SKU Tier';             Expression = '$1.sku.tier' }
                @{ Name = 'Capacity';             Expression = '[string]$1.sku.capacity' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Host Name';            Expression = '$data.hostName' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Local Auth Disabled';  Expression = '[string]$data.disableLocalAuth' }
                @{ Name = 'TLS Client Cert';      Expression = '[string]$data.tls.clientCertEnabled' }
            )
        }
        @{
            Category = 'Web'
            Name = 'WebPubSub'
            Worksheet = 'Web PubSub'
            ResourceTypes = @('microsoft.signalrservice/webpubsub')
            Fields = @(
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'SKU Tier';             Expression = '$1.sku.tier' }
                @{ Name = 'Capacity';             Expression = '[string]$1.sku.capacity' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Host Name';            Expression = '$data.hostName' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Local Auth Disabled';  Expression = '[string]$data.disableLocalAuth' }
            )
        }
        @{
            Category = 'Web'
            Name = 'CommunicationServices'
            Worksheet = 'Communication Services'
            ResourceTypes = @(
                'microsoft.communication/communicationservices'
                'microsoft.communication/emailservices'
                'microsoft.communication/emailservices/domains'
            )
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Data Location';      Expression = '$data.dataLocation' }
                @{ Name = 'Host Name';          Expression = '$data.hostName' }
                @{ Name = 'Domain Management';  Expression = '$data.domainManagement' }
                @{ Name = 'Verification State'; Expression = '$data.verificationStates.Domain.status' }
            )
        }
        @{
            Category = 'Web'
            Name = 'NotificationHubs'
            Worksheet = 'Notification Hubs'
            ResourceTypes = @('microsoft.notificationhubs/namespaces', 'microsoft.notificationhubs/namespaces/notificationhubs')
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'SKU Tier';             Expression = '$1.sku.tier' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Namespace Type';       Expression = '$data.namespaceType' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
            )
        }
        @{
            Category = 'Web'
            Name = 'FluidRelay'
            Worksheet = 'Fluid Relay'
            ResourceTypes = @('microsoft.fluidrelay/fluidrelayservers')
            Fields = @(
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Storage SKU';        Expression = '$data.storagesku' }
                @{ Name = 'Frs Tenant Id';      Expression = '$data.frsTenantId' }
                @{ Name = 'Identity Type';      Expression = '$1.identity.type' }
            )
        }
        @{
            Category = 'Web'
            Name = 'SpringApps'
            Worksheet = 'Spring Apps'
            ResourceTypes = @('microsoft.appplatform/spring', 'microsoft.appplatform/spring/apps')
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'SKU';                Expression = '$1.sku.name' }
                @{ Name = 'SKU Tier';           Expression = '$1.sku.tier' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Service Id';         Expression = '$data.serviceId' }
                @{ Name = 'Zone Redundant';     Expression = '[string]$data.zoneRedundant' }
                @{ Name = 'Public Endpoint';    Expression = '[string]$data.public' }
            )
        }

        # ---------------------------------------------------------------------------------------
        # Storage — 3 of 17 (AB#6837). Child resources are collected separately (AB#6834).
        # ---------------------------------------------------------------------------------------
        @{
            Category = 'Storage'
            Name = 'Snapshots'
            Worksheet = 'Snapshots'
            ResourceTypes = @('microsoft.compute/snapshots')
            Fields = @(
                @{ Name = 'SKU';               Expression = '$1.sku.name' }
                @{ Name = 'Disk State';        Expression = '$data.diskState' }
                @{ Name = 'Size (GB)';         Expression = '[string]$data.diskSizeGB' }
                @{ Name = 'Incremental';       Expression = '[string]$data.incremental' }
                @{ Name = 'Created';           Expression = '[string]$data.timeCreated' }
                @{ Name = 'Source Disk';       Expression = '$SourceDisk' }
                @{ Name = 'OS Type';           Expression = '$data.osType' }
                @{ Name = 'Network Access';    Expression = '$data.networkAccessPolicy' }
                @{ Name = 'Public Network';    Expression = '$data.publicNetworkAccess' }
            )
            Preamble = @'
$SourceDisk = if(![string]::IsNullOrEmpty($data.creationData.sourceResourceId)){Get-AZSCIdSegment -Id $data.creationData.sourceResourceId -Index 8}else{$null}
'@

        }
        @{
            Category = 'Storage'
            Name = 'DiskEncryptionSets'
            Worksheet = 'Disk Encryption Sets'
            ResourceTypes = @('microsoft.compute/diskencryptionsets')
            Fields = @(
                @{ Name = 'Encryption Type';    Expression = '$data.encryptionType' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Key Vault';          Expression = '$KeyVault' }
                @{ Name = 'Auto Key Rotation';  Expression = '[string]$data.rotationToLatestKeyVersionEnabled' }
                @{ Name = 'Identity Type';      Expression = '$1.identity.type' }
            )
            Preamble = @'
$KeyVault = if(![string]::IsNullOrEmpty($data.activeKey.sourceVault.id)){Get-AZSCIdSegment -Id $data.activeKey.sourceVault.id -Index 8}else{$null}
'@

        }
        @{
            Category = 'Storage'
            Name = 'ElasticSan'
            Worksheet = 'Elastic SAN'
            ResourceTypes = @('microsoft.elasticsan/elasticsans', 'microsoft.elasticsan/elasticsans/volumegroups')
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'SKU';                Expression = '$1.sku.name' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Base Size (TiB)';    Expression = '[string]$data.baseSizeTiB' }
                @{ Name = 'Extended Size (TiB)'; Expression = '[string]$data.extendedCapacitySizeTiB' }
                @{ Name = 'Protocol Type';      Expression = '$data.protocolType' }
                @{ Name = 'Encryption';         Expression = '$data.encryption' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
            )
        }
        @{
            Category = 'Storage'
            Name = 'StorageSync'
            Worksheet = 'Storage Sync Services'
            ResourceTypes = @(
                'microsoft.storagesync/storagesyncservices'
                'microsoft.storagesync/storagesyncservices/syncgroups'
                'microsoft.storagesync/storagesyncservices/registeredservers'
            )
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Incoming Traffic';     Expression = '$data.incomingTrafficPolicy' }
                @{ Name = 'Server Name';          Expression = '$data.friendlyName' }
                @{ Name = 'Server OS';            Expression = '$data.serverOSVersion' }
                @{ Name = 'Agent Version';        Expression = '$data.agentVersion' }
                @{ Name = 'Server Status';        Expression = '$data.serverManagementErrorCode' }
            )
        }
        @{
            Category = 'Storage'
            Name = 'EdgeHardwareCenter'
            Worksheet = 'Edge Hardware Center'
            ResourceTypes = @('microsoft.edgeorder/orders', 'microsoft.edgeorder/orderitems', 'microsoft.edgeorder/addresses')
            Fields = @(
                @{ Name = 'Resource Kind';   Expression = '$1.TYPE' }
                @{ Name = 'Order Stage';     Expression = '$data.orderStageHistory' }
                @{ Name = 'Product Family';  Expression = '$data.productDetails.hierarchyInformation.productFamilyName' }
                @{ Name = 'Product Line';    Expression = '$data.productDetails.hierarchyInformation.productLineName' }
                @{ Name = 'Quantity';        Expression = '[string]$data.productDetails.count' }
                @{ Name = 'Address State';   Expression = '$data.addressValidationStatus' }
            )
        }
        @{
            Category = 'Storage'
            Name = 'DataLakeStoreGen1'
            Worksheet = 'Data Lake Store Gen1'
            ResourceTypes = @('microsoft.datalakestore/accounts')
            Fields = @(
                @{ Name = 'Provisioning State';  Expression = '$data.provisioningState' }
                @{ Name = 'State';               Expression = '$data.state' }
                @{ Name = 'Encryption State';    Expression = '$data.encryptionState' }
                @{ Name = 'Firewall State';      Expression = '$data.firewallState' }
                @{ Name = 'Endpoint';            Expression = '$data.endpoint' }
                @{ Name = 'Retired';             Expression = '''Azure Data Lake Storage Gen1 was retired 2024-02-29''' }
            )
        }
        @{
            Category = 'Storage'
            Name = 'PartnerStorage'
            Worksheet = 'Partner Storage Services'
            ResourceTypes = @(
                'purestorage.block/storagepools'
                'purestorage.block/reservations'
                'qumulo.storage/filesystems'
            )
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Marketplace Plan';   Expression = '$1.plan.name' }
                @{ Name = 'Publisher';          Expression = '$1.plan.publisher' }
                @{ Name = 'Offer';              Expression = '$1.plan.product' }
            )
        }

        # ---------------------------------------------------------------------------------------
        # Internet of Things — 8 of 19 (AB#6837).
        # ---------------------------------------------------------------------------------------
        @{
            Category = 'IoT'
            Name = 'DeviceProvisioningServices'
            Worksheet = 'IoT DPS'
            ResourceTypes = @('microsoft.devices/provisioningservices')
            Fields = @(
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'Capacity';             Expression = '[string]$1.sku.capacity' }
                @{ Name = 'State';                Expression = '$data.state' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Service Endpoint';     Expression = '$data.serviceOperationsHostName' }
                @{ Name = 'Allocation Policy';    Expression = '$data.allocationPolicy' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Linked IoT Hubs';      Expression = '[string]@($data.iotHubs).Count' }
            )
        }
        @{
            Category = 'IoT'
            Name = 'IoTCentral'
            Worksheet = 'IoT Central'
            ResourceTypes = @('microsoft.iotcentral/iotapps')
            Fields = @(
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'State';                Expression = '$data.state' }
                @{ Name = 'Application Id';       Expression = '$data.applicationId' }
                @{ Name = 'Subdomain';            Expression = '$data.subdomain' }
                @{ Name = 'Template';             Expression = '$data.template' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Identity Type';        Expression = '$1.identity.type' }
            )
        }
        @{
            Category = 'IoT'
            Name = 'DeviceUpdate'
            Worksheet = 'Device Update'
            ResourceTypes = @('microsoft.deviceupdate/accounts', 'microsoft.deviceupdate/accounts/instances')
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'SKU';                  Expression = '$data.sku' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Host Name';            Expression = '$data.hostName' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Linked IoT Hubs';      Expression = '[string]@($data.iotHubs).Count' }
            )
        }
        @{
            Category = 'IoT'
            Name = 'DigitalTwins'
            Worksheet = 'Digital Twins'
            ResourceTypes = @(
                'microsoft.digitaltwins/digitaltwinsinstances'
                'microsoft.digitaltwins/digitaltwinsinstances/endpoints'
                'microsoft.digitaltwins/digitaltwinsinstances/timeseriesdatabaseconnections'
            )
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Host Name';            Expression = '$data.hostName' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Endpoint Type';        Expression = '$data.endpointType' }
                @{ Name = 'Identity Type';        Expression = '$1.identity.type' }
            )
        }
        @{
            Category = 'IoT'
            Name = 'Maps'
            Worksheet = 'Azure Maps'
            ResourceTypes = @('microsoft.maps/accounts', 'microsoft.maps/accounts/creators')
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'SKU Tier';             Expression = '$1.sku.tier' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Unique Id';            Expression = '$data.uniqueId' }
                @{ Name = 'Local Auth Disabled';  Expression = '[string]$data.disableLocalAuth' }
                @{ Name = 'Storage Units';        Expression = '[string]$data.storageUnits' }
            )
        }
        @{
            Category = 'IoT'
            Name = 'DefenderForIoT'
            Worksheet = 'Defender for IoT'
            ResourceTypes = @(
                'microsoft.iotsecurity/defendersettings'
                'microsoft.iotsecurity/sites'
                'microsoft.iotsecurity/sensors'
                'microsoft.iotsecurity/onpremisesensors'
            )
            Fields = @(
                @{ Name = 'Resource Kind';       Expression = '$1.TYPE' }
                @{ Name = 'Device Quota';        Expression = '[string]$data.deviceQuota' }
                @{ Name = 'Onboarding Kind';     Expression = '$data.onboardingKind' }
                @{ Name = 'Sentinel Workspace';  Expression = '$SentinelWorkspace' }
                @{ Name = 'MDE Integration';     Expression = '$data.mdeIntegration.status' }
                @{ Name = 'Display Name';        Expression = '$data.displayName' }
            )
            Preamble = @'
$SentinelWorkspace = if(![string]::IsNullOrEmpty($data.sentinelWorkspaceResourceIds)){Get-AZSCIdSegment -Id ([string]@($data.sentinelWorkspaceResourceIds)[0]) -Index 8}else{$null}
'@

        }

        # ---------------------------------------------------------------------------------------
        # Security — 6 of 22, and the most damaging gap: a security-posture tool that sees a third
        # of the security services (AB#6837).
        # ---------------------------------------------------------------------------------------
        @{
            Category = 'Security'
            Name = 'Sentinel'
            Worksheet = 'Sentinel'
            ResourceTypes = @('microsoft.operationsmanagement/solutions', 'microsoft.securityinsights/onboardingstates')
            # A Sentinel deployment surfaces in the `resources` table as an OMS solution named
            # `SecurityInsights(<workspace>)`. Matching the whole solutions type would sweep in
            # every other OMS solution in the estate, so the name is the discriminator.
            AdditionalFilter = '$_.TYPE -eq ''microsoft.securityinsights/onboardingstates'' -or $_.NAME -like ''SecurityInsights*'''
            Fields = @(
                @{ Name = 'Resource Kind';    Expression = '$1.TYPE' }
                @{ Name = 'Workspace';        Expression = '$Workspace' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Customer Managed Key'; Expression = '[string]$data.customerManagedKey' }
                @{ Name = 'Plan';             Expression = '$1.plan.name' }
            )
            Preamble = @'
$Workspace = if(![string]::IsNullOrEmpty($data.workspaceResourceId)){Get-AZSCIdSegment -Id $data.workspaceResourceId -Index 8}else{$null}
'@

        }
        @{
            Category = 'Security'
            Name = 'ManagedHSM'
            Worksheet = 'Managed HSM'
            ResourceTypes = @('microsoft.keyvault/managedhsms')
            Fields = @(
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'SKU Family';           Expression = '$1.sku.family' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'HSM URI';              Expression = '$data.hsmUri' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Purge Protection';     Expression = '[string]$data.enablePurgeProtection' }
                @{ Name = 'Soft Delete Days';     Expression = '[string]$data.softDeleteRetentionInDays' }
                @{ Name = 'Security Domain';      Expression = '$data.securityDomainProperties.activationStatus' }
            )
        }
        @{
            Category = 'Security'
            Name = 'CloudHSM'
            Worksheet = 'Cloud HSM'
            ResourceTypes = @('microsoft.hardwaresecuritymodules/cloudhsmclusters', 'microsoft.hardwaresecuritymodules/dedicatedhsms')
            Fields = @(
                @{ Name = 'Resource Kind';        Expression = '$1.TYPE' }
                @{ Name = 'SKU';                  Expression = '$1.sku.name' }
                @{ Name = 'Provisioning State';   Expression = '$data.provisioningState' }
                @{ Name = 'Public Network Access'; Expression = '$data.publicNetworkAccess' }
                @{ Name = 'Auto Generated Domain'; Expression = '[string]$data.autoGeneratedDomainNameLabelScope' }
                @{ Name = 'Stamp Id';             Expression = '$data.stampId' }
            )
        }
        @{
            Category = 'Security'
            Name = 'ApplicationSecurityGroups'
            Worksheet = 'App Security Groups'
            ResourceTypes = @('microsoft.network/applicationsecuritygroups')
            Fields = @(
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Resource GUID';      Expression = '$data.resourceGuid' }
            )
        }
        @{
            Category = 'Security'
            Name = 'WafPolicies'
            Worksheet = 'WAF Policies'
            ResourceTypes = @(
                'microsoft.network/applicationgatewaywebapplicationfirewallpolicies'
                'microsoft.network/frontdoorwebapplicationfirewallpolicies'
                'microsoft.cdn/cdnwebapplicationfirewallpolicies'
            )
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'SKU';                Expression = '$1.sku.name' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Enabled State';      Expression = '$EnabledState' }
                @{ Name = 'Mode';               Expression = '$Mode' }
                @{ Name = 'Managed Rule Sets';  Expression = '[string]@($data.managedRules.managedRuleSets).Count' }
                @{ Name = 'Custom Rules';       Expression = '[string]$CustomRuleCount' }
                @{ Name = 'Associations';       Expression = '[string]$AssociationCount' }
            )
            Preamble = @'
$EnabledState = if(![string]::IsNullOrEmpty($data.policySettings.enabledState)){$data.policySettings.enabledState}else{[string]$data.policySettings.state}
$Mode = $data.policySettings.mode
$CustomRuleCount = if($null -ne $data.customRules.rules){@($data.customRules.rules).Count}else{@($data.customRules).Count}
$AssociationCount = @($data.applicationGateways).Count + @($data.httpListeners).Count + @($data.pathBasedRules).Count + @($data.frontendEndpointLinks).Count
'@

        }
        @{
            Category = 'Security'
            Name = 'DdosProtectionPlans'
            Worksheet = 'DDoS Protection Plans'
            ResourceTypes = @('microsoft.network/ddosprotectionplans')
            Fields = @(
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Protected VNETs';    Expression = '[string]@($data.virtualNetworks).Count' }
                @{ Name = 'Public IP Count';    Expression = '[string]@($data.publicIPAddresses).Count' }
                @{ Name = 'Resource GUID';      Expression = '$data.resourceGuid' }
            )
        }
        @{
            Category = 'Security'
            Name = 'ConfidentialLedger'
            Worksheet = 'Confidential Ledger'
            ResourceTypes = @('microsoft.confidentialledger/ledgers', 'microsoft.confidentialledger/managedccfs')
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Ledger Type';        Expression = '$data.ledgerType' }
                @{ Name = 'Ledger URI';         Expression = '$data.ledgerUri' }
                @{ Name = 'Identity Service';   Expression = '$data.identityServiceUri' }
                @{ Name = 'Running State';      Expression = '$data.runningState' }
            )
        }
        @{
            Category = 'Security'
            Name = 'ArtifactSigning'
            Worksheet = 'Artifact Signing'
            ResourceTypes = @('microsoft.codesigning/codesigningaccounts')
            Fields = @(
                @{ Name = 'SKU';                Expression = '$data.sku.name' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Account URI';        Expression = '$data.accountUri' }
            )
        }
        @{
            Category = 'Security'
            Name = 'EntraDomainServices'
            Worksheet = 'Entra Domain Services'
            ResourceTypes = @('microsoft.aad/domainservices')
            Fields = @(
                @{ Name = 'Domain Name';         Expression = '$data.domainName' }
                @{ Name = 'SKU';                 Expression = '$data.sku' }
                @{ Name = 'Provisioning State';  Expression = '$data.provisioningState' }
                @{ Name = 'Sync Scope';          Expression = '$data.syncScope' }
                @{ Name = 'TLS v1 Enabled';      Expression = '$data.domainSecuritySettings.tlsV1' }
                @{ Name = 'NTLM v1 Enabled';     Expression = '$data.domainSecuritySettings.ntlmV1' }
                @{ Name = 'Kerberos RC4';        Expression = '$data.domainSecuritySettings.kerberosRc4Encryption' }
                @{ Name = 'LDAPS Enabled';       Expression = '$data.ldapsSettings.ldaps' }
                @{ Name = 'LDAPS External';      Expression = '$data.ldapsSettings.externalAccess' }
            )
        }
        @{
            Category = 'Security'
            Name = 'AppComplianceAutomation'
            Worksheet = 'App Compliance Automation'
            ResourceTypes = @('microsoft.appcomplianceautomation/reports', 'microsoft.appcomplianceautomation/reports/snapshots')
            Fields = @(
                @{ Name = 'Resource Kind';      Expression = '$1.TYPE' }
                @{ Name = 'Provisioning State'; Expression = '$data.provisioningState' }
                @{ Name = 'Status';             Expression = '$data.status' }
                @{ Name = 'Trigger Time';       Expression = '[string]$data.triggerTime' }
                @{ Name = 'Time Zone';          Expression = '$data.timeZone' }
                @{ Name = 'Resource Count';     Expression = '[string]@($data.resources).Count' }
            )
        }
    )
}