src/completers.ps1


function doComplete ($completerArgs, $endPoint, $type, $clusterParam) {
    $commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters = $completerArgs
    $session, $cluster = defineSessionAndCluster
    switch ($type) {
        'name' { completeName }
        'prop' { completeProp }
        'filter' { completeFilter }
        default { 
            Write-Host "`nWrong type $type of completer in $commandName - $parameterName" -ForegroundColor Red 
        }
    }
}
function fillFunc ($funcStr, $completerArgs, $fakeArg) {
    $commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters = $completerArgs
        # invoke given function
        # & (Get-ChildItem ('Function:' + $funcStr))
        try {
            if($fakeArg){
                &($funcStr) ($fakeBoundParameters."$fakeArg")
            }else{
                &($funcStr) 
            }
        } catch {
            Write-Host "`nWrong function $funcStr of completer in $commandName - $parameterName" -ForegroundColor Red 
        }
}

function completeRSnapSets ($RPsessionName) {
    $extraProps = 'protection-session-id='+$RPsessionName
    $endPoint = 'r-snapshot-sets'
    $session, $cluster = defineSessionAndCluster
    completeName
}

function completeEntityName ($completerArgs, $paramName) {
    $commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters = $completerArgs
    $selectedEntity = $fakeBoundParameters."$paramName"
    
    $endPoint = switch ($selectedEntity) {
        'Volume' { 'volumes' }
        'ConsistencyGroup' { 'consistency-groups' }
        'Snapshot' { 'snapshots' }
        'SnapshotSet' { 'snapshot-sets' }
        'SnapSet' { 'snapshot-sets' }
        'InitiatorGroup' { 'initiator-groups' }
        'Initiator' { 'initiators' }
        default { 
            Write-Host "`nWrong type $paramName of completer in $commandName - $parameterName" -ForegroundColor Red 
        }
    }

    $session, $cluster = defineSessionAndCluster
    completeName
    
}
# xmsInitiatorGroupCreate


function completeName() {
    $props = 'prop=name'
    if ($extraProps){
        $props = 'prop=name'+'&'+$extraProps
    }

    if ($wordToComplete) {
        $filter = "name:like:" + $wordToComplete
        # $vals = (Invoke-XtremGetRequest "/types/$endPoint" name -filter $filter).name
        $vals = (NewXtremRequest -Method GET -Session $session -XtremClusterName $cluster -Endpoint "/types/$endPoint" -Properties name -GetProperty $extraProps -Filters $filter).name
    } else {
        $vals = getCachedResourse ("/types/$endPoint") $props 7
    }
    if (!$vals) { return '' }
    $vals = ($vals | where { $_ -ne '' })
    
    $vals = removeEntredVals $commandAst $vals
    if (!$vals) { return '' }
    
    [array]::Reverse($vals)
    $vals = sortLastUsedFirst $vals

    $vals | Where-Object { $_ -like "$wordToComplete*" }
}
function completeProp() {
    $aVol = getCachedResourse ("/types/$endPoint/1") 'full=1' 999
    if (!$aVol) { return '' }
    
    $vals = [System.Collections.ArrayList]@()

    $currValueArr = ($commandAst -replace ".+ ", '') -split ','

    foreach ($p in $aVol.PSObject.Properties) {
        if ($currValueArr -contains $p.Name) {
            continue
        }
        [void]$vals.Add($p.Name)
    }
    if (!$vals) { return '' }

    $vals = sortLastUsedFirst $vals

    $vals | Where-Object { $_ -like "$wordToComplete*" }
}

function completeFilter() {
    $wtc1, $wtc2, $wtc3 = $wordToComplete -split ':'
    $vals = [System.Collections.ArrayList]@()

    if ($wtc3 -or $wordToComplete -match ".+:.+:.*") {
        return $wordToComplete
    }
    elseif ($wordToComplete -notlike "*:*") {
        # first part of filter "first:second:third"
        $aVol = getCachedResourse ("/types/$endPoint/1") 'full=1' 999
        if (!$aVol) { return '' }
        foreach ($p in $aVol.PSObject.Properties) {
            [void]$vals.Add($p.Name)
        }
        if (!$vals) { return '' }
        $vals = addLastUsedPropsAndFilters $vals
        $vals += '*:like:*', '*:eq:*' , '*:lt:*', '*:le:*', '*:gt:*', '*:ge:*'
    }
    elseif ($wtc1 -and $wordToComplete -like "*:*") {
        # second part of filter
        $vals = "$wtc1`:like", "$wtc1`:eq", "$wtc1`:lt", "$wtc1`:le", "$wtc1`:gt", "$wtc1`:ge"
        $vals = addLastUsedPropsAndFilters $vals 'second'
    }

    $vals | Where-Object { $_ -like "$wordToComplete*" }
}

function completeClusterName{
    $vals = getAllClustersList
    if (!$vals) { return '' }
    
    $vals = removeEntredVals $commandAst $vals
    if (!$vals) { return '' }
    
    $vals = sortLastUsedFirst $vals

    $vals | Where-Object { $_ -like "$wordToComplete*" }
}

function completeSessionClusters {
    if ($XtremDefaultSessionObject) {
        $vals = $XtremDefaultSessionObject._XtremClustersTable.psobject.properties.value
        $vals = removeCurrentClusterName($vals)

        if ($vals) {
            $vals | Where-Object {
                $_ -like "$wordToComplete*"
            }
        }
    }
    else {
        ''
    }
}

# function invokeCompleter () {
# ' '; (New-Object -ComObject wscript.shell).SendKeys('{backspace}{tab}')
# }

function completeSessions {
    $vals = readSessionsTo('keys')
    if ($vals -and ($commandName -eq 'Select-XtremSession')) {
        $vals = removeCurrentSessionName($vals)
    }

    if (!$vals) {
        return "`nNo sessions. Please call New-XtremSession command to create one."
    }
    else {
        $vals | Where-Object {
            $_ -like "$wordToComplete*"
        }
    }
}