local formatters = {
	angular = { "prettier" },
	astro = { "prettier" },
	bash = { "shfmt" },
	bib = { "bibtex-tidy" },
	css = { "prettier", "rustywind" },
	go = { "gofumpt" },
	graphql = { "prettier" },
	html = { "prettier", "rustywind" },
	javascript = { "prettier" },
	javascriptreact = { "prettier" },
	json = { "jq" },
	liquid = { "prettier" },
	lua = { "stylua" },
	markdown = { "prettier", "injected" },
	python = { "ruff_fix", "ruff_format", "ruff_organize_imports" },
	quarto = { "prettier", "injected" },
	sh = { "shfmt" },
	sql = { "sleek" },
	svelte = { "prettier" },
	typescript = { "prettier" },
	typescriptreact = { "prettier" },
	vue = { "prettier", "rustywind" },
	yaml = { "prettier" },
	zsh = { "shfmt" },
}

return {
	-- formatting setup
	{
		"zapling/mason-conform.nvim",
		dependencies = {
			{
				"stevearc/conform.nvim",
				config = function()
					require("conform").setup({
						formatters_by_ft = formatters,
						lsp_format = "fallback",
						format_after_save = function(bufnr)
							if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then
								return
							end
							return { lsp_fallback = true }
						end,
					})
					require("conform").formatters.prettier = {
						options = {
							ext_parsers = {
								qmd = "markdown",
							},
						},
					}
					vim.api.nvim_create_user_command("FormatDisable", function(args)
						if args.bang then
							vim.g.disable_autoformat = true
						else
							-- FormatDisable! will disable formatting globally
							vim.b.disable_autoformat = true
						end
					end, {
						desc = "Disable formatting on save",
						bang = true,
					})
					vim.api.nvim_create_user_command("FormatEnable", function()
						vim.b.disable_autoformat = false
						vim.g.disable_autoformat = false
					end, {
						desc = "Enable formatting on save",
					})
				end,
				cmd = { "ConformInfo" },
				keys = {
					{
						"<localleader>ll",
						function()
							require("conform").format({ async = true, lsp_fallback = true })
						end,
						mode = { "n", "v" },
						desc = "Format buffer",
					},
					{
						"<localleader>lL",
						function()
							vim.g.disable_autoformat = not vim.g.disable_autoformat
						end,
						desc = "Toggle AutoFormat",
					},
					{
						"<leader>vf",
						":ConformInfo<cr>",
						desc = "ConformInfo",
					},
				},
				init = function()
					-- If you want the formatexpr, here is the place to set it
					vim.o.formatexpr = "v:lua.require'conform'.formatexpr()"
				end,
			},
		},
		event = { "BufWritePre" },
		opts = {},
	},
}
