local M = {}

-- Mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
local opts = { noremap = true, silent = true }
vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float, opts)
vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts)
vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts)
vim.keymap.set("n", "<leader>q", vim.diagnostic.setloclist, opts)

local signs = { Error = " ", Warn = " ", Hint = " ", Info = " " }
for type, icon in pairs(signs) do
    local hl = "DiagnosticSign" .. type
    vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl })
end

require("neodev").setup()

M.on_attach = require "lsp.attach"
M.lsp_flags = require "lsp.flags"
M.capabilities = require("cmp_nvim_lsp").default_capabilities()

local servers = { "jedi_language_server", "lua_ls", "rnix", "nil_ls", "fortls" }
for _, name in ipairs(servers) do
    require("lspconfig")[name].setup {
        on_attach = M.on_attach,
        flags = M.lsp_flags,
        capabilities = M.capabilities,
    }
end

require("null-ls").setup {
    sources = require "lsp.null_ls_sources",
    on_attach = M.on_attach,
    flags = M.lsp_flags,
    capabilities = M.capabilities,
}

return M