#compdef cdist

_cdist()
{
    local curcontext="$curcontext" state line
    typeset -A opt_args

    _arguments \
        '1: :->opts_cmds'\
        '*: :->opts'

    case $state in
        opts_cmds)
            _arguments '1:Options and commands:(banner config install inventory shell -h --help -q --quiet -v --verbose -V --version)'
            ;;
        *)
            case $words[2] in
                -*)
                    opts=(-h --help -q --quiet -v --verbose -V --version)
                    compadd "$@" -- $opts
                    ;;
                banner)
                    opts=(-h --help -q --quiet -v --verbose)
                    compadd "$@" -- $opts
                    ;;
                shell)
                    case $words[3] in
                        -s|--shell)
                            shells=($(grep -v '^#' /etc/shells))
                            compadd "$@" -- $shells
                            ;;
                        *)
                            opts=(-h --help -q --quiet -v --verbose -s --shell)
                            compadd "$@" -- $opts
                            ;;
                    esac
                    ;;
                config|install)
                    opts=(-h --help -q --quiet -v --verbose -a --all -b --beta -C --cache-path-pattern -c --conf-dir -f --file -i --initial-manifest -j --jobs -n --dry-run -o --out-dir -p --parallel -r --remote-out-dir -s --sequential --remote-copy --remote-exec -t --tag -I --inventory -A --all-tagged)
                    compadd "$@" -- $opts
                    ;;
                inventory)
                    case $words[3] in
                        list)
                            opts=(-h --help -q --quiet -v --verbose -b --beta -I --inventory -a --all -f --file -H --host-only -t --tag)
                            compadd "$@" -- $opts
                            ;;
                        add-host)
                            opts=(-h --help -q --quiet -v --verbose -b --beta -I --inventory -f --file)
                            compadd "$@" -- $opts
                            ;;
                        del-host)
                            opts=(-h --help -q --quiet -v --verbose -b --beta -I --inventory -a --all -f --file)
                            compadd "$@" -- $opts
                            ;;
                        add-tag)
                            opts=(-h --help -q --quiet -v --verbose -b --beta -I --inventory -f --file -T --tag-file -t --taglist)
                            compadd "$@" -- $opts
                            ;;
                        del-tag)
                            opts=(-h --help -q --quiet -v --verbose -b --beta -I --inventory -a --all -f --file -T --tag-file -t --taglist)
                            compadd "$@" -- $opts
                            ;;
                        *)
                            cmds=(list add-host del-host add-tag del-tag)
                            opts=(-h --help -q --quiet -v --verbose)
                            compadd "$@" -- $cmds $opts
                            ;;
                    esac
                    ;;
                *)
                    ;;
            esac
    esac
}

_cdist "$@"