#compdef zplugin zpl zplg

local context state state_descr line ret=1
typeset -A opt_args

typeset -a commands
commands=(
    help:'usage information'
    load:'load plugin'
    unload:'unload plugin'
    report:'show plugin'"'"'s report'
    all-reports:'show all plugin reports'
    loaded:'show what plugins are loaded'
    list:'show what plugins are loaded'
    comp:'list completions in use'
    completions:'list completions in use'
    cdisable:'disable completion'
    cenable:'enable completion'
    creinstall:'install completions for plugin'
    cuninstall:'uninstall completions for plugin'
    compinit:'refresh installed completions'
)

_arguments \
    '1: :->command'\
    '*: :->argument' && ret=0

case $state in
    command)
        _describe -t commands "Zplugin command" commands && ret=0
        ;;
    argument)
        case $words[2] in
            help)
                ret=0
                ;;
            load)
                ret=0
                ;;
            unload)
                compadd "$@" -a - ZPLG_REGISTERED_PLUGINS && ret=0
                ;;
            report)
                compadd "$@" -a - ZPLG_REGISTERED_PLUGINS && ret=0
                ;;
            all-reports)
                ret=0
                ;;
            loaded|list)
                ret=0
                ;;
            comp|completions)
                ret=0
                ;;
            cdisable)
                # Find enabled completions
                typeset -a completions
                completions=( ~/.zplugin/completions/_*(N:t) )
                completions=( "${completions[@]#_}" )
                compadd "$@" -a - completions && ret=0
                ;;
            cenable)
                # Find disabled
                typeset -a completions
                completions=( ~/.zplugin/completions/[^_]*(N:t) )
                compadd "$@" -a - completions && ret=0
                ;;
            creinstall)
                # Complete only plugins that have any completions
                # We must iterate each plugin to check
                # for completions that can be installed
                typeset -a plugins completions
                local p c user plugin
                for p in "${ZPLG_PLUGINS_DIR[@]}"/*; do
                    completions=( "$p"/_*(N) )
                    for c in "${completions[@]}"; do
                        p="${p:t}"
                        user="${p%%---*}"
                        plugin="${p#*---}"
                        plugins+=( "$user/$plugin" )
                        break
                    done
                done
                compadd "$@" -a - plugins && ret=0
                ;;
            cuninstall)
                # We must iterate each plugin and check if
                # it has completions that are installed
                typeset -a plugins completions
                local p c user plugin
                for p in "${ZPLG_PLUGINS_DIR[@]}"/*; do
                    completions=( "$p"/_*(N) )
                    for c in "${completions[@]}"; do
                        cfile="${c:t}"
                        bkpfile="${cfile#_}"
                        # Completion installed, either enabled or disabled?
                        if [[ -e "$ZPLG_COMPLETIONS_DIR"/"$cfile" || -e "$ZPLG_COMPLETIONS_DIR"/"$bkpfile" ]]; then
                            p="${p:t}"
                            user="${p%%---*}"
                            plugin="${p#*---}"
                            plugins+=( "$user/$plugin" )
                            break
                        fi
                    done
                done
                compadd "$@" -a - plugins && ret=0
                ;;
            compinit)
                ret=0
                ;;
            *)
                ret=1
                ;;
        esac
esac

return "$ret"
