require("commander").setup({
	prompt_title = "Help | Keybindings",
	components = {
		"DESC",
		"KEYS",
	},
	integration = {
		telescope = {
			enable = true,
			theme = require("telescope.themes").commander,
		},
	},
})

local lspconfig = require("lspconfig")

-- Use LspAttach autocommand to only map the following keys
-- after the language server attaches to the current buffer
local lsp_antach_done = false
vim.api.nvim_create_autocmd("LspAttach", {
	group = vim.api.nvim_create_augroup("UserLspConfig", {}),
	callback = function(ev)
		-- Buffer local mappings.
		-- See `:help vim.lsp.*` for documentation on any of the below functions
		local opts = { buffer = ev.buf }

		require("commander").add({
			{
				desc = "LSP Quickfix",
				cmd = function()
					vim.lsp.buf.code_action({
						filter = function(a)
							return a.kind ~= "quickfix" or a.isPreferred
						end,
						apply = true,
					})
				end,
				keys = { "n", "qf", opts },
			},
			{ desc = "LSP Declaration", cmd = vim.lsp.buf.declaration, keys = { "n", "gD", opts } },
			{ desc = "LSP Definition", cmd = vim.lsp.buf.definition, keys = { "n", "gd", opts } },
			{ desc = "LSP Hover", cmd = vim.lsp.buf.hover, keys = { "n", "K", opts } },
			{ desc = "LSP Rename", cmd = vim.lsp.buf.rename, keys = { "n", "rn", opts } },
			{ desc = "LSP Implementation", cmd = vim.lsp.buf.implementation, keys = { "n", "gi", opts } },
			{ desc = "LSP Signature Help", cmd = vim.lsp.buf.signature_help, keys = { "n", "<C-k>", opts } },
			{ desc = "LSP Code Action", cmd = vim.lsp.buf.code_action, keys = { "n", "<leader>ca", opts } },
			{
				desc = "LSP Format",
				cmd = function()
					vim.lsp.buf.format({ async = true })
				end,
				keys = { "n", "<leader>f", opts },
			},
			{
				desc = "LSP Diagnostics",
				cmd = function()
					require("trouble").toggle("document_diagnostics")
				end,
				keys = { "n", "<leader>d" },
			},
			{
				desc = "LSP Diagnostics whole workspace",
				cmd = function()
					require("trouble").toggle("workspace_diagnostics")
				end,
				keys = { "n", "<space>dw" },
			},
			{ desc = "LSP References", cmd = "<CMD>Telescope lsp_references<CR>", keys = { "n", "<leader>gr" } },

			{ desc = "LSP Definitions", cmd = "<CMD>Telescope lsp_definitions<CR>", keys = { "n", "<leader>fcde" } },
			{
				desc = "LSP Document Symbols",
				cmd = "<CMD>Telescope lsp_document_symbols<CR>",
				keys = { "n", "<leader>fcds" },
			},
			{
				desc = "LSP Workspace Symbols",
				cmd = "<CMD>Telescope lsp_workspace_symbols<CR>",
				keys = { "n", "<leader>fcws" },
			},
		}, { show = not lsp_attach_done })

		lsp_attach_done = true
	end,
})

require("commander").add({
	{
		desc = "Open Help",
		cmd = require("commander").show,
		keys = { "n", "<Leader>h" },
	},
	{
		desc = "Search for files in git",
		cmd = "<CMD>Telescope git_files<CR>",
		keys = { "n", "<c-p>" },
	},
	{ desc = "Search for files", cmd = "<CMD>Telescope find_files<CR>", keys = { "n", "<leader>ff" } },
	{ desc = "Search for string", cmd = "<CMD>Telescope live_grep<CR>", keys = { "n", "<leader>fg" } },
	{ desc = "Git Commits", cmd = "<CMD>Telescope git_commits<CR>", keys = { "n", "<leader>fgc" } },
	{ desc = "Git Branches", cmd = "<CMD>Telescope git_branches<CR>", keys = { "n", "<leader>fgb" } },
	{ desc = "Git Status", cmd = "<CMD>Telescope git_status<CR>", keys = { "n", "<leader>fgs" } },
	{ desc = "Terraform Doc", cmd = "<CMD>Telescope terraform_doc<CR>", keys = { "n", "<leader>ftf" } },
	{ desc = "Terraform Modules", cmd = "<CMD>Telescope terraform_doc modules<CR>", keys = { "n", "<leader>ftm" } },
	{
		desc = "Terraform AWS",
		cmd = "<CMD>Telescope terraform_doc full_name=hashicorp/aws<CR>",
		keys = { "n", "<leader>ftfa" },
	},
	{
		desc = "Terraform Kubernetes",
		cmd = "<CMD>Telescope terraform_doc full_name=hashicorp/kubernetes<CR>",
		keys = { "n", "<leader>ftfk" },
	},
})