(require 'common-lsp)
(require 'util-tree-sitter)

(defun locate-compile-commands-file ()
  "See if compile_commands.json exists."
  ;; This can be generated by prefixing the make command with `intercept-build15 --append`
  (let ((compile-commands-file (locate-dominating-file (buffer-file-name) "compile_commands.json")))
    compile-commands-file
    )
  )

(defun activate-c-eglot ()
  "Activate eglot for the c family of languages."
  (when (locate-compile-commands-file)
    (eglot-ensure)
    (defclass my/eglot-c (eglot-lsp-server) ()
      :documentation
      "Own eglot server class.")

    (add-to-list 'eglot-server-programs
                 '(c-ts-mode . (my/eglot-c "/usr/local/bin/clangd15")))
    (add-hook 'before-save-hook 'eglot-format-buffer nil 'local)
    )
  )

(use-package c-mode
  :mode (
         ("\\.c\\'" . c-ts-mode)
         ("\\.h\\'" . c-or-c++-ts-mode)
         )
  :commands (c-mode c-ts-mode)
  :pin manual
  :ensure nil
  :hook (
         (c-ts-mode . (lambda ()
                        (activate-c-eglot)
                        ))
         )
  :init
  (add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode))
  (add-to-list 'major-mode-remap-alist '(c++-mode . c++-ts-mode))
  (add-to-list 'major-mode-remap-alist '(c-or-c++-mode . c-or-c++-ts-mode))
  (add-to-list 'treesit-language-source-alist '(c "https://github.com/tree-sitter/tree-sitter-c"))
  (add-to-list 'treesit-language-source-alist '(cpp "https://github.com/tree-sitter/tree-sitter-cpp"))
  (unless (treesit-ready-p 'c) (treesit-install-language-grammar 'c))
  (unless (treesit-ready-p 'cpp) (treesit-install-language-grammar 'cpp))
  )

(provide 'lang-c)
