{
  lib,
  config,
  options,
  ...
}:
let
  # cfg = config.plugins.lspconfig;
  opts = options.plugins.lspconfig;
  oldCfg = config.plugins.lsp;
  oldOpts = options.plugins.lsp;
in
lib.nixvim.plugins.mkNeovimPlugin {
  name = "lspconfig";
  packPathName = "nvim-lspconfig";
  package = "nvim-lspconfig";

  maintainers = with lib.maintainers; [
    GaetanLepage
    HeitorAugustoLN
    MattSturgeon
    khaneliman
    traxys
  ];

  description = ''
    [nvim-lspconfig] provides default configs for many language servers, but it does not enable any of them.
    You should use the [`lsp`] module to configure and enable LSP servers.

    > [!NOTE]
    > This plugin module will soon replace [`plugins.lsp`].
    >
    > Both `${opts.enable}` and `${oldOpts.enable}` will install nvim-lspconfig,
    > however the older [`plugins.lsp`] module includes additional options and
    > setup that relate to neovim's builtin LSP and are now being moved to the
    > new [`lsp`] module.

    [`lsp`]: ../../lsp/servers/index.md
    [`plugins.lsp`]: ../lsp/index.md
    [nvim-lspconfig]: ${opts.package.default.meta.homepage}
  '';

  # nvim-lspconfig provides configs for `vim.lsp.config` and requires no setup
  # all configuration should be done via nvim's builtin `vim.lsp` API
  callSetup = false;
  hasLuaConfig = false;
  hasSettings = false;

  extraConfig = {
    warnings = lib.nixvim.mkWarnings "plugins.lspconfig" [
      {
        when = oldCfg.enable;
        message = ''
          Both `${opts.enable}' and `${oldOpts.enable}' configure the same plugin (nvim-lspconfig).
          ${lib.pipe
            [ opts oldOpts ]
            [
              (builtins.catAttrs "enable")
              (map (o: "`${o}' defined in ${lib.options.showFiles o.files}."))
              lib.strings.concatLines
            ]
          }
        '';
      }
    ];
  };
}
