Public/Core/ConvertTo-AssFile.ps1

function ConvertTo-AssFile {
    <#
    .SYNOPSIS
        Serializes a SubtitleFile to ASS-formatted text.
    .PARAMETER InputObject
        The SubtitleFile object to serialize.
    .EXAMPLE
        $sub | ConvertTo-AssFile | Set-Content output.ass -Encoding UTF8
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [SubtitleFile] $InputObject
    )

    process {
        $sb = [System.Text.StringBuilder]::new()

        # Write header (Script Info + Styles)
        if ($InputObject.Header) {
            [void]$sb.Append((Write-AssHeader -Header $InputObject.Header))
        } else {
            # Create a minimal default header
            $defaultHeader = [AssHeader]::new()
            $defaultStyle  = [AssStyle]::new()
            $defaultHeader.Styles = @($defaultStyle)
            [void]$sb.Append((Write-AssHeader -Header $defaultHeader))
        }

        # Events section
        [void]$sb.AppendLine('[Events]')
        [void]$sb.AppendLine('Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text')

        foreach ($entry in $InputObject.Entries) {
            if ($entry -is [AssEntry]) {
                [void]$sb.AppendLine((Write-AssEntry -Entry $entry))
            } else {
                # Convert generic SubtitleEntry to AssEntry
                $assEntry           = [AssEntry]::new()
                $assEntry.Index     = $entry.Index
                $assEntry.Start     = $entry.Start
                $assEntry.End       = $entry.End
                $assEntry.Lines     = $entry.Lines
                [void]$sb.AppendLine((Write-AssEntry -Entry $assEntry))
            }
        }

        return $sb.ToString()
    }
}