Public/Utils.ps1

# Nebula.Tools: Utilities ===========================================================================================================================

function Join-ClipboardLines {
    <#
    .SYNOPSIS
        Join clipboard lines into a single PowerShell-ready string.
    .DESCRIPTION
        Reads the clipboard, splits by line, trims each entry, removes empty lines,
        then joins them with a separator and optional quoting.
    .PARAMETER Separator
        String used between items. Default is ", ".
    .PARAMETER Quote
        Quote character to wrap each item. Default is the double-quote (").
        Use empty string to disable quoting.
    .PARAMETER RemoveDuplicates
        Remove duplicate lines before joining.
    .PARAMETER ShowOutput
        Write the joined string to the pipeline.
    .PARAMETER NoClipboard
        Do not copy the resulting string back to the clipboard.
    .EXAMPLE
        Join-ClipboardLines
        Returns a string like: "A", "B", "C"
    .EXAMPLE
        Join-ClipboardLines -Separator ', ' -Quote '"'
        Copies the output to the clipboard (default behavior).
    .EXAMPLE
        Join-ClipboardLines -NoClipboard
        Returns the output only (no clipboard write).
    .EXAMPLE
        Join-ClipboardLines -RemoveDuplicates
        Removes duplicate lines before joining.
    .EXAMPLE
        Join-ClipboardLines -ShowOutput
        Writes the joined string to the pipeline.
    .LINK
        https://kb.gioxx.org/Nebula/Tools/usage/utilities#join-clipboardlines
    .NOTES
        Author: Giovanni Solone
 
        Modification History:
        - 2026-02-03: Initial version.
        - 2026-02-05: Added RemoveDuplicates switch.
    #>

    [CmdletBinding()]
    param(
        [Parameter()]
        [string]$Separator = ', ',
        [Parameter()]
        [string]$Quote = '"',
        [Parameter()]
        [switch]$RemoveDuplicates,
        [Parameter()]
        [switch]$ShowOutput,
        [Parameter()]
        [switch]$NoClipboard
    )

    if (-not (Get-Command -Name Get-Clipboard -ErrorAction SilentlyContinue)) {
        Write-Error "Clipboard not available in this session."
        return
    }

    $raw = Get-Clipboard -Raw
    if ([string]::IsNullOrWhiteSpace($raw)) {
        Write-Warning "Clipboard is empty."
        return
    }

    $items = $raw -split "\r?\n" | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne '' }
    if (-not $items -or $items.Count -eq 0) {
        Write-Warning "No non-empty lines found in clipboard."
        return
    }

    $initialCount = $items.Count
    if ($RemoveDuplicates) {
        $items = $items | Select-Object -Unique
        $removed = $initialCount - $items.Count
    }

    if ([string]::IsNullOrEmpty($Quote)) {
        $joined = $items -join $Separator
    } else {
        $joined = ($items | ForEach-Object { "$Quote$_$Quote" }) -join $Separator
    }

    Write-Information "Items joined: $($items.Count)." -InformationAction Continue
    if ($RemoveDuplicates) {
        Write-Information "Duplicates removed: $removed." -InformationAction Continue
    }

    if (-not $NoClipboard) {
        if (Get-Command -Name Set-Clipboard -ErrorAction SilentlyContinue) {
            $joined | Set-Clipboard
            Write-Information "Output copied to clipboard." -InformationAction Continue
        } else {
            Write-Warning "Set-Clipboard not available in this session. Returning output only."
        }
    }

    if ($ShowOutput) {
        $joined
    }
}