#compdef gita

__gita_get_repos() {
    local -a repositories
    repositories=($(_call_program commands gita ls))
    _describe -t repositories 'gita repositories' repositories
}

__gita_get_context() {
    local -a context
    context=(
        "auto"
        "none"
    )
    _describe -t context 'gita context' context
    __gita_get_groups
}

__gita_get_infos() {
    local -a all_infos infos_in_used infos_unused
    all_infos=($(_call_program commands gita info ll | cut -d ":" -f2))
    infos_in_used=($(echo ${all_infos[1]} | tr ',' ' '))
    infos_unused=($(echo ${all_infos[2]} | tr ',' ' '))
    _describe -t infos_used 'gita infos in used' infos_in_used
    _describe -t infos_unused 'gita infos unused' infos_unused
}

__gita_get_groups() {
    local -a groups

    groups=($(_call_program commands gita group ls))
    _describe -t groups 'gita groups' groups
}

__gita_commands() {
    local -a commands
    commands=(
        'add:Add repo(s)'
        'rm:remove repo(s)'
        'freeze:Print all repo information'
        'clone:Clone repos'
        'rename:Rename a repo'
        'flags:Git flags configuration'
        'color:Color configuration'
        'info:Information setting'
        'll:Display summary of all repos'
        'context:Set context'
        'ls:Show repo(s) or repo path'
        'group:Group repos'
        'super:Run any git command/alias'
        'shell:Run any shell command'
        'clear:Removes all groups and repositories'
    )
    _describe -t commands 'gita sub-commands' commands
}

# FUNCTION: _gita_add [[[
_gita_add() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        '(-n --dry-run)'{-n,--dry-run}'[dry run]' \
        '(-g --group)'{-g=,--group=}'[add repo(s) to the specified group]:Gita groups:__gita_get_groups' \
        '(-s --skip-modules)'{-s,--skip-modules}'[skip submodule repo(s)]' \
        '(-r --recursive)'{-r,--recursive}'[recursively add repo(s) in the given path(s)]' \
        '(-a --auto-group)'{-a,--auto-group}'[recursively add repo(s) in the given path(s) and create hierarchical groups based on folder structure]' \
        '(-b --bare)'{-b,--bare}'[add bare repo(s)]' \
        "(-h --help -)*:Directories:_directories"
    ret=0
}
#]]]

# FUNCTION: _gita_rm [[[
_gita_rm() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        "(-h --help -)*:gita repositories:__gita_get_repos" &&
        ret=0
}
#]]]

# FUNCTION: _gita_freeze [[[
_gita_freeze() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        '(-g --group)'{-g=,--group=}'[freeze repos in the specified group]:Gita groups:__gita_get_groups' &&
        ret=0
}
#]]]

# FUNCTION: _gita_clone [[[
_gita_clone() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        '(-C --directory)'{-C=,--directory=}'[ Change to DIRECTORY before doing anything]:Directories:_directories' \
        '(-p --preserve-path)'{-p,--preserve-path}'[clone repo(s) in their original paths]' \
        '(-n --dry-run)'{-n,--dry-run}'[dry run]' \
        '(-g --group)'{-g=,--group=}'[If set, add repo to the specified group after cloning, otherwise add to gita without group]:Gita groups:__gita_get_groups' \
        '(-f --from-file)'{-f=,--from-file=}'[ If set, clone repos in a config file rendered from `gita freeze`]:File:_path_files' &&
        ret=0
}
#]]]

# FUNCTION: _gita_rename [[[
_gita_rename() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        "(-h --help -):Gita repositories:__gita_get_repos" &&
        ret=0
}
#]]]

# FUNCTION: _gita_flags_commands[[[
_gita_flags_commands() {

    local -a subcommands
    subcommands=(
        'll:Display repos with custom flags'
        'set:Set flags for repo'
    )
    _describe -t subcommands 'gita flag sub-commands' subcommands
}
#]]]

# FUNCTION: _gita_flags_ll [[[
_gita_flags_ll() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' &&
        ret=0
}
#]]]

# FUNCTION: _gita_flags_set [[[
_gita_flags_set() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        "(-h --help -):Gita repositories:__gita_get_repos" &&
        ret=0
}
#]]]

# FUNCTION: _gita_flags[[[
_gita_flags() {
    local curcontext="$curcontext" state state_descr line expl
    local tmp ret=1
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]'

    _arguments -C \
        "1: :->cmds" \
        "*::arg:->args"
    case "$state" in
    cmds)
        _gita_flags_commands && return 0
        ;;
    args)
        local cmd="${line[1]}"
        curcontext="${curcontext%:*}-${cmd}:${curcontext##*:}"
        local completion_func="_gita_flags_${cmd//-/_}"
        _call_function ret "${completion_func}" && return ret
        _message "a completion function is not defined for command or alias: ${cmd}"
        return 1
        ;;
    esac
}
#]]]

# FUNCTION: _gita_color_commands[[[
_gita_color_commands() {

    local -a subcommands
    subcommands=(
        'll:Display available colors and the current branch coloring in the ll sub-command'
        'set:Set color for local/remote situation'
        'reset:Reset color scheme'
    )
    _describe -t subcommands 'gita color sub-commands' subcommands
}
#]]]

# FUNCTION: _gita_color_ll [[[
_gita_color_ll() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' &&
        ret=0
}
#]]]

# FUNCTION: _gita_color_set [[[
_gita_color_set() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' &&
        ret=0
}
#]]]

# FUNCTION: _gita_color_reset [[[
_gita_color_reset() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' &&
        ret=0
}
#]]]

# FUNCTION: _gita_color[[[
_gita_color() {
    local curcontext="$curcontext" state state_descr line expl
    local tmp ret=1
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]'

    _arguments -C \
        "1: :->cmds" \
        "*::arg:->args"
    case "$state" in
    cmds)
        _gita_color_commands && return 0
        ;;
    args)
        local cmd="${line[1]}"
        curcontext="${curcontext%:*}-${cmd}:${curcontext##*:}"
        local completion_func="_gita_color_${cmd//-/_}"
        _call_function ret "${completion_func}" && return ret
        _message "a completion function is not defined for command or alias: ${cmd}"
        return 1
        ;;
    esac
}
#]]]

# FUNCTION: _gita_info_commands[[[
_gita_info_commands() {

    local -a subcommands
    subcommands=(
        'll:Show used and unused information items of the ll sub-command'
        'add:Enable information item'
        'rm:Disable information item'
    )
    _describe -t subcommands 'gita info sub-commands' subcommands
}
#]]]

# FUNCTION: _gita_info_ll [[[
_gita_info_ll() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' &&
        ret=0
}
#]]]

# FUNCTION: _gita_info_add [[[
_gita_info_add() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        "(-h --help -):Gita infos:__gita_get_infos" &&
        ret=0
}
#]]]

# FUNCTION: _gita_info_rm [[[
_gita_info_rm() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        "(-h --help -):Gita infos:__gita_get_infos" &&
        ret=0
}
#]]]

# FUNCTION: _gita_info[[[
_gita_info() {
    local curcontext="$curcontext" state state_descr line expl
    local tmp ret=1
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]'

    _arguments -C \
        "1: :->cmds" \
        "*::arg:->args"
    case "$state" in
    cmds)
        _gita_info_commands && return 0
        ;;
    args)
        local cmd="${line[1]}"
        curcontext="${curcontext%:*}-${cmd}:${curcontext##*:}"
        local completion_func="_gita_info_${cmd//-/_}"
        _call_function ret "${completion_func}" && return ret
        _message "a completion function is not defined for command or alias: ${cmd}"
        return 1
        ;;
    esac
}
#]]]

# FUNCTION: _gita_ll [[[
_gita_ll() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        '(-C --no-colors)'{-C,--no-colors}'[Disable coloring on the branch names]' \
        '(-g)'-g'[Show repo summaries by group]' \
        "(-h --help -):Groups name:__gita_get_groups" &&
        ret=0
}
#]]]

# FUNCTION: _gita_context [[[
_gita_context() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        "(-h --help -):Gita context:__gita_get_context" &&
        ret=0
}
#]]]

# FUNCTION: _gita_ls [[[
_gita_ls() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        "(-h --help -):Gita repositories:__gita_get_repos" &&
        ret=0
}
#]]]

# FUNCTION: _gita_group_commands[[[
_gita_group_commands() {

    local -a subcommands
    subcommands=(
        'll:List all groups with repos.'
        'ls:List all group names'
        'add:Add repo(s) to a group'
        'rmrepo:remove repo(s) from a group'
        'rename:Change group name'
        'rm:Remove group(s)'
    )
    _describe -t subcommands 'gita group sub-commands' subcommands
}
#]]]

# FUNCTION: _gita_group_ll [[[
_gita_group_ll() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        "(-h --help -):Groups name:__gita_get_groups" &&
        ret=0
}
#]]]

# FUNCTION: _gita_group_ls [[[
_gita_group_ls() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' &&
        ret=0
}
#]]]

# FUNCTION: _gita_group_add [[[
_gita_group_add() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        '(-n --name)'{-n=,--name=}'[group-name,]:Groups name:__gita_get_groups' \
        '(-p --path)'{-p=,--path=}'[group-path]:Group path:_directories' \
        "(-h --help -)*:Gita repositories:__gita_get_repos" &&
        ret=0
}
#]]]

# FUNCTION: _gita_group_rmrepo [[[
_gita_group_rmrepo() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        '(-n --name)'{-n=,--name=}'[group-name,]:Groups name:__gita_get_groups' \
        "(-h --help -)*:Gita repositories:__gita_get_repos" &&
        ret=0
}
#]]]

# FUNCTION: _gita_group_rename [[[
_gita_group_rename() {
    _arguments -A \
        '(-h --help -)'{-h,--help}'[show this help message and exit]' &&
        ret=0
}
#]]]

# FUNCTION: _gita_group_rm [[[
_gita_group_rm() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        "(-h --help -)*:Groups name:__gita_get_groups" &&
        ret=0
}
#]]]

# FUNCTION: _gita_group[[[
_gita_group() {
    local curcontext="$curcontext" state state_descr line expl
    local tmp ret=1
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]'

    _arguments -C \
        "1: :->cmds" \
        "*::arg:->args"
    case "$state" in
    cmds)
        _gita_group_commands && return 0
        ;;
    args)
        local cmd="${line[1]}"
        curcontext="${curcontext%:*}-${cmd}:${curcontext##*:}"
        local completion_func="_gita_group_${cmd//-/_}"
        _call_function ret "${completion_func}" && return ret
        _message "a completion function is not defined for command or alias: ${cmd}"
        return 1
        ;;
    esac
}
#]]]

# FUNCTION: _gita_super [[[
_gita_super() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        '(-q --quote-mode)'{-q,--quote-mode}'[use quote mode]' &&
        ret=0
}
#]]]

# FUNCTION: _gita_shell [[[
_gita_shell() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        '(-q --quote-mode)'{-q,--quote-mode}'[use quote mode]' &&
        ret=0
}
#]]]

# FUNCTION: _gita_clear [[[
_gita_clear() {
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' &&
        ret=0
}
#]]]

# FUNCTION: _gita [[[
_gita() {
    local curcontext="$curcontext" state state_descr line expl
    local tmp ret=1
    _arguments -A \
        '(-h --help)'{-h,--help}'[show this help message and exit]' \
        '(-v --version)'{-v,--version}'[show program'\''s version number and exit]'

    _arguments -C \
        "1: :->cmds" \
        "*::arg:->args"
    case "$state" in
    cmds)
        __gita_commands && return 0
        ;;
    args)
        local cmd="${line[1]}"
        curcontext="${curcontext%:*}-${cmd}:${curcontext##*:}"
        local completion_func="_gita_${cmd//-/_}"
        _call_function ret "${completion_func}" && return ret
        _message "a completion function is not defined for command or alias: ${cmd}"
        return 1
        ;;
    esac
} # ]]]

_gita "$@"