local source = require("copilot_cmp.source")
local capabilities = require("copilot_cmp.capabilities")

---Registered client and source mapping.
local M = {
  client_source_map = {},
  registered = false,
  default_capabilities = capabilities.default_capabilities,
  update_capabilities = capabilities.update_capabilities,
}

local default_opts = {
  event = { "InsertEnter", "LspAttach" },
  fix_pairs = true,
}

M._on_insert_enter = function(opts)
  local find_buf_clients = function()
    if vim.lsp.get_clients == nil then
      return vim.tbl_filter(function (client)
        return client.name == "copilot"
      end, vim.lsp.get_active_clients())
    end

    return vim.lsp.get_clients({
      name = "copilot",
      bufnr = vim.api.nvim_get_current_buf()
    })
  end

  local cmp = require("cmp")
  local clients = find_buf_clients()

  if #clients == 0 then
    return
  end

  for _, copilot in ipairs(clients) do
    if not M.client_source_map[copilot.id] then
      local s = source.new(copilot, opts)
      if s:is_available() then
        M.client_source_map[copilot.id] = cmp.register_source("copilot", s)
      end
    end
  end
end


M.setup = function(opts)
  opts = vim.tbl_deep_extend("force", default_opts, opts or {})
  -- just in case someone decides to set event to nil for some reason
  local startEvent = opts.event or { "InsertEnter", "LspAttach" }

  vim.api.nvim_create_autocmd(startEvent, {
    callback = function ()
      M._on_insert_enter(opts)
    end
  })
end

return M