Private/Merge-GlookoDatasets.ps1

function Merge-GlookoDatasets {
    <#
    .SYNOPSIS
        Merges multiple dataset objects with the same Dataset and OriginalFirstLine.
    
    .DESCRIPTION
        Consolidates datasets that have matching Dataset and OriginalFirstLine values in their Metadata.
        Merges their data based on ascending Order and uses metadata from the object with the lowest order.
    
    .PARAMETER ImportedData
        Array of imported objects from Import-GlookoCSV, each with Metadata and Data properties.
    
    .OUTPUTS
        Array of PSCustomObject with consolidated datasets.
    #>

    
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [AllowEmptyCollection()]
        [array]$ImportedData
    )
    
    Write-Verbose "Starting Merge-GlookoDatasets with $($ImportedData.Count) input objects"
    
    if ($ImportedData.Count -eq 0) {
        Write-Verbose "No data to merge, returning empty array"
        return @()
    }
    
    # Group by Dataset and OriginalFirstLine
    $grouped = $ImportedData | Group-Object -Property {
        "$($_.Metadata.Dataset)|$($_.Metadata.OriginalFirstLine)"
    }
    
    Write-Verbose "Grouped into $($grouped.Count) distinct groups"
    
    $results = foreach ($group in $grouped) {
        $items = $group.Group
        
        if ($items.Count -eq 1) {
            Write-Verbose "Group has single item, no merge needed"
            $items[0]
        } else {
            Write-Verbose "Merging $($items.Count) items in group"
            
            # Sort by Order (ascending) - items without Order will have $null and sort first
            $sortedItems = $items | Sort-Object { $_.Metadata.Order }
            
            # Use metadata from the first item (lowest order)
            $baseMetadata = $sortedItems[0].Metadata
            
            # Merge all data arrays in order
            $mergedData = @()
            foreach ($item in $sortedItems) {
                Write-Verbose "Adding $($item.Data.Count) rows from Order=$($item.Metadata.Order)"
                $mergedData += $item.Data
            }
            
            Write-Verbose "Merged total of $($mergedData.Count) data rows"
            
            # Return consolidated object with custom type
            $result = [PSCustomObject]@{
                Metadata = $baseMetadata
                Data     = $mergedData
            }
            $result.PSObject.TypeNames.Insert(0, 'Glooko.Dataset')
            
            $result
        }
    }
    
    Write-Verbose "Merge-GlookoDatasets completed, returning $($results.Count) objects"
    return $results
}