local M = {}

local map = vim.keymap.set

function M.lsp(buffer, client)
  local opts = {
    buffer = buffer,
    noremap = true,
    silent = true,
  }

  map("n", "gd", vim.lsp.buf.definition, opts)
  map("n", "gD", vim.lsp.buf.declaration, opts)
  map("n", "gr", vim.lsp.buf.references, opts)
  map("n", "gi", vim.lsp.buf.implementation, opts)
  map("n", "K", vim.lsp.buf.hover, opts)
  map("n", "<leader>rn", vim.lsp.buf.rename, opts)
  map("n", "<leader>ca", vim.lsp.buf.code_action, opts)
  map("n", "<leader>cf", function() vim.lsp.buf.format({ async = true; }) end, opts)

  if client and client.name == "clangd" then
    map("n", "<leader>hs", "<cmd>ClangdSwitchSourceHeader<cr>", opts)
  end
end

function M.telescope()
  local opts = {
    noremap = true,
    silent = true,
  }

  map("n", "<leader>ff", function()
    require("telescope.builtin").find_files()
  end, opts)

  map("n", "<leader>fg", function()
    require("telescope.builtin").live_grep()
  end, opts)

  map("n", "<leader>fb", function()
    require("telescope.builtin").buffers()
  end, opts)

  map("n", "<leader>fh", function()
    require("telescope.builtin").help_tags()
  end, opts)

  map("n", "<leader>dd", function()
    require("telescope.builtin").diagnostics()
  end, opts)
end

function M.global()
  local opts = {
    noremap = true,
    silent = true,
  }

  map("n", "ö", "}", opts)
  map("n", "ä", "{", opts)

  map("n", "<leader>K", function()
    vim.diagnostic.open_float({ scope = "cursor", border = "rounded" })
  end, opts)
  map("n", "<leader>q", vim.diagnostic.setloclist, opts)

  map("n", "[d", function()
    vim.diagnostic.jump_prev({ wrap = false })
  end, opts)

  map("n", "]d", function()
    vim.diagnostic.jump_next({ wrap = false })
  end, opts)

  map("n", "[e", function()
    vim.diagnostic.jump_prev({
      severity = vim.diagnostic.severity.ERROR,
      wrap = false
    })
  end, opts)

  map("n", "]e", function()
    vim.diagnostic.jump_next({
      severity = vim.diagnostic.severity.ERROR,
      wrap = false
    })
  end, opts)

  vim.keymap.set("n", "<leader>ts", function()
    vim.opt_local.spell = not vim.opt_local.spell:get()
  end, { desc = "Toggle spell checking" })
end

return M
