local global = require("config.global")
local settings = require("config.settings")

---@type boolean
local need_all_servers = settings.need_all_servers

---@type LazySpec
local spec = {
    "williamboman/mason.nvim",
    --lazy = false,
    cmds = require("plugins.mason-nvim.cmds"),
    event = "VeryLazy",
    dependencies = require("plugins.mason-nvim.dependencies"),
    config = function()
        local lspconfig = require("lspconfig")
        local configs = require("lspconfig.configs")
        local mason_lspconfig = require("mason-lspconfig")
        local mason_conform = require("mason-conform")
        local mason_nvim_dap = require("mason-nvim-dap")

        require("neoconf").setup({})
        require("mason").setup(require("plugins.mason-nvim.opts"))

        -- LSP
        mason_lspconfig.setup({
            ensure_installed = require("plugins.mason-nvim.lsp-servers"),
        })

        mason_lspconfig.setup_handlers({
            function(server_name)
                lspconfig[server_name].setup({
                    capabilities = settings.use_blink_cmp and require("blink.cmp").get_lsp_capabilities()
                        or require("cmp_nvim_lsp").default_capabilities(),
                })
            end,
            ["rust_analyzer"] = function() end,
            ["lua_ls"] = function()
                lspconfig.lua_ls.setup(require("plugins.lsp-confs.lua-ls"))
            end,
            ["jsonls"] = function()
                lspconfig.jsonls.setup(require("plugins.lsp-confs.jsonls"))
            end,
            ["yamlls"] = function()
                lspconfig.yamlls.setup(require("plugins.lsp-confs.yamlls"))
            end,
            ["markdown_oxide"] = function()
                lspconfig.markdown_oxide.setup(require("plugins.lsp-confs.markdown-oxide"))
            end,
        })

        if not configs.iwes then
            configs.iwes = {
                default_config = {
                    cmd = { "iwes" },
                    filetypes = { "markdown" },
                    root_dir = function(fname)
                        --local root_git = vim.fs.dirname(vim.fs.find(".git", { path = fname, upward = true })[1])
                        local root_iwe = vim.fs.dirname(vim.fs.find(".iwe", { path = fname, upward = true })[1])
                        --return root_git or root_iwe
                        return root_iwe
                    end,
                    single_file_support = true,
                },
            }
        end

        lspconfig.bashls.setup({})
        lspconfig.cssls.setup({})
        lspconfig.denols.setup({})
        lspconfig.docker_compose_language_service.setup({})
        lspconfig.dockerls.setup({})
        lspconfig.eslint.setup({})
        lspconfig.html.setup({})
        lspconfig.jsonls.setup({})
        lspconfig.lua_ls.setup({})
        lspconfig.luau_lsp.setup({})
        lspconfig.marksman.setup({})
        lspconfig.powershell_es.setup({})
        lspconfig.pyright.setup({})
        lspconfig.taplo.setup({})
        lspconfig.ts_ls.setup({})
        lspconfig.typos_lsp.setup({})
        lspconfig.vimls.setup({})
        lspconfig.yamlls.setup({})
        if not global.is_windows then
            lspconfig.markdown_oxide.setup({})
            lspconfig.svelte.setup({})
            lspconfig.fish_lsp.setup({})
            lspconfig.kulala_ls.setup({})
            lspconfig.superhtml.setup({})
            lspconfig.iwes.setup({})
            if need_all_servers then
                lspconfig.csharp_ls.setup({})
                lspconfig.esbonio.setup({})
                lspconfig.gopls.setup({})
                lspconfig.jqls.setup({})
                lspconfig.nil_ls.setup({})
                lspconfig.solargraph.setup({})
            end
        end
        if need_all_servers then
            lspconfig.clangd.setup({})
            lspconfig.ctags_lsp.setup({})
            lspconfig.efm.setup({})
            lspconfig.graphql.setup({})
            lspconfig.neocmake.setup({})
            lspconfig.zls.setup({})
            lspconfig.sqls.setup({})
        end

        mason_conform.setup({
            ensure_installed = require("plugins.mason-nvim.formatters"),
            handlers = {
                function(formatter_name)
                    require("conform").formatters_by_ft = mason_conform.formatter_handler(formatter_name)
                end,
            },
        })

        require("mason-nvim-lint").setup({
            ensure_installed = require("plugins.mason-nvim.linters"),
            automatic_installation = true,
            quiet_mode = false,
        })

        -- DAP
        mason_nvim_dap.setup({
            ensure_installed = require("plugins.mason-nvim.dap-adapters"),
            handlers = {
                function(config)
                    mason_nvim_dap.default_setup(config)
                end,
            },
        })

        -- Utils
        require("mason-lock").setup({
            lockfile_path = global.mason_lockfile,
        })
    end,
    --cond = false,
    --enabled = false,
}

return spec