# bash completion for firefly (firefly-cli)
# Install: source this file, or drop it in /etc/bash_completion.d/ or
# /usr/share/bash-completion/completions/firefly
#
# Generated by scripts/gen_completion.py -- do not edit by hand.
# Regenerate when commands change (see CLAUDE.md):
#   python scripts/gen_completion.py > completions/firefly.bash

_firefly() {
    local cur prev words cword
    _init_completion 2>/dev/null || {
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        words=("${COMP_WORDS[@]}")
        cword=$COMP_CWORD
    }

    local global_opts="--human --url --token -h --help"
    local groups="auth account category tag tx"

    # Find the group and leaf among the words (skip the program name at 0).
    local group="" leaf="" i
    for ((i=1; i < cword; i++)); do
        local w="${words[i]}"
        case "$w" in
            -*) ;;                      # an option, skip
            --url|--token) ((i++));;    # option that takes a value
            *)
                if [[ -z $group ]]; then group="$w"
                elif [[ -z $leaf ]]; then leaf="$w"
                fi
                ;;
        esac
    done

    # Leaf-specific options.
    local leaf_opts=""
    case "$group $leaf" in
        "auth set")         leaf_opts="--token --url";;
        "account balance")  leaf_opts="--at";;
        "account create")   leaf_opts="--currency --opening-balance --type";;
        "account list")     leaf_opts="--type";;
        "tx add")           leaf_opts="--category --date --desc --dry-run --from --skip-dupes --tags --to --type";;
        "tx delete")        leaf_opts="--yes";;
        "tx edit")          leaf_opts="--amount --category --date --desc --from --tags --to --type";;
        "tx list")          leaf_opts="--account --all --limit --since --until";;
    esac

    # Leaves per group.
    local leaves=""
    case "$group" in
        auth) leaves="set test";;
        account) leaves="balance create get list";;
        category) leaves="list";;
        tag) leaves="list";;
        tx) leaves="add delete edit get list search";;
    esac

    # Flag values: when the previous word is a flag with a fixed value set for
    # this command, suggest those values instead of more flags.
    local vals=""
    case "$group $leaf $prev" in
        "account create --type")  vals="asset expense revenue";;
        "account list --type")    vals="asset expense revenue liability";;
        "tx add --type")          vals="withdrawal deposit transfer";;
        "tx edit --type")         vals="withdrawal deposit transfer";;
    esac
    if [[ -n $vals ]]; then
        COMPREPLY=($(compgen -W "$vals" -- "$cur"))
        return
    fi

    if [[ -z $group ]]; then
        COMPREPLY=($(compgen -W "$groups $global_opts" -- "$cur"))
    elif [[ -z $leaf ]]; then
        COMPREPLY=($(compgen -W "$leaves" -- "$cur"))
    else
        COMPREPLY=($(compgen -W "$leaf_opts --help" -- "$cur"))
    fi
}
complete -F _firefly firefly
