;;; feature/syntax-checker/autoload.el -*- lexical-binding: t; -*-

(defun +syntax-checker-show-popup (errors)
  "TODO"
  (if (and EMACS26+
           (featurep! +childframe)
           (display-graphic-p))
      (flycheck-posframe-show-posframe errors)
    (flycheck-popup-tip-show-popup errors)))

(defun +syntax-checker-cleanup-popup ()
  "TODO"
  (when (display-graphic-p)
    (flycheck-popup-tip-delete-popup)))

;;;###autoload
(define-minor-mode +syntax-checker-popup-mode
  "TODO"
  :lighter nil
  :group 'doom
  (if (featurep! +childframe)
      (require 'flycheck-posframe)
    (require 'flycheck-popup-tip))
  (let ((hooks '(post-command-hook focus-out-hook)))
    (cond
     ;; Use our display function and remember the old one but only if we haven't
     ;; yet configured it, to avoid activating twice.
     ((and +syntax-checker-popup-mode
           (not (eq flycheck-display-errors-function
                    #'+syntax-checker-show-popup)))
      (setq flycheck-popup-tip-old-display-function
            flycheck-display-errors-function
            flycheck-display-errors-function
            #'+syntax-checker-show-popup)
      (dolist (hook hooks)
        (add-hook hook #'+syntax-checker-cleanup-popup nil t)))
     ;; Reset the display function and remove ourselves from all hooks but only
     ;; if the mode is still active.
     ((and (not +syntax-checker-popup-mode)
           (eq flycheck-display-errors-function
               #'+syntax-checker-show-popup))
      (setq flycheck-display-errors-function
            flycheck-popup-tip-old-display-function
            flycheck-popup-tip-old-display-function nil)
      (dolist (hook hooks)
        (remove-hook hook '+syntax-checker-cleanup-popup t))))))