-- lua_add {{{
local vimx = require("artemis")
local prefix = "<Plug>(ddu-prefix)"

vimx.keymap.set("n", "<C-p>", prefix)
vimx.keymap.set("n", prefix .. "<C-p>", function()
  vimx.fn.ddu.start({
    ui = "ff",
    sources = { {
      name = "file_external",
    } },
  })
end)

vimx.keymap.set("n", prefix .. "<C-w>", function()
  vimx.fn.ddu.start({
    ui = "ff",
    sources = { {
      name = "mr",
    } },
  })
end)

vimx.keymap.set("n", prefix .. "<C-i>", function()
  vimx.fn.ddu.start({
    ui = "ff",
    sources = { {
      name = "redmine_issue",
    } },
  })
end)

vimx.keymap.set("n", prefix .. "<C-b>", function()
  vimx.fn.ddu.start({
    ui = "ff",
    sources = { {
      name = "buffer",
    } },
  })
end)

vimx.keymap.set("n", prefix .. "<C-l>", function()
  vimx.fn.ddu.start({
    ui = "ff",
    sources = { {
      name = "rg",
      options = { marcher = {} },
    } },
    uiParams = {
      ff = { ignoreEmpty = false },
    },
    volatile = true,
  })
end)

vimx.keymap.set("n", prefix .. "<C-t>", function()
  local id = vimx.fn.denops.callback.register(function(s)
    vimx.fn.sonictemplate.apply(s, "n")
  end, { once = true })
  vimx.fn.ddu.start({
    sources = {
      {
        name = "custom-list",
        params = {
          texts = vimx.fn.sonictemplate.complete("", "", 0),
          callbackId = id,
        },
      },
    },
  })
end)

vimx.keymap.set("n", prefix .. "<C-d>", function()
  vimx.fn.ddu.start({
    sources = {
      {
        name = "git_diff",
        uiParams = {
          ff = { ignoreEmpty = false },
        },
        options = {
          path = vimx.fn.expand("%:p"),
        },
      },
    },
  })
end)

local function grepWrapper(word)
  if word == "" then
    return
  end
  vimx.fn.ddu.start({
    ui = "ff",
    sources = { {
      name = "rg",
      params = { input = word },
    } },
    sourceOptions = {
      rg = {
        matchers = {
          "converter_display_word",
          "matcher_fzf",
        },
      },
    },
  })
end

vimx.create_command("DduGrep", function(opts)
  grepWrapper(opts.args)
end, { nargs = 1 })

vimx.keymap.set("n", prefix .. "<C-g>", ":<C-u>DduGrep<Space>")

vimx.keymap.set("n", prefix .. "g", function()
  grepWrapper(vimx.fn.expand("<cword>"))
end)

vimx.keymap.set("n", "gd", function()
  vimx.fn.ddu.start({
    ui = "ff",
    sources = { {
      name = "anyjump_definition",
    } },
  })
end)

vimx.keymap.set("n", "gr", function()
  vimx.fn.ddu.start({
    ui = "ff",
    sources = { {
      name = "anyjump_reference",
    } },
  })
end)

local function DduHelp()
  vimx.fn.ddu.start({
    ui = "ff",
    sources = { {
      name = "help",
    } },
    sourceOptions = {
      rg = {
        matchers = {
          "matcher_fzf",
        },
      },
    },
  })
end

vimx.create_command("Dhelp", DduHelp, { nargs = 0 })

vimx.keymap.set("ca", "dhelp", "Dhelp")

-- DONT MAP DEFAULTLY {{{
vim.keymap.del("n", "grr")
vim.keymap.del("n", "gra")
vim.keymap.del("n", "grn")
--- }}}
vimx.create_autocmd("LspAttach", {
  pattern = "*",
  group = vimx.create_augroup("vimrc#ddu#lsp", { clear = true }),
  callback = function()
    vimx.keymap.set("n", "gr", function()
      vimx.fn.ddu.start({
        ui = "ff",
        sources = { {
          name = "lsp_references",
        } },
      })
    end, { buffer = true })

    vimx.keymap.set("n", "gd", function()
      vimx.fn.ddu.start({
        ui = "ff",
        uiParams = {
          ff = {
            immediateAction = "open",
          },
        },
        sources = {
          {
            name = "lsp_definition",
            params = { method = "textDocument/definition" },
          },
        },
        sync = true,
      })
    end, { buffer = true })

    vimx.keymap.set("n", "<Space>a", function()
      vimx.fn.ddu.start({
        ui = "ff",
        sources = { {
          name = "lsp_codeAction",
        } },
      })
    end, { buffer = true })
  end,
})
-- }}}

-- lua_source {{{
local vimx = require("artemis")
vimx.fn.ddu.custom.load_config(vimx.fn.expand("$DEIN_RC_DIR/ts/ddu.ts"))
-- }}}