local function augroup(name)
  return vim.api.nvim_create_augroup(name, {})
end

local autocmd = vim.api.nvim_create_autocmd

-- adapted from https://github.com/ethanholz/nvim-lastplace/blob/main/lua/nvim-lastplace/init.lua
local ignore_buftype = { "quickfix", "nofile", "help" }
local ignore_filetype = { "gitcommit", "gitrebase", "svn", "hgcommit" }

local function run()
  if vim.tbl_contains(ignore_buftype, vim.bo.buftype) then
    return
  end

  if vim.tbl_contains(ignore_filetype, vim.bo.filetype) then
    -- reset cursor to first line
    vim.cmd [[normal! gg]]
    return
  end

  -- If a line has already been specified on the command line, we are done
  --   nvim file +num
  if vim.fn.line(".") > 1 then
    return
  end

  local last_line = vim.fn.line([['"]])
  local buff_last_line = vim.fn.line("$")

  -- If the last line is set and the less than the last line in the buffer
  if last_line > 0 and last_line <= buff_last_line then
    local win_last_line = vim.fn.line("w$")
    local win_first_line = vim.fn.line("w0")
    -- Check if the last line of the buffer is the same as the win
    if win_last_line == buff_last_line then
      -- Set line to last line edited
      vim.cmd [[normal! g`"]]
      -- Try to center
    elseif buff_last_line - last_line >
        ((win_last_line - win_first_line) / 2) - 1 then
      vim.cmd [[normal! g`"zz]]
    else
      vim.cmd [[normal! G'"<c-e>]]
    end
  end
end

augroup("restore position")
autocmd("BufReadPost", {
  once = true,
  group = "restore position",
  callback = run
})

augroup("postwrite")
autocmd("BufWritePost", {
  group = "postwrite",
  pattern = ".Xkeymap",
  command = "!xkbcomp % $DISPLAY",
})
autocmd("BufWritePost", {
  group = "postwrite",
  pattern = "*bspwmrc",
  command = "!bspc wm --restart",
})
autocmd("BufWritePost", {
  group = "postwrite",
  pattern = "*/polybar/config",
  command = "!polybar-msg cmd restart",
})
autocmd("BufWritePost", {
  group = "postwrite",
  pattern = "user-dirs.dirs,user-dirs.locale",
  command = "!xdg-user-dirs-update",
})
autocmd("BufWritePost", {
  group = "postwrite",
  pattern = "plugins.lua",
  command = "source % | PackerSync",
})
autocmd("BufWritePost", {
  group = "postwrite",
  pattern = "dunstrc",
  command = "!killall -SIGUSR2 dunst",
})
autocmd(
  "BufWritePost",
  { group = "postwrite", pattern = "fonts.conf", command = "!fc-cache" }
)

augroup("autocomplete")
autocmd("CompleteDone", {
  group = "autocomplete",
  command = "if pumvisible() == 0 | silent! pclose | endif",
})

augroup("reload")
autocmd("CompleteDone", {
  group = "reload",
  command = "if getcmdwintype() == '' | checktime | endif",
})

augroup("highlightyank")
autocmd(
  "TextYankPost",
  { group = "highlightyank", callback = vim.highlight.on_yank }
)

augroup("quitro")
autocmd("BufReadPost", {
  group = "quitro",
  callback = function()
    if vim.opt.readonly:get() then
      vim.keymap.set("n", "q", "<cmd>q<cr>")
    end
  end,
})

augroup("localinit")
autocmd("VimEnter", {
  group = "localinit",
  callback = function()
    local settings = vim.fn.findfile(".doit.lua", ".;")
    if settings ~= "" then
      print("sourcing local config")
      dofile(settings)
    end
  end,
})

augroup("restore guicursor")
autocmd("VimLeave", {
  once = true,
  group = "restore guicursor",
  command = 'set guicursor= | call chansend(v:stderr, "\x1b[ q")'
})