Private/New-PstModuleRootContent.ps1

function New-PstModuleRootContent {
    <#
    .SYNOPSIS
        Generates PowerShell module root file (.psm1) content based on complexity level.

    .DESCRIPTION
        Creates the content for a PowerShell module root file with appropriate
        structure and features based on the specified complexity level.

        Basic: Simple dot-sourcing of Public/Private functions
        Standard: Adds error handling, verbose output, and function export
        Advanced: Full module with version checks, dependency loading, and cleanup

    .PARAMETER ModuleName
        The name of the module.

    .PARAMETER Complexity
        The complexity level. Valid values: Basic, Standard, Advanced.

    .EXAMPLE
        New-PstModuleRootContent -ModuleName "MyModule" -Complexity "Basic"
        Generates a basic .psm1 content.

    .EXAMPLE
        New-PstModuleRootContent -ModuleName "MyModule" -Complexity "Advanced"
        Generates a full-featured .psm1 with all advanced patterns.

    .NOTES
        Version: 1.0
        Author: MyPowerShellTemplates
        Creation Date: 2024
        Purpose/Change: Initial function development for intelligent code generation
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param (
        [Parameter(Mandatory = $true, Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string]$ModuleName,

        [Parameter(Mandatory = $false, Position = 1)]
        [ValidateSet("Basic", "Standard", "Advanced")]
        [string]$Complexity = "Standard"
    )

    begin {
        Write-Debug "Begin '$($MyInvocation.MyCommand.Name)' at '$(Get-Date)'"
        $sb = [System.Text.StringBuilder]::new()
    }

    process {
        switch ($Complexity) {
            "Basic" {
                # Basic: Simple dot-sourcing pattern
                [void]$sb.AppendLine("#Requires -Version 5.1")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# $ModuleName Module")
                [void]$sb.AppendLine("# Simple module loader")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Dot-source private functions")
                [void]$sb.AppendLine('$PrivatePath = Join-Path $PSScriptRoot "Private"')
                [void]$sb.AppendLine('if (Test-Path $PrivatePath) {')
                [void]$sb.AppendLine(' Get-ChildItem -Path $PrivatePath -Filter "*.ps1" | ForEach-Object {')
                [void]$sb.AppendLine(' . $_.FullName')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine('}')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Dot-source and export public functions")
                [void]$sb.AppendLine('$PublicPath = Join-Path $PSScriptRoot "Public"')
                [void]$sb.AppendLine('if (Test-Path $PublicPath) {')
                [void]$sb.AppendLine(' Get-ChildItem -Path $PublicPath -Filter "*.ps1" | ForEach-Object {')
                [void]$sb.AppendLine(' . $_.FullName')
                [void]$sb.AppendLine(' Export-ModuleMember -Function $_.BaseName')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine('}')
            }

            "Standard" {
                # Standard: Adds error handling and verbose output
                [void]$sb.AppendLine("#Requires -Version 5.1")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("<#")
                [void]$sb.AppendLine(".SYNOPSIS")
                [void]$sb.AppendLine(" $ModuleName module root file.")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine(".DESCRIPTION")
                [void]$sb.AppendLine(" Loads all public and private functions for the $ModuleName module.")
                [void]$sb.AppendLine(" Private functions are internal helpers, public functions are exported.")
                [void]$sb.AppendLine("#>")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine('$ErrorActionPreference = "Stop"')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Get paths for function files")
                [void]$sb.AppendLine('$PublicPath = Join-Path -Path $PSScriptRoot -ChildPath "Public"')
                [void]$sb.AppendLine('$PrivatePath = Join-Path -Path $PSScriptRoot -ChildPath "Private"')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Collect functions to export")
                [void]$sb.AppendLine('$FunctionsToExport = @()')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Dot-source private functions")
                [void]$sb.AppendLine('if (Test-Path -Path $PrivatePath) {')
                [void]$sb.AppendLine(' $PrivateFiles = Get-ChildItem -Path $PrivatePath -Filter "*.ps1" -Recurse')
                [void]$sb.AppendLine(' foreach ($file in $PrivateFiles) {')
                [void]$sb.AppendLine(' try {')
                [void]$sb.AppendLine(' Write-Verbose "Loading private function: $($file.BaseName)"')
                [void]$sb.AppendLine(' . $file.FullName')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine(' catch {')
                [void]$sb.AppendLine(' Write-Error "Failed to load private function $($file.BaseName): $_"')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine('}')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Dot-source public functions")
                [void]$sb.AppendLine('if (Test-Path -Path $PublicPath) {')
                [void]$sb.AppendLine(' $PublicFiles = Get-ChildItem -Path $PublicPath -Filter "*.ps1" -Recurse')
                [void]$sb.AppendLine(' foreach ($file in $PublicFiles) {')
                [void]$sb.AppendLine(' try {')
                [void]$sb.AppendLine(' Write-Verbose "Loading public function: $($file.BaseName)"')
                [void]$sb.AppendLine(' . $file.FullName')
                [void]$sb.AppendLine(' $FunctionsToExport += $file.BaseName')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine(' catch {')
                [void]$sb.AppendLine(' Write-Error "Failed to load public function $($file.BaseName): $_"')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine('}')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Export public functions")
                [void]$sb.AppendLine('Export-ModuleMember -Function $FunctionsToExport')
            }

            "Advanced" {
                # Advanced: Full module with version checks, dependencies, and cleanup
                [void]$sb.AppendLine("#Requires -Version 5.1")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("<#")
                [void]$sb.AppendLine(".SYNOPSIS")
                [void]$sb.AppendLine(" $ModuleName module root file.")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine(".DESCRIPTION")
                [void]$sb.AppendLine(" Advanced module loader for $ModuleName with the following features:")
                [void]$sb.AppendLine(" - Private and public function loading with error handling")
                [void]$sb.AppendLine(" - Module-scoped variable initialization")
                [void]$sb.AppendLine(" - Dependency checking")
                [void]$sb.AppendLine(" - Module cleanup on removal")
                [void]$sb.AppendLine(" - Performance logging")
                [void]$sb.AppendLine("#>")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine('$ErrorActionPreference = "Stop"')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#region Module Variables")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Module-scoped variables")
                [void]$sb.AppendLine("`$script:ModuleName = '$ModuleName'")
                [void]$sb.AppendLine('$script:ModulePath = $PSScriptRoot')
                [void]$sb.AppendLine('$script:LoadStartTime = Get-Date')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#endregion Module Variables")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#region Dependency Checks")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Check for required modules (add your dependencies here)")
                [void]$sb.AppendLine('$RequiredModules = @(')
                [void]$sb.AppendLine(" # @{ Name = 'ModuleName'; MinimumVersion = '1.0.0' }")
                [void]$sb.AppendLine(')')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine('foreach ($module in $RequiredModules) {')
                [void]$sb.AppendLine(' $params = @{ Name = $module.Name }')
                [void]$sb.AppendLine(' if ($module.MinimumVersion) {')
                [void]$sb.AppendLine(' $params.MinimumVersion = $module.MinimumVersion')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine(' ')
                [void]$sb.AppendLine(' if (-not (Get-Module -ListAvailable @params)) {')
                [void]$sb.AppendLine(' throw "Required module not found: $($module.Name) (MinVersion: $($module.MinimumVersion))"')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine('}')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#endregion Dependency Checks")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#region Function Loading")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Get paths for function files")
                [void]$sb.AppendLine('$PublicPath = Join-Path -Path $PSScriptRoot -ChildPath "Public"')
                [void]$sb.AppendLine('$PrivatePath = Join-Path -Path $PSScriptRoot -ChildPath "Private"')
                [void]$sb.AppendLine('$ResourcesPath = Join-Path -Path $PSScriptRoot -ChildPath "Resources"')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Initialize function tracking")
                [void]$sb.AppendLine('$script:LoadedFunctions = @{')
                [void]$sb.AppendLine(' Private = @()')
                [void]$sb.AppendLine(' Public = @()')
                [void]$sb.AppendLine('}')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Function to safely load a script file")
                [void]$sb.AppendLine('function Import-ModuleFunction {')
                [void]$sb.AppendLine(' [CmdletBinding()]')
                [void]$sb.AppendLine(' param (')
                [void]$sb.AppendLine(' [Parameter(Mandatory)]')
                [void]$sb.AppendLine(' [System.IO.FileInfo]$File,')
                [void]$sb.AppendLine('')
                [void]$sb.AppendLine(' [Parameter(Mandatory)]')
                [void]$sb.AppendLine(' [ValidateSet("Private", "Public")]')
                [void]$sb.AppendLine(' [string]$Scope')
                [void]$sb.AppendLine(' )')
                [void]$sb.AppendLine('')
                [void]$sb.AppendLine(' try {')
                [void]$sb.AppendLine(' $startTime = Get-Date')
                [void]$sb.AppendLine(' . $File.FullName')
                [void]$sb.AppendLine(' $loadTime = (Get-Date) - $startTime')
                [void]$sb.AppendLine(' ')
                [void]$sb.AppendLine(' Write-Verbose "[$Scope] Loaded: $($File.BaseName) ($($loadTime.TotalMilliseconds)ms)"')
                [void]$sb.AppendLine(' $script:LoadedFunctions[$Scope] += $File.BaseName')
                [void]$sb.AppendLine(' return $true')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine(' catch {')
                [void]$sb.AppendLine(' Write-Error "Failed to load $Scope function $($File.BaseName): $_"')
                [void]$sb.AppendLine(' return $false')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine('}')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Load private functions")
                [void]$sb.AppendLine('if (Test-Path -Path $PrivatePath) {')
                [void]$sb.AppendLine(' Get-ChildItem -Path $PrivatePath -Filter "*.ps1" -Recurse | ForEach-Object {')
                [void]$sb.AppendLine(' $null = Import-ModuleFunction -File $_ -Scope Private')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine('}')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Load public functions")
                [void]$sb.AppendLine('if (Test-Path -Path $PublicPath) {')
                [void]$sb.AppendLine(' Get-ChildItem -Path $PublicPath -Filter "*.ps1" -Recurse | ForEach-Object {')
                [void]$sb.AppendLine(' $null = Import-ModuleFunction -File $_ -Scope Public')
                [void]$sb.AppendLine(' }')
                [void]$sb.AppendLine('}')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#endregion Function Loading")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#region Module Cleanup")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine('$ExecutionContext.SessionState.Module.OnRemove = {')
                [void]$sb.AppendLine(' # Cleanup tasks when module is removed')
                [void]$sb.AppendLine(' Write-Verbose "Removing $script:ModuleName module..."')
                [void]$sb.AppendLine(' ')
                [void]$sb.AppendLine(' # Add any cleanup code here (close connections, dispose objects, etc.)')
                [void]$sb.AppendLine(' ')
                [void]$sb.AppendLine(' Write-Verbose "$script:ModuleName module removed."')
                [void]$sb.AppendLine('}')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#endregion Module Cleanup")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#region Export")
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Export public functions")
                [void]$sb.AppendLine('Export-ModuleMember -Function $script:LoadedFunctions.Public')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("# Log module load time")
                [void]$sb.AppendLine('$loadDuration = (Get-Date) - $script:LoadStartTime')
                [void]$sb.AppendLine('Write-Verbose "$script:ModuleName loaded in $($loadDuration.TotalMilliseconds)ms. Functions: $($script:LoadedFunctions.Public.Count) public, $($script:LoadedFunctions.Private.Count) private."')
                [void]$sb.AppendLine("")
                [void]$sb.AppendLine("#endregion Export")
            }
        }
    }

    end {
        Write-Debug "End '$($MyInvocation.MyCommand.Name)' at '$(Get-Date)'"
        return $sb.ToString()
    }
}