local map = vim.keymap.set

map("n", ";", ":", { desc = "CMD enter command mode" })

map("i", "<C-h>", "<Left>", { desc = "move left" })
map("i", "<C-l>", "<Right>", { desc = "move right" })
map("i", "<C-j>", "<Down>", { desc = "move down" })
map("i", "<C-k>", "<Up>", { desc = "move up" })

map("n", "<C-h>", "<C-w>h", { desc = "switch window left" })
map("n", "<C-l>", "<C-w>l", { desc = "switch window right" })
map("n", "<C-j>", "<C-w>j", { desc = "switch window down" })
map("n", "<C-k>", "<C-w>k", { desc = "switch window up" })

map("n", "<C-n>", "<cmd>NeoTreeShowToggle<CR>", { desc = "nvimtree toggle window" })

map("n", "<C-A-l>", "<cmd>BufferLineMoveNext<cr>", { desc = "move buffer to right" })
map("n", "<C-A-J>", "<cmd>BufferLineMovePrev<cr>", { desc = "move buffer to left" })
map("n", "<Tab>", "<cmd>BufferLineCycleNext<cr>", { desc = "switch to next buffer" })
map("n", "<S-Tab>", "<cmd>BufferLineCyclePrev<cr>", { desc = "switch to prev buffer" })

lvim.builtin.which_key.mappings["ln"] = { "<cmd>set norelativenumber<CR>", "Toggle line number" }
lvim.builtin.which_key.mappings["e"] = { "<cmd>NeoTreeFocus<CR>", "Nvimtree focus window" }
lvim.builtin.which_key.mappings["rn"] = { "<cmd>set relativenumber<CR>", "Toggle relative number" }
lvim.builtin.which_key.mappings["ns"] = { "<Cmd>split<cr>", "Horizontal split" }
lvim.builtin.which_key.mappings["vs"] = { "<Cmd>vsplit<cr>", "Vertical split" }

map("n", "<F9>", "<cmd>DapContinue<cr>")
map("n", "<F5>", "<cmd>DapToggleBreakpoint<cr>")

map("n", "mk", "<cmd>RustLsp moveItem up<cr>")
map("n", "m,", "<cmd>RustLsp moveItem down<cr>")
map("n", "rs", "<cmd>RustLsp run<cr>")
map("n", "hh", "<cmd>RustLsp hover actions<cr>")
map("n", "ca", "<cmd>RustLsp codeAction<cr>")
map("n", "<C-s>", "<cmd>w!<cr>")
map("i", "<C-s>", "<cmd>w!<cr>")

map("n", "<leader>dr", "<cmd> DapContinue <cr>", { desc = "Continue debug" } )

map("n", "do", function()
  require("dapui").open()
end, { desc = "Open DAP ui" })
map("n", "dc", function()
  require("dapui").close()
end, { desc = "Start or continue debug" })
map("n", "dt", function()
  require("dapui").toggle()
end, { desc = "Toggle DAP ui" })

map("n", "+", "<cmd>vertical resize +5<cr>", { desc = "Increase vertical buffer" }) -- make the window biger vertically
map("n", "-", "<cmd>vertical resize -5<cr>", { desc = "Decrease vertical buffer" }) -- make the window smaller vertically
map("n", "=", "<cmd>horizontal resize -2<cr>", { desc = "Decrease horizontal buffer" }) -- make the window smaller horizontally by pressing shift and -
map("n", "_", "<cmd>horizontal resize +2<cr>", { desc = "Increase horizontal buffer" }) -- make the window bigger horizontally by pressing shift and =
map("n", "<C-{>", "<cmd>foldopen<cr>")
map("n", "<C-}>", "<cmd>foldclose<cr>")
