(require 'mail-utils)

(defvar vm-athena-tmp-directory "/usr/tmp/" 
  "Directory to store temporary output file created by movemail.")

(defvar vm-athena-tmpfile-prefix "vm-movemail"
  "Prefix of filename to for temporary movemail output.")

(defvar vm-athena-fake-spool-file 
  (make-temp-name (concat vm-athena-tmp-directory 
			  (getenv "USER") ".vm-fake-spool"))
  "Fake spool file used when getting mail from Athena post office.")

(setq vm-spool-files (cons vm-athena-fake-spool-file vm-spool-files))

(defun vm-athena-check-pop-mail ()
  "Check for new mail at the post office.\n\
Returns t if new mail, nil otherwise."
  
  (let ((newmail nil) (buffer (generate-new-buffer "*from output*")))
    (unwind-protect 
	(progn
	  (call-process "from" nil buffer nil "-t" "-p")
	  (save-excursion
	    (set-buffer buffer)
	    (goto-char (point-min))
	    (setq newmail (looking-at "^You have"))))
      (kill-buffer buffer))
    newmail))

(defun vm-athena-get-pop-mail (tofile)
  "Get new mail from post office into FILE given as argument."
  (let ((errors nil))
    (unwind-protect
	(save-excursion
	  (setq errors (generate-new-buffer " *rmail loss*"))
	  (buffer-flush-undo errors)
	  (call-process
	   (expand-file-name "movemail" exec-directory)
	   nil errors nil (concat "po:" (getenv "USER")) tofile)
	  (if (not (buffer-modified-p errors))
	      ;; No output => movemail won
	      nil
	    (set-buffer errors)
	    (subst-char-in-region (point-min) (point-max)
				  ?\n ?\  )
	    (goto-char (point-max))
	    (skip-chars-backward " \t")
	    (delete-region (point) (point-max))
	    (goto-char (point-min))
	    (if (looking-at "movemail: ")
		(delete-region (point-min) (match-end 0)))
	    (beep t)
	    (message (concat "movemail: "
			     (buffer-substring (point-min)
					       (point-max))))
	    (sit-for 3)
	    nil))
      (if errors (kill-buffer errors)))))

(defun vm-athena-convert-movemail-to-mbox-format (fromfile tofile)
  "Convert movemail output file FROMFILE to Unix mbox format.\n\
Store converted file in TOFILE."
  (save-excursion
    (let ((buffer (find-file-noselect (expand-file-name fromfile))))
      (unwind-protect
	  (progn
	    (setq vm-folder-type 'From_)
	    (set-buffer buffer)
	    (goto-char (point-min))
	    (search-forward "\^L\n0, unseen,,\n")
	    (delete-region (point-min) (point))
	    (while (search-forward "\nFrom " nil t)
	      (forward-char -5)
	      (insert ?>))
	    (goto-char (point-min))
	    (insert (concat "\nFrom popserver " (current-time-string) "\n"))
	    (let ((msg-counter 1))
	      (while (search-forward "\^_\^L\n0, unseen,,\n" nil t)
		(setq msg-counter (1+ msg-counter))
		(delete-region (- (point) 15) (point))
		(insert (concat "\nFrom popserver " (current-time-string) "\n")))
	      (delete-region (1- (point-max)) (point-max)))
	    (goto-char (point-max))
	    (insert "\n")
	    (write-file tofile))
	(kill-buffer buffer)))))

(defun vm-athena-make-fake-spool ()
  "Get pop mail in vm-athena-fake-spool-file."
  (let ((tmp (concat vm-athena-tmp-directory 
		     (make-temp-name vm-athena-tmpfile-prefix))))
    (vm-athena-get-pop-mail tmp)
    (if (or (not (file-exists-p tmp))
	    (equal 0 (nth 7 (file-attributes tmp))))
	t
      (if (equal 0 (nth 7 (file-attributes vm-athena-fake-spool-file)))
	  (delete-file vm-athena-fake-spool-file))
      (vm-athena-convert-movemail-to-mbox-format tmp vm-athena-fake-spool-file)
      (delete-file tmp)
      t)))

