{ pkgs, ... }:

let

  msmtprc = pkgs.writeText "msmtprc" ''
    defaults
      logfile ~/.msmtp.log
    account prism
      host prism.r
    account default: prism
  '';

  msmtp = pkgs.writeBashBin "msmtp" ''
    ${pkgs.coreutils}/bin/tee >(${pkgs.notmuch}/bin/notmuch insert +sent) | \
      ${pkgs.msmtp}/bin/msmtp -C ${msmtprc} "$@"
  '';

  mailcap = pkgs.writeText "mailcap" ''
    text/html; ${pkgs.elinks}/bin/elinks -dump ; copiousoutput;
  '';

  muttrc = pkgs.writeText "muttrc" ''
    # gpg
    source ${pkgs.neomutt}/share/doc/mutt/samples/gpg.rc
    set pgp_use_gpg_agent = yes
    set pgp_sign_as = 0x976A7E4D
    set crypt_autosign = yes
    set crypt_replyencrypt = yes
    set crypt_verify_sig = yes
    set pgp_verify_command = "gpg --no-verbose --batch --output - --verify %s %f"

    macro index \Cv \
    "<enter-command> set my_crypt_verify_sig=\$crypt_verify_sig<enter> \
    <enter-command> set crypt_verify_sig=yes<enter> \
    <display-message><enter-command> set crypt_verify_sig=\$my_crypt_verify_sig<enter>" \
     'Verify PGP signature and open the message'

    macro pager \Cv \
    "<exit><enter-command> set my_crypt_verify_sig=\$crypt_verify_sig<enter> \
    <enter-command> set crypt_verify_sig=yes<enter> \
    <display-message><enter-command> set crypt_verify_sig=\$my_crypt_verify_sig<enter>" \
     'Verify PGP signature'

    # read html mails
    auto_view text/html
    set mailcap_path = ${mailcap}

    # notmuch
    set nm_default_uri="notmuch://$HOME/Maildir" # path to the maildir
    set nm_record = yes
    set nm_record_tags = "-inbox me archive"
    set virtual_spoolfile=yes                    # enable virtual folders


    set sendmail="${msmtp}/bin/msmtp"            # enables parsing of outgoing mail
    set from="lassulus@lassul.us"
    alternates ^.*@lassul\.us$ ^.*@.*\.r$
    set use_from=yes
    set envelope_from=yes
    set reverse_name

    set sort=threads

    set index_format="${pkgs.writeDash "mutt-index" ''
      # http://www.mutt.org/doc/manual/#formatstrings
      recipent="$(echo $1 | sed 's/[^,]*<\([^>]*\)[^,]*/ \1/g')"
      #     output to mutt
      #           V
      echo "%4C %Z %?GI?%GI& ? %[%y-%m-%d] %-20.20a %?M?(%3M)& ? %s %> $recipent %?g?%g?%"
      # args to mutt-index dash script
      # V
    ''} %r |"

    virtual-mailboxes \
        "Unread"    "notmuch://?query=tag:unread"\
        "INBOX"     "notmuch://?query=tag:inbox \
                     and NOT tag:killed \
                     and NOT to:shackspace \
                     and NOT to:c-base \
                     and NOT from:security-alert@hpe.com \
                     and NOT to:nix-devel\
                     and NOT to:radio"\
        "shack"     "notmuch://?query=to:shackspace"\
        "c-base"    "notmuch://?query=to:c-base"\
        "security"  "notmuch://?query=to:securityfocus or from:security-alert@hpe.com"\
        "nix"       "notmuch://?query=to:nix-devel"\
        "radio"     "notmuch://?query=to:radio or tag:radio"\
        "TODO"      "notmuch://?query=tag:TODO"\
        "Starred"   "notmuch://?query=tag:*"\
        "Archive"   "notmuch://?query=tag:archive"\
        "Sent"      "notmuch://?query=tag:sent"\
        "Junk"      "notmuch://?query=tag:junk"

    tag-transforms "junk"     "k" \
                   "unread"   "u" \
                   "replied"  "↻" \
                   "TODO"     "T" \

    # notmuch bindings
    macro index \\\\ "<vfolder-from-query>"                   # looks up a hand made query
    macro index + "<modify-labels>+*\n<sync-mailbox>"         # tag as starred
    macro index - "<modify-labels>-*\n<sync-mailbox>"         # tag as unstarred


    #killed
    bind index d noop
    bind pager d noop

    bind index S noop
    bind index s noop
    bind pager S noop
    bind pager s noop
    macro index S "<modify-labels-then-hide>-inbox -unread +junk\n" # tag as Junk mail
    macro index s "<modify-labels>-junk\n" # tag as Junk mail
    macro pager S "<modify-labels-then-hide>-inbox -unread +junk\n" # tag as Junk mail
    macro pager s "<modify-labels>-junk\n" # tag as Junk mail


    bind index A noop
    bind index a noop
    bind pager A noop
    bind pager a noop
    macro index A "<modify-labels>+archive -unread -inbox\n"  # tag as Archived
    macro index a "<modify-labels>-archive\n"  # tag as Archived
    macro pager A "<modify-labels>+archive -unread -inbox\n"  # tag as Archived
    macro pager a "<modify-labels>-archive\n"  # tag as Archived


    bind index t noop
    bind pager t noop
    macro index t "<modify-labels>"        # tag as Archived

    # top index bar in email view
    set pager_index_lines=7

    # sidebar
    set sidebar_width   = 20
    set sidebar_visible = yes               # set to "no" to disable sidebar view at startup
    color sidebar_new yellow default
    # sidebar bindings
    bind index <left> sidebar-prev          # got to previous folder in sidebar
    bind index <right> sidebar-next         # got to next folder in sidebar
    bind index <space> sidebar-open         # open selected folder from sidebar
    # sidebar toggle
    macro index ,@) "<enter-command> set sidebar_visible=no; macro index ~ ,@( 'Toggle sidebar'<Enter>"
    macro index ,@( "<enter-command> set sidebar_visible=yes; macro index ~ ,@) 'Toggle sidebar'<Enter>"
    macro index ~ ,@( 'Toggle sidebar'      # toggle the sidebar
  '';

  mutt = pkgs.symlinkJoin {
    name = "mutt";
    paths = [
      (pkgs.writeDashBin "mutt" ''
        exec ${pkgs.neomutt}/bin/mutt -F ${muttrc} $@
      '')
      pkgs.neomutt
    ];
  };

in {
  environment.systemPackages = [
    msmtp
    mutt
    pkgs.much
    pkgs.notmuch
  ];
}