Private/Analyze/Invoke-PpaCommsComplianceAnalyzer.ps1

# Invoke-PpaCommsComplianceAnalyzer.ps1 - analyzer for section 07 (Communication Compliance).
# Assume-E5 model (decision D9): verdicts from Get-SupervisoryReviewPolicyV2 evidence like
# any E3 workload - policies returned -> inventory; genuinely empty -> a normal Improvement;
# unreadable -> Verify manually. The 'Requires' annotation rides alongside the verdict.
# ASCII-only source. Depends on New-PpaFinding/New-PpaSection/Get-PpaRequirement.

Set-StrictMode -Off

function Invoke-PpaCommsComplianceAnalyzer {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)] $Raw,
        $LicenseMap
    )

    $mid = Get-PpaMidDot
    $count = $Raw.policies.count          # $null when the read did not complete
    $req = Get-PpaRequirement $LicenseMap 'CC-01'
    $findings = New-Object System.Collections.Generic.List[object]
    $lm = @(@{ label = 'Learn about Communication Compliance'; url = 'https://learn.microsoft.com/en-us/purview/communication-compliance'; tag = 'docs' })

    if ($null -eq $count) {
        $findings.Add((New-PpaFinding -Id 'CC-01' -DomId 'f-cc-1' -Title 'Communication Compliance inventory not readable this session' -Status 'Verify manually' -Requires $req `
            -Whyline 'Supervisory-review policies could not be enumerated this session - confirm coverage in the Purview portal.' `
            -Table (New-PpaTable -Columns @('Configuration', 'Setting', 'Status') -Rows @(
                New-PpaRow -Cells @('Communication Compliance policies', 'Not readable this session') -Status 'Verify manually'
            )) -LearnMore $lm))
    }
    elseif ($count -eq 0) {
        $findings.Add((New-PpaFinding -Id 'CC-01' -DomId 'f-cc-1' -Title 'No Communication Compliance policies configured' -Status 'Improvement' -Requires $req `
            -Whyline 'No supervisory-review policy is capturing communications - relevant wherever regulatory supervision of communications is in scope.' `
            -Table (New-PpaTable -Columns @('Configuration', 'Setting', 'Status') -Rows @(
                New-PpaRow -Cells @('Communication Compliance policies', '0') -Status 'Improvement'
            )) -LearnMore $lm))
    }
    else {
        $findings.Add((New-PpaFinding -Id 'CC-01' -DomId 'f-cc-1' -Title "Communication Compliance in use - $count policies" -Status 'Informational' -Requires $req `
            -Whyline 'Supervisory-review policies are capturing communications for review.' `
            -Table (New-PpaTable -Columns @('Configuration', 'Setting', 'Status') -Rows @(
                New-PpaRow -Cells @('Communication Compliance policies', [string]$count) -Status 'Informational'
            )) -LearnMore $lm))
    }

    $metric = if ($null -eq $count) { 'not readable' } else { "$count policies" }
    $glance = New-PpaGlance -Name 'Comms Compliance' -Metric $metric -Sub 'requires E5'

    return New-PpaSection -Id 'Communication_Compliance' -Title 'Communication Compliance' -Group 'Insider Risk' `
        -GroupIcon 'fas fa-user-secret' -Glance $glance -Findings $findings.ToArray()
}