;; -*- lexical-binding: t; -*-

;; Clojure configuration
(use-package clojure-mode
  :mode (("\\.clj\\'" . clojure-mode)
         ("\\.cljs\\'" . clojurescript-mode)
         ("\\.cljc\\'" . clojurec-mode)
         ("\\.edn\\'" . clojure-mode))
  :config
  (define-clojure-indent
    (defroutes 'defun)
    (GET 2)
    (POST 2)
    (PUT 2)
    (DELETE 2)
    (HEAD 2)
    (ANY 2)
    (OPTIONS 2)
    (PATCH 2)
    (rfn 2)
    (let-routes 1)
    (context 2)
    (:= 3)
    (:+ 3)
    (match 1)
    (for-all 2)
    (checking 2)
    (let-flow 1)))

;; Flycheck support
(use-package flycheck-clj-kondo
  :after (clojure-mode)
  :if (executable-find "clj-kondo"))

(use-package cider
  :commands (cider-mode cider-jack-in cider-jack-in-clojurescript)
  :custom
  (cider-known-endpoints
   '(("local" "localhost" "4005")))
  (cider-prompt-for-symbol nil)
  (cider-comment-prefix ";; => ")
  :hook ((clojure-mode . cider-mode)
         (clojurescript-mode . cider-mode)
         (clojurec-mode . cider-mode))
  :config
  (evil-collection-cider-setup)
  (general-def cider-mode-map "C-c t" cider-test-commands-map)
  (general-def normal cider--debug-mode-map "," cider--debug-mode-map)
  :general
  (cider-stacktrace-mode-map "SPC" leader-map)
  (normal cider-mode-map "M-." #'cider-find-var)
  (cider-mode-map "C-c M-b" #'cider-debug-defun-at-point)
  (cider-mode-map "C-c M-;" #'cider-pprint-eval-defun-to-comment)
  (cider-repl-mode-map "C-c C-l" #'cider-repl-clear-buffer))

(provide 'init-clojure)