Private/Utility/Expand-IssueTemplate.ps1

function Expand-IssueTemplate {
    <#
    .SYNOPSIS
        Expands Issue, Fix, and Revert templates with variable substitution.
 
    .DESCRIPTION
        Handles the common pattern of joining array templates and replacing
        variable placeholders with actual values. Supports $(VariableName) syntax.
 
    .PARAMETER Config
        The ESC configuration hashtable containing IssueTemplate, FixTemplate, and RevertTemplate.
 
    .PARAMETER Variables
        A hashtable of variable names and their replacement values.
        Example: @{ TemplateName = 'User'; Owner = 'DOMAIN\Admin' }
 
    .PARAMETER IssueTemplate
        Optional override for the IssueTemplate. If provided, uses this instead of Config.IssueTemplate.
 
    .EXAMPLE
        $templates = Expand-IssueTemplate -Config $config -Variables @{
            TemplateName = 'User'
            IdentityReference = 'DOMAIN\Users'
            DistinguishedName = 'CN=User,CN=Certificate Templates,...'
        }
        # Returns: @{ Issue = '...'; Fix = '...'; Revert = '...' }
 
    .OUTPUTS
        [hashtable] A hashtable with Issue, Fix, and Revert expanded strings.
    #>

    [CmdletBinding()]
    [OutputType([hashtable])]
    param(
        [Parameter(Mandatory)]
        [hashtable]$Config,

        [Parameter(Mandatory)]
        [hashtable]$Variables,

        [string[]]$IssueTemplate
    )

    # Use provided IssueTemplate or get from config
    $issueSource = if ($IssueTemplate) { $IssueTemplate } else { $Config.IssueTemplate }

    # Join arrays into single strings
    $issue = if ($issueSource -is [array]) {
        $issueSource -join ''
    } else {
        $issueSource
    }

    $fix = if ($Config.FixTemplate -is [array]) {
        $Config.FixTemplate -join "`n"
    } else {
        $Config.FixTemplate
    }

    $revert = if ($Config.RevertTemplate -is [array]) {
        $Config.RevertTemplate -join "`n"
    } else {
        $Config.RevertTemplate
    }

    # Expand variables in all templates
    foreach ($key in $Variables.Keys) {
        $pattern = "`$(`$key)"
        $escapedPattern = [regex]::Escape($pattern)
        $value = $Variables[$key]
        
        if ($null -eq $value) { $value = '' }
        
        $issue = $issue -replace $escapedPattern, $value
        $fix = $fix -replace $escapedPattern, $value
        $revert = $revert -replace $escapedPattern, $value
    }

    return @{
        Issue  = $issue
        Fix    = $fix
        Revert = $revert
    }
}