param([ValidateSet('KB','GB','TB')]$SizeUnitName = 'GB',[switch]$NoFilter,[switch]$PassThru)
$local:zpool_cmd =  $null
$local:excludeType = ''

$script:SizeUnit = Invoke-Expression "1$SizeUnitName"
$script:SizeRound = 2
$SizeUnit /= 1KB

function NewDataRow{param($Size,$Used,$Available,$Percent,$Source,$FSType,$Target)
    [PSCustomObject]@{
        "Size$SizeUnitName"      = [Math]::Round($Size     /$SizeUnit, $SizeRound)
        "Used$SizeUnitName"      = [Math]::Round($Used     /$SizeUnit, $SizeRound)
        "Available$SizeUnitName" = [Math]::Round($Available/$SizeUnit, $SizeRound)
        'Used%'                  = [int]($Percent -replace '%$','')
        Source                   = $Source
        FSType                   = $FSType
        Target                   = $Target
        SourceLevel              = $(if($Source[0] -eq '/') { 1 } else {0}) + $Source.Split('/').Count - 1
        TargetLevel              = $(if($Target[0] -eq '/') { 1 } else {0}) + $Target.Split('/').Count - 1
        Group                    = $(switch( $FSType ) { 'zfs' { "$FSType`:$($Source.Split('/')[0])" } 'cifs' { "$FSType`:$($Source.Split('/')[2])" } default { $Source }} )
    }
}

Set-Alias Out-Default Format-Table
if( $PassThru ) {
    Get-Item alias:/Out-Default | Remove-Item
}

$local:filterParam = [ordered]@{}
if( -not $NoFilter ) { $filterParam.First = 1 }
$local:df = @()

$(
    & df '--output=size,used,avail,pcent,source,fstype,target' |
        Select-Object -Skip 1 | ForEach-Object {
            $local:df = $_.Split(' ', [StringSplitOptions]::RemoveEmptyEntries)
            NewDataRow $df[0] $df[1] $df[2] $df[3] $df[4] $df[5] $df[6]
        } |
        Sort-Object -Property FSType,Target |
        Group-Object -Property FSType |
        ForEach-Object {
            if( $_.Name -eq 'zfs' ) {
                $_.Group |
                    Group-Object -Property Group |
                    ForEach-Object {
                        $_.Group | Sort-Object -Property Source | Select-Object @filterParam
                    }
            }
            else { $_.Group }
        } |
        Select-Object -Property "Size$SizeUnitName","Used$SizeUnitName","Available$SizeUnitName",'Used%',Source,FSType,Target
) |
    Out-Default