{
  lib,
  pkgs,
  ...
}:
let
  inherit (lib.nixvim) defaultNullOpts;
  inherit (lib) types;
in
lib.nixvim.plugins.mkNeovimPlugin {
  name = "gitlab";
  packPathName = "gitlab.vim";
  package = "gitlab-vim";

  maintainers = [ lib.maintainers.GaetanLepage ];

  extraOptions = {
    nodePackage = lib.mkPackageOption pkgs "nodejs" {
      nullable = true;
      default = null;
    };
  };

  extraConfig = cfg: {
    extraPackages = [ cfg.nodePackage ];
  };

  settingsOptions = {
    gitlab_url = defaultNullOpts.mkStr "https://gitlab.com" ''
      The GitLab instance url to use if not `https://gitlab.com`.
    '';

    statuslines = {
      enable = defaultNullOpts.mkBool true ''
        Whether to enable statuslines.
      '';
    };

    resource_editing = {
      enable = defaultNullOpts.mkBool false ''
        Whether to enable resource editing.
      '';
    };

    minimal_message_level = defaultNullOpts.mkUnsignedInt 0 ''
      Minimal message level for logs.
    '';

    code_suggestions = {
      auto_filetypes =
        defaultNullOpts.mkListOf types.str
          [
            "c"
            "cpp"
            "csharp"
            "go"
            "java"
            "javascript"
            "javascriptreact"
            "kotlin"
            "markdown"
            "objective-c"
            "objective-cpp"
            "php"
            "python"
            "ruby"
            "rust"
            "scala"
            "sql"
            "swift"
            "terraform"
            "typescript"
            "typescriptreact"
            "sh"
            "html"
            "css"
          ]
          ''
            Filetypes to automatically invoke `|gitlab.code_suggestions.start()|`.
          '';

      enabled = defaultNullOpts.mkBool true ''
        Whether to enable `|gitlab-code-suggestions|` via the LSP binary.
      '';

      fix_newlines = defaultNullOpts.mkBool true ''
        Whether to replace newlines that have become null-byte due to switching between encodings.
      '';

      lsp_binary_path = defaultNullOpts.mkStr' {
        pluginDefault = "node";
        example = lib.literalExpression "lib.getExe pkgs.nodejs";
        description = ''
          The path where the `node` executable is available.

          By default, this option is set to `"node"` which will look for nodejs in your `$PATH`.
          To ensure that `node` will always be in your `$PATH`, you may set the `nodePackage` option.

          Alternatively, you can set this option to `lib.getExe pkgs.nodejs` (or any other package).
        '';
      };

      offset_encoding = defaultNullOpts.mkStr "utf-16" ''
        Which offset encoding to use.
      '';

      redact_secrets = defaultNullOpts.mkBool true ''
        Whether to redact secrets.
      '';
    };

    language_server = {
      workspace_settings = {
        codeCompletion = {
          enableSecretRedaction = defaultNullOpts.mkBool true ''
            Whether to enable secret redactions in completion.
          '';
        };
        telemetry = {
          enabled = defaultNullOpts.mkBool true ''
            Whether to enable telemetry.
          '';

          trackingUrl = defaultNullOpts.mkStr null ''
            URL of the telemetry service.
          '';
        };
      };
    };
  };

  settingsExample = {
    code_suggestions = {
      auto_filetypes = [ "ruby" ];
    };
  };
}
