local utils = require 'custom.utils'

local ltex_fts = {
	'bibtex',
	'bib',
	'tex',
	'typst',
	'latex',
	'gitcommit',
	'markdown',
	'org',
	'restructuredtext',
	'rsweave',
	'quarto',
	'rmd',
	'context',
	'text',
	'html',
	'pandoc',
	'xhtml',
	'plaintex',
	'quarto',
	'mail',
	'mdx',
	'rmd',
	'rnoweb',
	'rst',
}

local map = function(keys, func, desc)
	vim.keymap.set('n', keys, func, { buffer = vim.buf, desc = 'LSP[LTEX]: ' .. desc })
end

LTEX_SETTINGS = {
	capabilities = CAPABILITIES,
	on_attach = function(client, bufnr)
		DEFAULT_ON_ATTACH(client, bufnr)
	end,
	autostart = false,
	filetypes = ltex_fts,
	settings = {
		ltex = {
			checkFrequency = 'save', -- shut up while i'm just editing, see <https://github.com/folke/noice.nvim/issues/166>
			-- specific language (such as en-GB or de-DE is recommended, but I
			-- want multilingual)
			language = 'auto',
			enabled = ltex_fts,
			additionalRules = {
				enablePickyRules = true,
				-- thats cool, but often adds diagnostics in
				-- places where a german might confuse words that are similar
				-- between english and german REGARDLESS of context. I seem to use the
				-- english words only in the proper contexts, so leaving this on
				-- just adds annoying hints like 'Hinweis: "list/NN.*" (English) bedeutet "Liste",
				-- "Verzeichnis" (German). Meinten Sie vielleicht 'cunning', 'trick'?'
				-- everytime I use the word "list". I liked that this makes the hints be
				-- in german regardless of the language I'm working in through...
				motherTongue = 'de',
			},
		},
	},
}

-- load token and additional languagetool items later if specified
local do_not_use_api_key = true
local has_api_key, apiKey = utils.try_require 'custom.secret.languagetool'
if not do_not_use_api_key and has_api_key and apiKey ~= '' then
	LTEX_SETTINGS = vim.tbl_deep_extend('keep', LTEX_SETTINGS, {
		settings = {
			languageToolOrg = {
				apiKey = apiKey,
				username = 'accounts@cscherr.de',
			},
			languageToolHttpServerUrl = 'https://api.languagetoolplus.com/',
		},
	})
else
	if not do_not_use_api_key then
		print 'apiKey for ltex/languagetool is not specified'
	end
end

return {
	'barreiroleo/ltex_extra.nvim',
	ft = ltex_fts,
	dependencies = { 'neovim/nvim-lspconfig' },
	config = function()
		require('ltex_extra').setup {
			load_langs = { 'en-US', 'de-DE' },
			init_check = true,
			server_opts = LTEX_SETTINGS, -- or use lspconfig regularly
		}
		map('<leader>tS', function()
			vim.cmd 'set spell'
			vim.opt.spelllang = 'en,de_de'
			vim.opt.spellsuggest = 'double,50,timeout:5000'
			vim.cmd 'LspStart ltex'
		end, 'Enable spell checking with languagetool')
	end,
}
