PsBananaUtils.Windows.psm1

. "$PSScriptRoot\Public\Find-Process.ps1"
. "$PSScriptRoot\Public\Get-NetAdaptersInfo.ps1"
. "$PSScriptRoot\Public\New-Directory.ps1"
. "$PSScriptRoot\Public\New-File.ps1"
. "$PSScriptRoot\Public\New-Junction.ps1"
. "$PSScriptRoot\Public\New-Symlink.ps1"

$script:SettingUpCompletionForHyperVManager = {
    param($InherithFrom, $ExcludeProps, $commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)

    $already = @()
    if ($fakeBoundParameters.ContainsKey("Property")) {
        $already = $fakeBoundParameters["Property"] -split ","
    }

    $props = Get-Command -name Invoke-Command | Get-Member -MemberType Properties | Select-Object -Expand Name -Unique

    $props = $props |
    Where-Object { $_ -notin $ExcludedProps } |
    Where-Object { $_ -notin $already } |
    Where-Object { $_ -like "$wordToComplete*" }

    foreach ($p in $props) {
        [System.Management.Automation.CompletionResult]::new($p, $p, 'ParameterValue', $p)
    }
}

Register-ArgumentCompleter -CommandName New-Symlink -ParameterName Property -ScriptBlock {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)

    $ExcludedProps = @("ItemType")

    & $script:SettingUpCompletionForHyperVManager `
        -InherithFrom New-Item `
        -ExcludedProps $ExcludedProps `
        -commandName $commandName `
        -parameterName $parameterName `
        -wordToComplete $wordToComplete `
        -commandAst $commandAst `
        -fakeBoundParameters $fakeBoundParameters
}

Register-ArgumentCompleter -CommandName New-Junction -ParameterName Property -ScriptBlock {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)

    $ExcludedProps = @("ItemType")

    & $script:SettingUpCompletionForHyperVManager `
        -InherithFrom New-Item `
        -ExcludedProps $ExcludedProps `
        -commandName $commandName `
        -parameterName $parameterName `
        -wordToComplete $wordToComplete `
        -commandAst $commandAst `
        -fakeBoundParameters $fakeBoundParameters
}

Register-ArgumentCompleter -CommandName New-File -ParameterName Property -ScriptBlock {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)

    $ExcludedProps = @("ItemType")

    & $script:SettingUpCompletionForHyperVManager `
        -InherithFrom New-Item `
        -ExcludedProps $ExcludedProps `
        -commandName $commandName `
        -parameterName $parameterName `
        -wordToComplete $wordToComplete `
        -commandAst $commandAst `
        -fakeBoundParameters $fakeBoundParameters
}

Register-ArgumentCompleter -CommandName New-Directory -ParameterName Property -ScriptBlock {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
    $ExcludedProps = @("ItemType")
    & $script:SettingUpCompletionForHyperVManager `
        -InherithFrom New-Item `
        -ExcludedProps $ExcludedProps `
        -commandName $commandName `
        -parameterName $parameterName `
        -wordToComplete $wordToComplete `
        -commandAst $commandAst `
        -fakeBoundParameters $fakeBoundParameters
}

Set-Alias -Name touch -Value New-File
Set-Alias -Name ln -Value New-Symlink
Set-Alias -Name jn -Value New-Junction

Export-ModuleMember -Function (Get-ChildItem "$PSScriptRoot\Public\*.ps1" -Recurse | ForEach-Object { $_.BaseName }) `
    -Alias touch, ln, jn