;;; rul-mail.el --- Email configuration

;; mml-sec.el
;; Use sender to find GPG key.
(setq mml-secure-openpgp-sign-with-sender t)

(use-package notmuch
  :ensure t
  :config
  ;; UI
  (setq notmuch-show-logo nil
        notmuch-column-control 1.0
        notmuch-hello-auto-refresh t
        notmuch-hello-recent-searches-max 20
        notmuch-hello-thousands-separator ""
        notmuch-show-all-tags-list t)

  ;; Keymaps
  (defun rul/capture-mail()
    "Capture mail to org mode."
    (interactive)
    (org-store-link nil)
    (org-capture nil "m")
    )

  (bind-key "c" 'rul/capture-mail notmuch-show-mode-map)

  (define-key notmuch-show-mode-map "R" 'notmuch-show-reply)
  (define-key notmuch-search-mode-map "R" 'notmuch-search-reply-to-thread)

  ;; Spam
  (define-key notmuch-show-mode-map "S"
              (lambda ()
                "mark message as spam"
                (interactive)
                (notmuch-show-tag (list "+spam" "-inbox" "-unread"))))

  (define-key notmuch-search-mode-map "S"
              (lambda (&optional beg end)
                "mark thread as spam"
                (interactive (notmuch-search-interactive-region))
                (notmuch-search-tag (list "+spam" "-inbox" "-unread") beg end)))

  ;; Archive
  (setq notmuch-archive-tags (list "-inbox" "+archive"))
  (define-key notmuch-show-mode-map "A"
              (lambda ()
                "archive"
                (interactive)
                (notmuch-show-tag (list "+archive" "-inbox" "-unread"))
                (notmuch-refresh-this-buffer)))

  (define-key notmuch-search-mode-map "A"
              (lambda (&optional beg end)
                "archive thread"
                (interactive (notmuch-search-interactive-region))
                (notmuch-search-tag (list "+archive" "-inbox" "-unread") beg end)
                (notmuch-refresh-this-buffer)))

  ;; Mark as read
  (define-key notmuch-search-mode-map "r"
              (lambda (&optional beg end)
                "mark thread as read"
                (interactive (notmuch-search-interactive-region))
                (notmuch-search-tag (list "-unread") beg end)
                (notmuch-search-next-thread)))

  (define-key notmuch-search-mode-map (kbd "RET")
              (lambda ()
                "Show the selected thread with notmuch-tree if it has more
than one email. Use notmuch-show otherwise."
                (interactive)
                (if (= (plist-get (notmuch-search-get-result) :total) 1)
                    (notmuch-search-show-thread)
                  (notmuch-tree (notmuch-search-find-thread-id)
                                notmuch-search-query-string
                                nil
                                (notmuch-prettify-subject (notmuch-search-find-subject))))))

  (defun color-inbox-if-unread () (interactive)
         (save-excursion
           (goto-char (point-min))
           (let ((cnt (car (process-lines "notmuch" "count" "tag:inbox and tag:unread"))))
             (when (> (string-to-number cnt) 0)
               (save-excursion
                 (when (search-forward "inbox" (point-max) t)
                   (let* ((overlays (overlays-in (match-beginning 0) (match-end 0)))
                          (overlay (car overlays)))
                     (when overlay
                       (overlay-put overlay 'face '((:inherit bold) (:foreground "green")))))))))))

  (defvar notmuch-hello-refresh-count 0)
  (defun notmuch-hello-refresh-status-message ()
    (let* ((new-count
            (string-to-number
             (car (process-lines notmuch-command "count"))))
           (diff-count (- new-count notmuch-hello-refresh-count)))
      (cond
       ((= notmuch-hello-refresh-count 0)
        (message "You have %s messages."
                 (notmuch-hello-nice-number new-count)))
       ((> diff-count 0)
        (message "You have %s more messages since last refresh."
                 (notmuch-hello-nice-number diff-count)))
       ((< diff-count 0)
        (message "You have %s fewer messages since last refresh."
                 (notmuch-hello-nice-number (- diff-count)))))
      (setq notmuch-hello-refresh-count new-count)))

  (add-hook 'notmuch-hello-refresh-hook 'color-inbox-if-unread)
  (add-hook 'notmuch-hello-refresh-hook 'notmuch-hello-refresh-status-message)

  (setq notmuch-hello-sections '(notmuch-hello-insert-saved-searches
                                 notmuch-hello-insert-search
                                 notmuch-hello-insert-recent-searches
                                 notmuch-hello-insert-alltags
                                 ))

  ;; https://git.sr.ht/~tslil/dotfiles/tree/4e51afbb/emacs/notmuch-config.el#L76-82
  (defmacro make-binds (mode-map binds argfunc &rest body)
    "Create keybindings in `mode-map' using a list of (keystr . arg)
pairs in `binds' of the form ( ... (argfunc arg) body)."
    `(progn ,@(mapcar (lambda (pair)
                        `(define-key ,mode-map (kbd ,(car pair))
                                     (lambda () (interactive) (,argfunc ,(cdr pair)) ,@body)))
                      (eval binds))))

  (defvar notmuch-hello-tree-searches '(("u" . "tag:unread")
                                        ("i" . "tag:inbox")
                                        ("*" . "*"))
    "List of (key . query) pairs to bind in notmuch-hello.")

  (make-binds notmuch-hello-mode-map
              notmuch-hello-tree-searches
              notmuch-search)
) ;; ends use-package notmuch

(use-package notmuch-indicator :ensure t)

(provide 'rul-mail)