PurviewDLP.psm1

<#
.SYNOPSIS
    PurviewDLP PowerShell Module - Root module loader.

.DESCRIPTION
    This is the root module file for the PurviewDLP module. It loads all
    Private (internal) and Public (exported) functions and sets up the module state.

.NOTES
    Module Name: PurviewDLP
    Author: uniQuk
    Version: 0.1.0
    
    This module provides cmdlets for managing Microsoft Purview DLP policies including:
    - Connecting to Security & Compliance Center
    - Exporting DLP configurations
    - Updating notification settings
    - Restoring policies from backup
    - Generating policy reports
#>


#Requires -Version 7.0

# Module initialization
Write-Verbose "Initializing PurviewDLP module..."

# Get module root directory
$script:ModuleRoot = $PSScriptRoot

#region Load Private Functions

Write-Verbose "Loading Private functions..."

# Get all Private function files
$privateFunctions = @(
    'Common.ps1'
    'LocationScope.ps1'
    'PolicyHelper.ps1'
    'ReportHelper.ps1'
    'ValidationHelper.ps1'
)

foreach ($functionFile in $privateFunctions) {
    $functionPath = Join-Path -Path $PSScriptRoot -ChildPath "Private\$functionFile"
    
    if (Test-Path -Path $functionPath) {
        Write-Verbose " Loading: $functionFile"
        . $functionPath
    }
    else {
        Write-Warning "Private function file not found: $functionPath"
    }
}

#endregion

#region Load Public Functions

Write-Verbose "Loading Public functions..."

# Get all Public function files (cmdlets)
$publicFunctions = Get-ChildItem -Path (Join-Path -Path $PSScriptRoot -ChildPath 'Public') -Filter '*.ps1' -ErrorAction SilentlyContinue

if ($publicFunctions) {
    foreach ($functionFile in $publicFunctions) {
        Write-Verbose " Loading: $($functionFile.Name)"
        . $functionFile.FullName
    }
}
else {
    Write-Verbose "No Public functions found (cmdlets not yet created)"
}

#endregion

#region Module State

# Initialize module-level variables
$script:ModuleVersion = '0.1.0'
$script:ModuleName = 'PurviewDLP'

# Module configuration (can be modified by users if needed)
$script:ModuleConfig = @{
    DefaultOutputPath = (Get-Location).Path
    VerboseOutput = $false
    ColorOutput = $true
}

#endregion

#region Export Module Members

# Export Public functions (cmdlets)
# These will also be listed in the module manifest (PurviewDLP.psd1)
$publicFunctionNames = $publicFunctions | ForEach-Object { $_.BaseName }

if ($publicFunctionNames -and $publicFunctionNames.Count -gt 0) {
    Export-ModuleMember -Function $publicFunctionNames
    Write-Verbose "Exported $($publicFunctionNames.Count) public functions: $($publicFunctionNames -join ', ')"
}
else {
    # No public functions yet - this is Phase 1, only Private functions loaded
    # Explicitly export nothing to prevent Private functions from being exported
    Export-ModuleMember -Function @()
    Write-Verbose "No public functions to export (Phase 1: Foundation only)"
}

# Export module variables (if needed by advanced users)
# Export-ModuleMember -Variable ModuleConfig

#endregion

#region Module Cleanup

# Register cleanup action when module is removed
$ExecutionContext.SessionState.Module.OnRemove = {
    Write-Verbose "Cleaning up PurviewDLP module..."
    # Add any cleanup code here if needed
}

#endregion

Write-Verbose "PurviewDLP module loaded successfully"