Modules/IdLE.Provider.AD/Private/Test-IdleADPrerequisites.ps1

Set-StrictMode -Version Latest

function Test-IdleADPrerequisites {
    <#
    .SYNOPSIS
    Checks if the Active Directory prerequisites are available.

    .DESCRIPTION
    Validates that the ActiveDirectory PowerShell module (RSAT) is available.
    This module is required for all AD provider operations.

    This function does not throw and returns a structured result object
    that can be used by the provider to emit warnings or by provider methods
    to throw actionable errors when prerequisites are missing.

    .OUTPUTS
    PSCustomObject with PSTypeName 'IdLE.PrerequisitesResult'
    - PSTypeName: 'IdLE.PrerequisitesResult'
    - ProviderName: 'ADIdentityProvider'
    - IsHealthy: $true if all required prerequisites are met
    - MissingRequired: array of missing required modules/components
    - MissingOptional: array of missing optional modules/components
    - Notes: array of additional notes or recommendations
    - CheckedAt: datetime when the check was performed

    .EXAMPLE
    $prereqs = Test-IdleADPrerequisites
    if (-not $prereqs.IsHealthy) {
        Write-Warning "AD prerequisites check failed: $($prereqs.MissingRequired -join ', ')"
    }
    #>

    [CmdletBinding()]
    param()

    $missingRequired = @()
    $missingOptional = @()
    $notes = @()

    # Check for ActiveDirectory module (required)
    $adModule = Get-Module -Name 'ActiveDirectory' -ListAvailable -ErrorAction SilentlyContinue
    if ($null -eq $adModule) {
        $missingRequired += 'ActiveDirectory'
        $notes += 'The ActiveDirectory PowerShell module (RSAT-AD-PowerShell) is required for all AD provider operations.'
        $notes += 'Install via: Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
    }

    $isHealthy = ($missingRequired.Count -eq 0)

    return [pscustomobject]@{
        PSTypeName       = 'IdLE.PrerequisitesResult'
        ProviderName     = 'ADIdentityProvider'
        IsHealthy        = $isHealthy
        MissingRequired  = $missingRequired
        MissingOptional  = $missingOptional
        Notes            = $notes
        CheckedAt        = [datetime]::UtcNow
    }
}