{ stdenv, symlinkJoin, rofi, gnused, pass-otp, writeTextFile
, writeShellScriptBin, xdotool }:

let

  name = "otpmenu";

  desktopFile = writeTextFile {
    name = "${name}.desktop";
    destination = "/share/applications/${name}.desktop";
    text = ''
      [Desktop Entry]
      Categories=Application;Utility;
      Comment=Enter MFA number with password otp plugins otp
      Encoding=UTF-8
      Exec=${bin}/bin/${name}
      Icon=gnome-lockscreen
      Name=${name}
      Terminal=false
      Type=Application
    '';
  };

  bin = writeShellScriptBin name # sh
    ''
      set -efu

      x=$(
        ${pass-otp}/bin/pass git ls-files '*/otp.gpg' \
          | ${gnused}/bin/sed 's:/otp\.gpg$::' \
          | ${rofi}/bin/rofi -dmenu -f -p OTP
      )

      otp=$(${pass-otp}/bin/pass otp code "$x/otp")

      printf %s "$otp" | ${xdotool}/bin/xdotool type -f -
    '';

in symlinkJoin rec {
  version = "1.0.0";
  name = "otpMenu-${version}";
  paths = [ bin desktopFile ];
  meta = with stdenv.lib; {
    description = "similar to passmenu shows and prints otp";
    homepage = "https://your.mama";
    license = licenses.gpl3;
    platforms = platforms.linux;
    maintainers = with maintainers; [ mrVanDalo ];
  };
}