#compdef gopass

_gopass () {
    local cmd
    if (( CURRENT > 2)); then
        cmd=${words[2]}
        curcontext="${curcontext%:*:*}:gopass-$cmd"
        (( CURRENT-- ))
        shift words
        case "${cmd}" in
          audit)
              local -a subcommands
              subcommands=(
              "hibp:Detect leaked passwords"
              )
              _arguments : "--jobs[The number of jobs to run concurrently when auditing]"
              _describe -t commands "gopass audit" subcommands
              
              
              ;;
          binary|bin)
              local -a subcommands
              subcommands=(
              "cat:Print content of a secret to stdout, or insert from stdin"
              "sum:Compute the SHA256 checksum"
              "copy:Copy files from or to the password store"
              "move:Move files from or to the password store"
              )
              
              _describe -t commands "gopass binary" subcommands
              
              
              ;;
          clone)
              _arguments : "--path[Path to clone the repo to]" "--crypto[Select crypto backend (gpg, gpgcli, plain, xc)]" "--sync[Select sync backend (git, gitcli, noop)]"
              _describe -t commands "gopass clone" subcommands
              
              
              ;;
          completion)
              local -a subcommands
              subcommands=(
              "bash:Source for auto completion in bash"
              "zsh:Source for auto completion in zsh"
              "fish:Source for auto completion in fish"
              "openbsdksh:Source for auto completion in OpenBSD's ksh"
              )
              
              _describe -t commands "gopass completion" subcommands
              
              
              ;;
          config)
              _arguments : "--store[Set value to substore config]"
              _describe -t commands "gopass config" subcommands
              
              
              ;;
          copy|cp)
              _arguments : "--force[Force to copy the secret and overwrite existing one]"
              _describe -t commands "gopass copy" subcommands
              
              _gopass_complete_passwords
              ;;
          create|new)
              _arguments : "--store[Which store to use]"
              _describe -t commands "gopass create" subcommands
              
              
              ;;
          delete|remove|rm)
              _arguments : "--recursive[Recursive delete files and folders]" "--force[Force to delete the secret]"
              _describe -t commands "gopass delete" subcommands
              
              _gopass_complete_passwords
              ;;
          edit|set)
              _arguments : "--editor[Use this editor binary]" "--create[Create a new secret if none found]"
              _describe -t commands "gopass edit" subcommands
              
              _gopass_complete_passwords
              ;;
          env)
              
              _describe -t commands "gopass env" subcommands
              
              
              ;;
          find|search)
              _arguments : "--clip[Copy the password into the clipboard]" "--force[In the case of an exact match, display the password even if safecontent is enabled]"
              _describe -t commands "gopass find" subcommands
              
              
              ;;
          fsck)
              _arguments : "--decrypt[Decrypt during fsck]"
              _describe -t commands "gopass fsck" subcommands
              
              
              ;;
          generate)
              _arguments : "--clip[Copy the generated password to the clipboard]" "--print[Print the generated password to the terminal]" "--force[Force to overwrite existing password]" "--edit[Open secret for editing after generating a password]" "--symbols[Use symbols in the password]" "--memorable[Generate a memorable password]" "--strict[Require strict character class rules]" "--xkcd[Use multiple random english words combined to a password. By default, space is used as separator and all words are lowercase]" "--xkcdsep[Word separator for generated xkcd style password. If no separator is specified, the words are combined without spaces/separator and the first character of words is capitalised. This flag implies -xkcd]" "--xkcdlang[Language to generate password from, currently de (german) and en (english, default) are supported]"
              _describe -t commands "gopass generate" subcommands
              _gopass_complete_folders
              _gopass_complete_passwords
              ;;
          git)
              local -a subcommands
              subcommands=(
              "init:Init git repo"
              "remote:Manage git remotes"
              "push:Push to remote"
              "pull:Pull from remote"
              "status:RCS status"
              )
              
              _describe -t commands "gopass git" subcommands
              
              
              ;;
          git-credential)
              local -a subcommands
              subcommands=(
              "get:"
              "store:"
              "erase:"
              "configure:"
              )
              
              _describe -t commands "gopass git-credential" subcommands
              
              
              ;;
          grep)
              
              _describe -t commands "gopass grep" subcommands
              
              
              ;;
          history|hist)
              _arguments : "--password[Include passwords in output]"
              _describe -t commands "gopass history" subcommands
              
              
              ;;
          init)
              _arguments : "--path[Set the sub-store path to operate on]" "--store[Set the name of the sub-store]" "--crypto[Select crypto backend (gpg, gpgcli, plain, xc)]" "--rcs[Select sync backend (git, gitcli, noop)]" "--nogit[(DEPRECATED): Select noop RCS backend. Use '--rcs noop' instead]"
              _describe -t commands "gopass init" subcommands
              
              
              ;;
          insert)
              _arguments : "--echo[Display secret while typing]" "--multiline[Insert using $EDITOR]" "--force[Overwrite any existing secret and do not prompt to confirm recipients]" "--append[Append to any existing data]"
              _describe -t commands "gopass insert" subcommands
              _gopass_complete_folders
              _gopass_complete_passwords
              ;;
          jsonapi)
              local -a subcommands
              subcommands=(
              "listen:Listen and respond to messages via stdin/stdout"
              "configure:Setup gopass native messaging manifest for selected browser"
              )
              
              _describe -t commands "gopass jsonapi" subcommands
              
              
              ;;
          list|ls)
              _arguments : "--limit[Max tree depth]" "--flat[Print flat list]" "--folders[Print flat list of folders]" "--strip-prefix[Strip prefix from filtered entries]"
              _describe -t commands "gopass list" subcommands
              _gopass_complete_folders
              
              ;;
          mounts)
              local -a subcommands
              subcommands=(
              "add:Mount a password store"
              "remove:Umount an mounted password store"
              )
              
              _describe -t commands "gopass mounts" subcommands
              
              
              ;;
          move|mv)
              _arguments : "--force[Force to move the secret and overwrite existing one]"
              _describe -t commands "gopass move" subcommands
              
              _gopass_complete_passwords
              ;;
          otp|totp|hotp)
              _arguments : "--clip[Copy the time-based token into the clipboard]" "--qr[Write QR code to FILE]" "--password[Only display the token]"
              _describe -t commands "gopass otp" subcommands
              
              
              ;;
          pwgen)
              _arguments : "--no-numerals[Do not include numerals in the generated passwords.]" "--one-per-line[Print one password per line]" "--xkcd[Use multiple random english words combined to a password. By default, space is used as separator and all words are lowercase]" "--xkcdsep[Word separator for generated xkcd style password. If no separator is specified, the words are combined without spaces/separator and the first character of words is capitalised. This flag implies -xkcd]" "--xkcdlang[Language to generate password from, currently de (german) and en (english, default) are supported]"
              _describe -t commands "gopass pwgen" subcommands
              
              
              ;;
          recipients)
              local -a subcommands
              subcommands=(
              "add:Add any number of Recipients to any store"
              "remove:Remove any number of Recipients from any store"
              "update:Recompute the saved recipient list checksums"
              )
              
              _describe -t commands "gopass recipients" subcommands
              
              
              ;;
          setup)
              _arguments : "--remote[URL to a git remote, will attempt to join this team]" "--alias[Local mount point for the given remote]" "--create[Create a new team (default: false, i.e. join an existing team)]" "--name[Firstname and Lastname for unattended GPG key generation]" "--email[EMail for unattended GPG key generation]" "--crypto[Select crypto backend (gpg, gpgcli, plain, xc)]" "--rcs[Select sync backend (git, gitcli, noop)]"
              _describe -t commands "gopass setup" subcommands
              
              
              ;;
          show)
              _arguments : "--clip[Copy the first line of the secret into the clipboard]" "--alsoclip[Copy the first line of the secret and show everything]" "--qr[Print the first line of the secret as QR Code]" "--force[Display the password even if safecontent is enabled]" "--password[Display only the password]" "--sync[Sync before attempting to display the secret]" "--revision[Show a past revision]"
              _describe -t commands "gopass show" subcommands
              
              _gopass_complete_passwords
              ;;
          sync)
              _arguments : "--store[Select the store to sync]"
              _describe -t commands "gopass sync" subcommands
              
              
              ;;
          templates)
              local -a subcommands
              subcommands=(
              "show:Show a secret template."
              "edit:Edit secret templates."
              "remove:Remove secret templates."
              )
              
              _describe -t commands "gopass templates" subcommands
              
              
              ;;
          unclip)
              _arguments : "--timeout[Time to wait]" "--force[Clear clipboard even if checksum mismatches]"
              _describe -t commands "gopass unclip" subcommands
              
              
              ;;
          update)
              _arguments : "--pre[Update to prereleases]"
              _describe -t commands "gopass update" subcommands
              
              
              ;;
          version)
              
              _describe -t commands "gopass version" subcommands
              
              
              ;;
          help|h)
              
              _describe -t commands "gopass help" subcommands
              
              
              ;;
          *)
              _gopass_complete_passwords
              ;;
        esac
    else
        local -a subcommands
        subcommands=(
          "audit:Scan for weak passwords"
          "binary:Assist with Binary/Base64 content"
          "clone:Clone a store from git"
          "completion:Bash and ZSH completion"
          "config:Edit configuration"
          "copy:Copy secrets from one location to another"
          "create:Easy creation of new secrets"
          "delete:Remove secrets"
          "edit:Edit new or existing secrets"
          "env:Run a subprocess with a pre-populated environment"
          "find:Search for secrets"
          "fsck:Check store integrity"
          "generate:Generate a new password"
          "git:Run a git command inside a password store (init, remote, push, pull)"
          "git-credential:Use "!gopass git-credential $@" as git's credential.helper"
          "grep:Search for secrets files containing search-string when decrypted."
          "history:Show password history"
          "init:Initialize new password store."
          "insert:Insert a new secret"
          "jsonapi:Run and configure gopass as jsonapi e.g. for browser plugins"
          "list:List existing secrets"
          "mounts:Edit mounted stores"
          "move:Move secrets from one location to another"
          "otp:Generate time- or hmac-based tokens"
          "pwgen:Generate passwords"
          "recipients:Edit recipient permissions"
          "setup:Initialize a new password store"
          "show:Display a secret"
          "sync:Sync all local stores with their remotes"
          "templates:Edit templates"
          "unclip:Internal command to clear clipboard"
          "update:Check for updates"
          "version:Display version"
          "help:Shows a list of commands or help for one command"
        )
        _describe -t command 'gopass' subcommands
        _arguments : "--yes[Assume yes on all yes/no questions or use the default on all others]" "--clip[Copy the first line of the secret into the clipboard]" "--alsoclip[Copy the first line of the secret into the clipboard and show everything]" "--help[show help]" "--version[print the version]" 
        _gopass_complete_passwords
    fi
}

_gopass_complete_keys () {
    local IFS=$'\n'
    _values 'gpg keys' $(gpg2 --list-secret-keys --with-colons 2> /dev/null | cut -d : -f 10 | sort -u | sed '/^$/d')
}

_gopass_complete_passwords () {
    local IFS=$'\n'
    _arguments : \
        "--clip[Copy the first line of the secret into the clipboard]"
    _values 'passwords' $(gopass ls --flat)
}

_gopass_complete_folders () {
    local -a folders
    folders=("${(@f)$(gopass ls --folders --flat)}")
    _describe -t folders "folders" folders -qS /
}

_gopass
