#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 (ALPHA)"
              )
              _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]"
              _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&#39;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)
              
              _describe -t commands "gopass create" subcommands
              ;;
          delete|remove|rm)
              _arguments : "--recursive[f]" "--force[Force to delete the secret]"
              _describe -t commands "gopass delete" subcommands
              _gopass_complete_passwords;;
          edit|set)
              _arguments : "--editor[Use this editor binary]"
              _describe -t commands "gopass edit" subcommands
              ;;
          find|search)
              _arguments : "--clip[Copy the password into the clipboard]"
              _describe -t commands "gopass find" subcommands
              ;;
          fix)
              _arguments : "--check[Only report]" "--force[Auto-correct any errors, do not ask]"
              _describe -t commands "gopass fix" subcommands
              ;;
          fsck)
              _arguments : "--check[Only report]" "--force[Auto-correct any errors, do not ask]"
              _describe -t commands "gopass fsck" subcommands
              ;;
          generate)
              _arguments : "--print[Print the generated password to the terminal]" "--force[Force to overwrite existing password]" "--edit[Open secret for editing after generating a password]" "--no-symbols[Do not include symbols in the password]" "--symbols[Use symbols in the password]" "--xkcd[Use multiple random english words combined to a password. If no separator is specified, the words are combined without spaces/separator and the first character of words is capitalised]" "--xkcdsep[Word separator for generated xkcd style password. Implies -xkcd]" "--xkcdlang[Language to generate password from, currently de (german) and en (english, default) are supported]"
              _describe -t commands "gopass generate" subcommands
              ;;
          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
              ;;
          otp|totp|hotp)
              _arguments : "--clip[Copy the time based token into the clipboard]" "--qr[Write QR code to `FILE`]"
              _describe -t commands "gopass otp" subcommands
              ;;
          git)
              local -a subcommands
              subcommands=(
              "init:Init git repo"
              )
              _arguments : "--store[Store to operate on]" "--no-recurse[Do not recurse to mounted sub-stores]" "--force[Print errors but continue]"
              _describe -t commands "gopass git" subcommands
              ;;
          grep)
              
              _describe -t commands "gopass grep" subcommands
              ;;
          init)
              _arguments : "--path[Set the sub store path to operate on]" "--store[Set the name of the sub store]" "--nogit[Do not init git repo]"
              _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]"
              _describe -t commands "gopass insert" subcommands
              ;;
          list|ls)
              _arguments : "--limit[Max tree depth]" "--flat[Print flat list]" "--strip-prefix[Strip prefix from filtered entries]"
              _describe -t commands "gopass list" subcommands
              ;;
          move|mv)
              _arguments : "--force[Force to move the secret and overwrite existing one]"
              _describe -t commands "gopass move" subcommands
              _gopass_complete_passwords;;
          mounts)
              local -a subcommands
              subcommands=(
              "add:Mount a password store"
              "remove:Umount an mounted password store"
              )
              
              _describe -t commands "gopass mounts" subcommands
              ;;
          recipients)
              local -a subcommands
              subcommands=(
              "add:Add any number of Recipients to any store"
              "remove:Remove any number of Recipients from any store"
              )
              
              _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]"
              _describe -t commands "gopass setup" subcommands
              ;;
          show)
              _arguments : "--clip[Copy the first line of the secret into the clipboard]" "--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]"
              _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 secret"
          "find:Search for secrets"
          "fix:Upgrade secrets"
          "fsck:Check inconsistencies (ALPHA)"
          "generate:Generate a new password"
          "jsonapi:Run gopass as jsonapi e.g. for browser plugins"
          "otp:Generate time or hmac based tokens"
          "git:Run any git command inside a password store"
          "grep:Search for secrets files containing search-string when decrypted."
          "init:Initialize new password store."
          "insert:Insert a new secret"
          "list:List existing secrets"
          "move:Move secrets from one location to another"
          "mounts:Edit mounted stores"
          "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]" "--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 () {
    _arguments : \
        "--clip[Copy the first line of the secret into the clipboard]"
    _values 'passwords' $(gopass ls --flat)
}

_gopass
