{
  lib,
  helpers,
  config,
  pkgs,
  ...
}:
with lib; {
  options.plugins.instant = {
    enable = mkEnableOption "instant.nvim";

    package = helpers.mkPackageOption "instant" pkgs.vimPlugins.instant-nvim;

    username = mkOption {
      type = with types; nullOr str;
      description = ''
        Username.
        Explicitly set to `null` if you do not want this option to be set.
      '';
    };

    onlyCwd = helpers.defaultNullOpts.mkBool true ''
      Choose whether to share files only in the current working directory in session mode.
    '';

    cursorHlGroupUser1 = helpers.defaultNullOpts.mkStr "Cursor" ''
      Cursor highlight group for user 1.
    '';

    cursorHlGroupUser2 = helpers.defaultNullOpts.mkStr "Cursor" ''
      Cursor highlight group for user 2.
    '';

    cursorHlGroupUser3 = helpers.defaultNullOpts.mkStr "Cursor" ''
      Cursor highlight group for user 3.
    '';

    cursorHlGroupUser4 = helpers.defaultNullOpts.mkStr "Cursor" ''
      Cursor highlight group for user 4.
    '';

    cursorHlGroupDefault = helpers.defaultNullOpts.mkStr "Cursor" ''
      Cursor highlight group for any other userr.
    '';

    nameHlGroupUser1 = helpers.defaultNullOpts.mkStr "CursorLineNr" ''
      Virtual text highlight group for user 1.
    '';

    nameHlGroupUser2 = helpers.defaultNullOpts.mkStr "CursorLineNr" ''
      Virtual text highlight group for user 2.
    '';

    nameHlGroupUser3 = helpers.defaultNullOpts.mkStr "CursorLineNr" ''
      Virtual text highlight group for user 3.
    '';

    nameHlGroupUser4 = helpers.defaultNullOpts.mkStr "CursorLineNr" ''
      Virtual text highlight group for user 4.
    '';

    nameHlGroupDefault = helpers.defaultNullOpts.mkStr "CursorLineNr" ''
      Virtual text highlight group for any other user.
    '';

    extraOptions = mkOption {
      type = types.attrs;
      default = {};
      description = ''
        Extra configuration options for instant without the 'instant_' prefix.
        Example: To set 'instant_foobar' to 1, write
        ```nix
          extraConfig = {
            foobar = true;
          };
        ```
      '';
    };
  };

  config = let
    cfg = config.plugins.instant;
  in
    mkIf cfg.enable {
      extraPlugins = [cfg.package];

      globals =
        mapAttrs'
        (name: nameValuePair ("instant_" + name))
        (
          with cfg;
            {
              inherit username;
              only_cwd = onlyCwd;
              cursor_hl_group_user_1 = cursorHlGroupUser1;
              cursor_hl_group_user_2 = cursorHlGroupUser2;
              cursor_hl_group_user_3 = cursorHlGroupUser3;
              cursor_hl_group_user_4 = cursorHlGroupUser4;
              cursor_hl_group_default = cursorHlGroupDefault;
              name_hl_group_user_1 = nameHlGroupUser1;
              name_hl_group_user_2 = nameHlGroupUser2;
              name_hl_group_user_3 = nameHlGroupUser3;
              name_hl_group_user_4 = nameHlGroupUser4;
              name_hl_group_default = nameHlGroupDefault;
            }
            // extraOptions
        );
    };
}