#compdef gopass

_gopass () {
    local cmd
    if (( CURRENT > 2)); then
	cmd=${words[2]}
	curcontext="${curcontext%:*:*}:gopass-$cmd"
	(( CURRENT-- ))
	shift words
	case "${cmd}" in
	  age)
	      local -a subcommands
	      subcommands=(
	      "identities:List identities"
	      )
	      _describe -t commands "gopass age" subcommands
	      
	      
	      
	      ;;
	  alias)
	      
	      
	      
	      ;;
	  audit)
	      _arguments : "--expiry[Age in days before a password is considered expired. Setting this will only check expiration.]"
	      
	      
	      ;;
	  cat)
	      
	      
	      
	      ;;
	  clone)
	      _arguments : "--path[Path to clone the repo to]" "--crypto[Select crypto backend \[age gpgcli plain\]]" "--storage[Select storage backend \[fossilfs gitfs\]]" "--check-keys[Check for valid decryption keys. Generate new keys if none are found.]"
	      
	      
	      ;;
	  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 options to a specific store]"
	      
	      
	      ;;
	  convert)
	      _arguments : "--store[Specify which store to convert]" "--move[Replace store?]" "--crypto[Which crypto backend? \[age gpgcli plain\]]" "--storage[Which storage backend? \[fossilfs fs gitfs\]]"
	      
	      
	      ;;
	  copy|cp)
	      _arguments : "--force[Force to copy the secret and overwrite existing one]"
	      
	      _gopass_complete_passwords
	      ;;
	  create|new)
	      _arguments : "--store[Which store to use]" "--force[Force path selection]"
	      
	      
	      ;;
	  delete|remove|rm)
	      _arguments : "--recursive[Recursive delete files and folders]" "--force[Force to delete the secret]"
	      
	      _gopass_complete_passwords
	      ;;
	  edit|set)
	      _arguments : "--editor[Use this editor binary]" "--create[Create a new secret if none found]"
	      
	      _gopass_complete_passwords
	      ;;
	  env)
	      _arguments : "--keep-case[Do not capitalize the environment variable and instead retain the original capitalization]"
	      
	      
	      ;;
	  find|search)
	      _arguments : "--unsafe[In the case of an exact match, display the password even if safecontent is enabled]"
	      
	      
	      ;;
	  fsck)
	      _arguments : "--decrypt[Decrypt and reencryt during fsck.]"
	      
	      
	      ;;
	  fscopy)
	      
	      
	      
	      ;;
	  fsmove)
	      
	      
	      
	      ;;
	  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]" "--generator[Choose a password generator, use one of: cryptic, memorable, xkcd or external. Default: cryptic]" "--strict[Require strict character class rules]" "--force-regen[Force full re-generation, incl. evaluation of templates. Will overwrite the entire secret!]" "--sep[Word separator for generated passwords. If no separator is specified, the words are combined without spaces/separator and the first character of words is capitalised.]" "--lang[Language to generate password from, currently only en (english, default) or de are supported]"
	      _gopass_complete_folders
	      _gopass_complete_passwords
	      ;;
	  git)
	      _arguments : "--store[Store to operate on]"
	      
	      
	      ;;
	  grep)
	      _arguments : "--regexp[Interpret pattern as RE2 regular expression]"
	      
	      
	      ;;
	  history|hist)
	      _arguments : "--password[Include passwords in output]"
	      
	      
	      ;;
	  init)
	      _arguments : "--path[Set the sub-store path to operate on]" "--store[Set the name of the sub-store]" "--crypto[Select crypto backend \[age gpgcli plain\]]" "--storage[Select storage backend \[fossilfs fs gitfs\]]"
	      
	      
	      ;;
	  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 data read from STDIN to existing data]"
	      _gopass_complete_folders
	      _gopass_complete_passwords
	      ;;
	  link|ln|symlink)
	      
	      
	      
	      ;;
	  list|ls)
	      _arguments : "--limit[Display no more than this many levels of the tree]" "--flat[Print a flat list]" "--folders[Print a flat list of folders]" "--strip-prefix[Strip this prefix from filtered entries]"
	      _gopass_complete_folders
	      
	      ;;
	  merge)
	      _arguments : "--delete[Remove merged entries]" "--force[Skip editor, merge entries unattended]"
	      
	      
	      ;;
	  mounts)
	      local -a subcommands
	      subcommands=(
	      "add:Mount a password store"
	      "remove:Umount an mounted password store"
	      "versions:Display mount provider versions"
	      )
	      _describe -t commands "gopass mounts" subcommands
	      
	      
	      
	      ;;
	  move|mv)
	      _arguments : "--force[Force to move the secret and overwrite existing one]"
	      
	      _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]"
	      
	      _gopass_complete_passwords
	      ;;
	  process)
	      
	      
	      
	      ;;
	  pwgen)
	      _arguments : "--no-numerals[Do not include numerals in the generated passwords.]" "--no-capitalize[Do not include capital letter in the generated passwords.]" "--ambiguous[Do not include characters that could be easily confused with each other, like '1' and 'l' or '0' and 'O']" "--symbols[Include at least one symbol in the password.]" "--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]" "--sep[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]" "--lang[Language to generate password from, currently only en (english, default) or de are supported]"
	      
	      
	      ;;
	  rcs)
	      local -a subcommands
	      subcommands=(
	      "init:Init RCS repo"
	      "status:RCS status"
	      )
	      _describe -t commands "gopass rcs" subcommands
	      
	      
	      
	      ;;
	  recipients)
	      local -a subcommands
	      subcommands=(
	      "ack:Update recipients.hash"
	      "add:Add any number of Recipients to any store"
	      "remove:Remove any number of Recipients from any store"
	      )
	      _describe -t commands "gopass recipients" subcommands
	      _arguments : "--pretty[Pretty print recipients]"
	      
	      
	      ;;
	  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 \[age gpgcli plain\]]" "--storage[Select storage backend \[fossilfs fs gitfs\]]"
	      
	      
	      ;;
	  show)
	      _arguments : "--yes[Always answer yes to yes/no questions]" "--clip[Copy the password value into the clipboard]" "--alsoclip[Copy the password and show everything]" "--qr[Print the password as a QR Code]" "--unsafe[Display unsafe content (e.g. the password) even if safecontent is enabled]" "--password[Display only the password. Takes precedence over all other flags.]" "--revision[Show a past revision. Does NOT support RCS specific shortcuts. Use exact revision or -<N> to select the Nth oldest revision of this entry.]" "--noparsing[Do not parse the output.]" "--chars[Print specific characters from the secret]"
	      
	      _gopass_complete_passwords
	      ;;
	  sum|sha|sha256)
	      
	      
	      
	      ;;
	  sync)
	      _arguments : "--store[Select the store to sync]"
	      
	      
	      ;;
	  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]"
	      
	      
	      ;;
	  update)
	      
	      
	      
	      ;;
	  version)
	      
	      
	      
	      ;;
	  help|h)
	      
	      
	      
	      ;;
	  *)
	      _gopass_complete_passwords
	      ;;
	esac
    else
	local -a subcommands
	subcommands=(
	  "age:age commands"
	  "alias:Print domain aliases"
	  "audit:Decrypt all secrets and scan for weak or leaked passwords"
	  "cat:Decode and print content of a binary secret to stdout, or encode and insert from stdin"
	  "clone:Clone a password store from a git repository"
	  "completion:Bash and ZSH completion"
	  "config:Display and edit the configuration file"
	  "convert:Convert a store to different backends"
	  "copy:Copy secrets from one location to another"
	  "create:Easy creation of new secrets"
	  "delete:Remove one or many secrets from the store"
	  "edit:Edit new or existing secrets"
	  "env:Run a subprocess with a pre-populated environment"
	  "find:Search for secrets"
	  "fsck:Check store integrity"
	  "fscopy:Copy files from or to the password store"
	  "fsmove:Move files from or to the password store"
	  "generate:Generate a new password"
	  "git:Run a git command inside a password store: gopass git [--store=<store>] <git-command>"
	  "grep:Search for secrets files containing search-string when decrypted."
	  "history:Show password history"
	  "init:Initialize new password store."
	  "insert:Insert a new secret"
	  "link:Create a symlink"
	  "list:List existing secrets"
	  "merge:Merge multiple secrets into one"
	  "mounts:Edit mounted stores"
	  "move:Move secrets from one location to another"
	  "otp:Generate time- or hmac-based tokens"
	  "process:Process a template file"
	  "pwgen:Generate passwords"
	  "rcs:Run a RCS command inside a password store"
	  "recipients:Edit recipient permissions"
	  "setup:Initialize a new password store"
	  "show:Display the content of a secret"
	  "sum:Compute the SHA256 checksum"
	  "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[Always answer yes to yes/no questions]" "--clip[Copy the password value into the clipboard]" "--alsoclip[Copy the password and show everything]" "--qr[Print the password as a QR Code]" "--unsafe[Display unsafe content (e.g. the password) even if safecontent is enabled]" "--password[Display only the password. Takes precedence over all other flags.]" "--revision[Show a past revision. Does NOT support RCS specific shortcuts. Use exact revision or -<N> to select the Nth oldest revision of this entry.]" "--noparsing[Do not parse the output.]" "--chars[Print specific characters from the secret]" "--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
