-- Exit if the language server isn't available
if vim.fn.executable('clangd') ~= 1 then
  return
end

-- require'lspconfig'.clangd.setup{}

local root_files = {
  'compile_commands.json',
  '.vscode',
  '.git',
}

local root = vim.fs.dirname(vim.fs.find(root_files, { upward = true })[1])

vim.lsp.start {
  name = 'clangd',
  cmd = { 'clangd' },
  root_dir = root,
  capabilities = require('user.lsp').make_client_capabilities(),
  filetypes = { "c" },
  on_attach = function(client, bufnr)
    require("nvim-navic").attach(client, bufnr)
    require("workspace-diagnostics").populate_workspace_diagnostics(client, bufnr)
  end
}

local dap = require("dap")
local pickers = require("telescope.pickers")
local finders = require("telescope.finders")
local conf = require("telescope.config").values
local actions = require("telescope.actions")
local action_state = require("telescope.actions.state")

if vim.fn.executable('gdb') == 1 then
  dap.adapters.gdb = {
    type = "executable",
    command = "gdb",
    args = { "-i", "dap" }
  }
end

-- DAP loads this automatically as of now. May be needed to load the debugger for asm?
-- if require('user.file_exists').file_exists(root .. "/.vscode/launch.json") then
--   require("dap.ext.vscode").load_launchjs(nil, { cppdbg = { "c", "cpp", "asm" } })
--   require("dap.ext.vscode").load_launchjs(nil, { gdb = { "c", "cpp", "asm" } })
-- end

if vim.fn.executable('OpenDebugAD7') == 1 then
  dap.adapters.cppdbg = {
    id = 'cppdbg',
    type = 'executable',
    command = 'OpenDebugAD7',
  }

  dap.configurations.c = {
    {
      name = "Launch an executable",
      type = "cppdbg",
      request = "launch",
      cwd = "${workspaceFolder}",
      program = function()
        return coroutine.create(function(coro)
          local opts = {}
          pickers
              .new(opts, {
                prompt_title = "Path to executable",
                finder = finders.new_oneshot_job({ "fd", "--hidden", "--no-ignore", "--type", "x" }, {}),
                sorter = conf.generic_sorter(opts),
                attach_mappings = function(buffer_number)
                  actions.select_default:replace(function()
                    actions.close(buffer_number)
                    coroutine.resume(coro, action_state.get_selected_entry()[1])
                  end)
                  return true
                end,
              })
              :find()
        end)
      end,
      stopAtBeginningOfMainSubprogram = true,
    },
  }
end