#!/usr/bin/env bash

# Prompts for a pass entry, then for a specific field. Similar to passmenu, but
# uses rofi, and can resume from a previous session.
#
# Example: passmenu [RESUME]

ROFI_CMD='rofi -dmenu -theme theme/passmenu.rasi'
MSG_CMD='notify-send'
set -e
shopt -s nullglob globstar

for prog in xclip pass; do
  if ! command -v "$prog" >/dev/null; then
    >&2 echo "$prog not installed, aborting"
    exit 1
  fi
done

if [[ $1 == -r ]]; then
    resume=1; shift
fi

url=
# Get qutebrowser's current url
win=$(xdotool getactivewindow)
if [[ -n $win ]]; then
  winname=$(xdotool getwindowname $win)
  if [[ $winname =~ " - Mozilla Firefox$" ]]; then
    url=${winname% - Mozilla*}
    url=${url##* - }
    while (( ${#url//[^.]/} > 1 )); do
      url=${url#*.}
    done
  fi
fi

LAST_ENTRY_FILE=/tmp/_upm
if [[ -n $resume && -f $LAST_ENTRY_FILE ]]; then
  entry="$(<$LAST_ENTRY_FILE)"
else
  prefix=${PASSWORD_STORE_DIR-~/.password-store}
  password_files=( "$prefix"/**/*.gpg  )
  password_files=( "${password_files[@]#"$prefix"/}"  )
  password_files=( "${password_files[@]%.gpg}" )
  entry=$(printf "%s\n" "${password_files[@]}" | $ROFI_CMD -p "..." -filter "$url")
fi

if [[ -z $entry ]]; then
  $MSG_CMD "Error!" "Failed to select $entry"
  exit 1
fi

echo "$entry" >/tmp/_upm
secrets="$(pass show "$entry")"
if [[ -n $secrets ]]; then
  fields=$(awk -F': ' 'NR>1 && !/^otpauth:/ {print $1}' <<<"$secrets")
  field=$(printf "password\n%s\notp\n" "${fields[@]}" | $ROFI_CMD -p "$entry")
  case $field in
    password) pass -c "$entry" ;;
    otp) printf "%s" "$(pass otp -c "$entry")" ;;
    *) printf "%s" "$(awk -v "key=$field:" '$1 == key {print $2}' <<<"$secrets")" | xclip -selection clipboard -in ;;
  esac
  $MSG_CMD "Success!" "Copied <b>$entry/$field</b> to clipboard for 45s"
else
  $MSG_CMD "Error!" "Failed to retrieve $entry"
  exit 2
fi
