#compdef ll-cli

# SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd.
# SPDX-License-Identifier: LGPL-3.0-or-later

__ll_cli_get_containers() {
    local -a containers
    containers=(${(f)"$(ll-cli ps 2>/dev/null | awk 'NR>1 {print $1}')"})
    _describe 'container' containers
}

__ll_cli_get_installed_apps() {
    local -a apps
    apps=(${(f)"$(ll-cli list --type=app 2>/dev/null | awk 'NR>1 {print $1}')"})
    _describe 'app' apps
}

__ll_cli_get_installed_all() {
    local -a all_items
    all_items=(${(f)"$(ll-cli list 2>/dev/null | awk 'NR>1 {print $1}')"})
    _describe 'item' all_items
}

__ll_cli_get_repo_aliases() {
    local -a aliases
    aliases=(${(f)"$(ll-cli repo show 2>/dev/null | awk 'NR>2 {print $3}')"})
    _describe 'alias' aliases
}

_ll_cli() {
    local state

    local -a global_opts
    global_opts=(
        '--help' '--help-all' '--json'
        '(--verbose -v)'{--verbose,-v} '--no-progress'
    )

    _arguments -S -s -C \
        $global_opts \
        '--version' \
        '1: :->cmds' \
        '*:: :->args'

    case $state in
        cmds)
            local -a subcmds
            subcmds=(
                'run' 'ps' 'enter' 'kill' 'install' 'uninstall'
                'upgrade' 'search' 'list' 'repo' 'info' 'content' 'prune'
            )
            _values 'subcommand' $subcmds
            ;;
        args)
            case $words[1] in
                run)
                    _arguments -S -s $global_opts \
                        '--file' '--url' '--env' '--base' '--runtime' '--extensions' \
                        '1: :__ll_cli_get_installed_apps'
                    ;;
                install)
                    _arguments -S -s $global_opts \
                        '--module' '--repo' '--force' '-y' \
                        '*:file:_files -g "*.uab *.layer"'
                    ;;
                uninstall)
                    _arguments -S -s $global_opts '--module' '--force' '1: :__ll_cli_get_installed_apps'
                    ;;
                repo)
                    if ((CURRENT == 2)); then
                        local -a repo_subs
                        repo_subs=('add' 'remove' 'update' 'set-default' 'show' 'set-priority' 'enable-mirror' 'disable-mirror')
                        _values 'repo subcommand' $repo_subs
                    else
                        case $words[2] in
                            add)
                                _arguments -S -s $global_opts \
                                    '--alias:alias: ' \
                                    '*:repository name/URL:'
                                ;;
                            remove | set-default | set-priority | enable-mirror | disable-mirror | update)
                                _arguments -S -s $global_opts "*: :__ll_cli_get_repo_aliases"
                                ;;
                        esac
                    fi
                    ;;
                enter | kill)
                    local -a extra_args
                    [[ $words[1] == "kill" ]] && extra_args=('(-s --signal)'{-s,--signal}':signal:(SIGTERM SIGKILL SIGINT SIGHUP)')
                    _arguments -S -s $global_opts $extra_args '1: :__ll_cli_get_containers'
                    ;;
                search)
                    _arguments -S -s $global_opts \
                        '--type:type:(runtime base app all)' \
                        '--repo' '--dev' '--show-all-version'
                    ;;
                list)
                    _arguments -S -s $global_opts \
                        '--type:type:(runtime base app all)' \
                        '--upgradable'
                    ;;
                upgrade)
                    _arguments -S -s $global_opts '1: :__ll_cli_get_installed_apps'
                    ;;
                info)
                    _arguments -s -S $global_opts \
                        '1: : _alternative "installed-items:installed item:__ll_cli_get_installed_all" "layer-files:local layer file:_files -g \"*.layer\""'
                    ;;
                content)
                    _arguments -s -S $global_opts '1: :__ll_cli_get_installed_all'
                    ;;
                prune)
                    _arguments -S -s $global_opts
                    ;;
            esac
            ;;
    esac
}

_ll_cli "$@"
