local set = vim.keymap.set
vim.g.mapleader = " "

set("i", "jk", "<ESC>")
set("i", "kj", "<ESC>")

set({ "n", "x" }, "j", [[v:count == 0 ? "gj" : "j"]], { expr = true })
set({ "n", "x" }, "k", [[v:count == 0 ? "gk" : "k"]], { expr = true })

set({ "n", "x" }, ";", ":")
set({ "n", "x" }, ":", ";")

set({ "n", "x" }, "gy", "\"+y")
set("n", "gp", "\"+p")

set("n", "n", "nzz")
set("n", "N", "Nzz")

set("n", "<c-u>", "<c-u>zz")
set("n", "<c-d>", "<c-d>zz")

set("n", "<leader>w", "<c-w>", { remap = true })

set("n", "<cr>", function()
  if vim.v.hlsearch == 1 then
    vim.cmd.nohlsearch()
    return ""
  else
    return "<cr>"
  end
end, { expr = true })

vim.api.nvim_create_autocmd("Filetype", {
  pattern = "lua",
  group = vim.api.nvim_create_augroup("Execute Lua", { clear = true }),
  callback = function()
    set("n", "<leader>x", "<cmd>.lua<cr>", { buffer = true })
    set("x", "<leader>x", ":lua<cr>", { buffer = true })
    set("n", "<leader><leader>x", "<cmd>%lua<cr>", { buffer = true })
  end,
})

local M = {}

function M.telescope()
  local builtin = require("telescope.builtin")

  set("n", "<leader>ff", builtin.find_files)
  set("n", "<leader>fh", builtin.help_tags)
  set("n", "<leader>ft", builtin.builtin)
  set("n", "<leader>fm", builtin.man_pages)

  set("n", "<leader>fd", function()
    builtin.find_files({
      cwd = "$DOTS",
      prompt_title = "< DOTFILES >"
    })
  end)
end

function M.harpoon()
  set("", "<leader>ha", require("harpoon.mark").add_file)
  set("", "<leader>ho", require("harpoon.ui").toggle_quick_menu)

  set("", "<leader>hf", function() require("harpoon.ui").nav_file(1) end)
  set("", "<leader>hd", function() require("harpoon.ui").nav_file(2) end)
  set("", "<leader>hs", function() require("harpoon.ui").nav_file(2) end)
end

return M