;;; jao-notmuch-move.el --- Move messages around in notmuch  -*- lexical-binding: t; -*-

;; Copyright (C) 2021  jao

;; Author: jao <mail@jao.io>
;; Keywords: mail

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <https://www.gnu.org/licenses/>.

;;; Commentary:

;; Moving messages around

;;; Code:

(require 'notmuch)

(defvar jao-notmuch-mailboxes nil)
(defvar jao-notmuch-mailboxes-rx nil)

(defun jao-notmuch--path-to-mailbox (full-path)
  (unless jao-notmuch-mailboxes-rx
    (setq jao-notmuch-mailboxes-rx (regexp-opt jao-notmuch-mailboxes)))
  (if (string-match jao-notmuch-mailboxes-rx full-path)
      (match-string 0 full-path)
    (user-error "Message not in any registered mailbox!")))

(defun jao-notmuch--msg-props ()
  (if-let ((p (save-excursion
                (beginning-of-line)
                (text-property-search-forward :notmuch-message-properties))))
      (prop-match-value p)
    (user-error "No message at point")))

(defun jao-notmuch--full-path ()
  (seq-find #'file-exists-p (plist-get (jao-notmuch--msg-props) :filename)))

(defun jao-notmuch--move (&optional full-path d)
  (let* ((full-path (or full-path (jao-notmuch--full-path)))
         (ff (jao-notmuch--path-to-mailbox full-path))
         (d (or d (completing-read (format "From %s to: " ff)
                                   (remove ff jao-notmuch-mailboxes) nil t)))
         (dest (string-replace ff d full-path))
         (dest (replace-regexp-in-string ",U=.+$" "m:2,S" dest))
         (ftags (split-string ff "/"))
         (ttags (split-string d "/")))
    (when (y-or-n-p (format "%s -> %s? " ftags ttags))
      (notmuch-tree-close-message-window)
      (notmuch-tree-tag (append (notmuch-tag-change-list ftags t)
                                (notmuch-tag-change-list ttags)))
      (rename-file (jao-notmuch--full-path) dest)
      (shell-command-to-string "notmuch new")
      (notmuch-refresh-this-buffer))))

(defun jao-notmuch-move-message ()
  "Move message at point to another folder."
  (interactive)
  (jao-notmuch--move))




(provide 'jao-notmuch-move)
;;; jao-notmuch-move.el ends here
