completions/psc/hooks.ps1

function handleCompletions($completions) {
    $list = @()

    $filter_input_arr = $PSCompletions.filter_input_arr
    if ($PSCompletions.config.enable_cache) {
        $PSCompletions.info = $PSCompletions.completions.psc.info
    }

    switch ($filter_input_arr[0]) {
        'add' {
            if ('*' -in $filter_input_arr) {
                break
            }
            $symbol = @()
            if ($filter_input_arr.Count -le 1) {
                $add = @()
                $rest = $PSCompletions.list.Where({ $_ -notin $PSCompletions.data.list })
            }
            else {
                $add = $filter_input_arr[1..($filter_input_arr.Count - 1)]
                $rest = $PSCompletions.list.Where({ $_ -notin $PSCompletions.data.list -and $_ -notin $add })
            }
            if ($rest.Count -gt 1) {
                $symbol = @('SpaceTab')
            }
            foreach ($completion in $rest) {
                $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.add.tip), $symbol)
            }
        }
        'rm' {
            if ('*' -in $filter_input_arr) {
                break
            }
            $symbol = @()
            if ($filter_input_arr.Count -le 1) {
                $rm = @()
                $rest = $PSCompletions.data.list
            }
            else {
                $rm = $filter_input_arr[1..($filter_input_arr.Count - 1)]
                $rest = $PSCompletions.data.list.Where({ $_ -notin $rm })
            }
            if ($rest.Count -gt 1) {
                $symbol = @('SpaceTab')
            }
            foreach ($completion in $rest) {
                $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.rm.tip), $symbol)
            }
        }
        'update' {
            if ('*' -in $filter_input_arr) {
                break
            }
            $symbol = @()
            if ($filter_input_arr.Count -le 1) {
                $update = @()
                $rest = $PSCompletions.update
            }
            else {
                $update = $filter_input_arr[1..($filter_input_arr.Count - 1)]
                $rest = $PSCompletions.update.Where({ $_ -notin $update })
            }
            if ($rest.Count -gt 1) {
                $symbol = @('SpaceTab')
            }
            foreach ($completion in $rest) {
                $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.update.tip), $symbol)
            }
        }
        'which' {
            if ('*' -in $filter_input_arr) {
                break
            }
            $symbol = @()
            if ($filter_input_arr.Count -le 1) {
                $which = @()
                $rest = $PSCompletions.data.list
            }
            else {
                $which = $filter_input_arr[1..($filter_input_arr.Count - 1)]
                $rest = $PSCompletions.data.list.Where({ $_ -notin $which })
            }
            if ($rest.Count -gt 1) {
                $symbol = @('SpaceTab')
            }
            foreach ($completion in $rest) {
                $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.which.tip), $symbol)
            }
        }
        'alias' {
            switch ($filter_input_arr[1]) {
                'add' {
                    if ($filter_input_arr.Count -eq 2) {
                        foreach ($completion in $PSCompletions.data.list) {
                            $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.alias.add.tip))
                        }
                    }
                }
                'rm' {
                    if ($filter_input_arr.Count -le 2) {
                        foreach ($completion in $PSCompletions.data.list) {
                            $symbol = @()
                            if ($PSCompletions.data.alias.$completion.Count -gt 1) {
                                $symbol = @('SpaceTab')
                            }
                            $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.alias.rm.tip), $symbol)
                        }
                    }
                    else {
                        $cmd = $filter_input_arr[2]
                        if ($filter_input_arr.Count -le 3) {
                            $alias = @()
                            $rest = $PSCompletions.data.alias.$cmd
                        }
                        else {
                            $alias = $filter_input_arr[3..($filter_input_arr.Count - 1)]
                            $rest = $PSCompletions.data.alias.$cmd.Where({ $_ -notin $alias })
                        }
                        if ($rest.Count -gt 2) {
                            $symbol = @('SpaceTab')
                        }
                        else {
                            $symbol = @()
                        }
                        foreach ($completion in $rest) {
                            $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.alias.rm.tip_v), $symbol)
                        }
                    }
                }
            }
        }
        'completion' {
            if ($filter_input_arr.Count -le 1) {
                foreach ($completion in $PSCompletions.data.list) {
                    $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.completion.tip), @('SpaceTab'))
                }
            }
            else {
                $completion = $filter_input_arr[1]

                $language = $PSCompletions.get_language($completion)
                $json = $PSCompletions.get_raw_content("$($PSCompletions.path.completions)/$($completion)/language/$($language).json") | ConvertFrom-Json

                switch ($filter_input_arr.Count) {
                    2 {
                        $list += $PSCompletions.return_completion("language", $PSCompletions.replace_content($PSCompletions.info.completion.language.tip), @('SpaceTab'))
                        $list += $PSCompletions.return_completion("enable_tip", $PSCompletions.replace_content($PSCompletions.info.completion.enable_tip.tip), @('SpaceTab'))

                        if ($PSCompletions.config.comp_config[$completion].Count) {
                            if ($PSCompletions.config.comp_config[$completion].keys.Contains('enable_hooks')) {
                                $tip = $PSCompletions.replace_content($PSCompletions.info.completion.enable_hooks.tip) -replace '<@\w+>', ''
                                $list += $PSCompletions.return_completion('enable_hooks', $tip, @('SpaceTab'))

                                $list += $PSCompletions.return_completion("enable_hooks_tip", $PSCompletions.replace_content($PSCompletions.info.completion.enable_hooks_tip.tip), @('SpaceTab'))
                            }
                        }
                        foreach ($c in $json.config) {
                            $config_item = $c.name
                            $tip = $PSCompletions.replace_content($c.tip -join "`n") -replace '<\@\w+>', ''
                            $symbol = @()
                            if ($c.values) {
                                $symbol = @('SpaceTab')
                            }
                            if ($filter_input_arr.Count -eq 2) {
                                $list += $PSCompletions.return_completion($c.name, $tip, $symbol)
                            }
                        }
                    }
                    3 {
                        switch ($filter_input_arr[2]) {
                            'language' {
                                $config = $PSCompletions.get_raw_content("$($PSCompletions.path.completions)/$($completion)/config.json") | ConvertFrom-Json
                                foreach ($language in $config.language) {
                                    $list += $PSCompletions.return_completion($language, $PSCompletions.replace_content($PSCompletions.info.completion.language.tip_v))
                                }
                            }
                            { $_ -in 'enable_tip', 'enable_hooks', 'enable_hooks_tip' } {
                                foreach ($value in 0..1) {
                                    $list += $PSCompletions.return_completion($value, $PSCompletions.replace_content($PSCompletions.info.set_value))
                                }
                            }
                            Default {
                                $c = $json.config.Where({ $_.name -eq $filter_input_arr[2] })
                                foreach ($value in $c.values) {
                                    $list += $PSCompletions.return_completion($value, $PSCompletions.replace_content($PSCompletions.info.set_value))
                                }
                            }
                        }
                    }
                }
            }
        }
        'menu' {
            if ($filter_input_arr.Count -eq 4 -and $filter_input_arr[1] -eq 'custom' -and $filter_input_arr[2] -eq 'color' -and $filter_input_arr[3] -in $PSCompletions.menu.const.color_item) {
                foreach ($color in $PSCompletions.menu.const.color_value) {
                    $list += $PSCompletions.return_completion($color, $PSCompletions.replace_content($PSCompletions.info.menu.custom.color.tip))
                }
            }
        }
        'reset' {
            if ('*' -in $filter_input_arr) {
                break
            }
            switch ($filter_input_arr[1]) {
                'alias' {
                    $symbol = @()
                    if ($filter_input_arr.Count -le 1) {
                        $reset = @()
                        $rest = $PSCompletions.data.list
                    }
                    else {
                        $reset = $filter_input_arr[1..($filter_input_arr.Count - 1)]
                        $rest = $PSCompletions.data.list.Where({ $_ -notin $reset })
                    }
                    if ($rest.Count -gt 1) {
                        $symbol = @('SpaceTab')
                    }
                    foreach ($completion in $rest) {
                        $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.reset.alias.tip), $symbol)
                    }
                }
                'completion' {
                    if ($filter_input_arr.Count -eq 2) {
                        foreach ($completion in $PSCompletions.data.list) {
                            if ($PSCompletions.data.config.comp_config[$completion].Keys) {
                                $symbol = @('SpaceTab')
                            }
                            else {
                                $symbol = @()
                            }
                            $list += $PSCompletions.return_completion($completion, $PSCompletions.replace_content($PSCompletions.info.reset.completion.tip), $symbol )
                        }
                    }
                    if ($filter_input_arr.Count -ge 3) {
                        $selected = $filter_input_arr[3, ($filter_input_arr.Count - 1)]
                        $completion = $filter_input_arr[2]
                        $add = @()
                        if ($PSCompletions.data.config.comp_config[$completion].Keys) {
                            foreach ($config_item in $PSCompletions.data.config.comp_config.$completion.Keys) {
                                if ($config_item -notin $selected) {
                                    $add += $config_item
                                }
                            }
                            $symbol = if ($add.Count -gt 1) { @('SpaceTab') }else { , @() }
                            foreach ($config_item in $add) {
                                $list += $PSCompletions.return_completion($config_item, $PSCompletions.replace_content($PSCompletions.info.reset.completion.tip_v), $symbol)
                            }
                        }
                    }
                }
            }
        }
        Default {
            return $completions
        }
    }
    return $completions + $list
}