#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' 'analyze' 'repo' 'info' 'content' 'prune'
            )
            _values 'subcommand' $subcmds
            ;;
        args)
            case $words[1] in
                run)
                    _arguments -S -s $global_opts \
                        '--file' '--url' '--env' '--base' '--runtime' '--extensions' \
                        '--workdir' '--enable-xdp' '--disable-xdp' '--enable-pipewire' \
                        '--enable-atspi' '--cdi-spec-dir' '--device' \
                        '--device-mode:mode:(passthru)' '--instance' '--debug' \
                        '--debug-listen' '--debug-debuginfod' '--debug-symbol-dir' \
                        '1: :__ll_cli_get_installed_apps'
                    ;;
                ps)
                    _arguments -S -s $global_opts '--no-truncated'
                    ;;
                install)
                    _arguments -S -s $global_opts \
                        '--module' '--repo' '--force' '-y' '--no-auto-prune' \
                        '*:file:_files -g "*.uab *.layer"'
                    ;;
                uninstall)
                    _arguments -S -s $global_opts '--module' '--force' '--no-auto-prune' '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 | disable-mirror | update)
                                _arguments -S -s $global_opts "*: :__ll_cli_get_repo_aliases"
                                ;;
                            enable-mirror)
                                _arguments -S -s $global_opts '--region' "*: :__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 '--deps-only' '--no-auto-prune' '1: :__ll_cli_get_installed_apps'
                    ;;
                analyze)
                    if ((CURRENT == 2)); then
                        local -a analyze_subs
                        analyze_subs=('size' 'depends')
                        _values 'analyze subcommand' $analyze_subs
                    else
                        case $words[2] in
                            size)
                                if [[ $words[CURRENT-1] == "--sort" ]]; then
                                    compadd -- actual logical exclusive shared id
                                else
                                    compadd -- --sort --asc \
                                        --help --help-all --json --verbose -v --no-progress
                                fi
                                ;;
                            depends)
                                local -a all_items
                                all_items=(${(f)"$(ll-cli list 2>/dev/null | awk 'NR>1 {print $1}')"})
                                compadd -- --help --help-all --json --verbose -v --no-progress
                                compadd -- $all_items
                                ;;
                        esac
                    fi
                    ;;
                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 "$@"
