{
  lib,
  helpers,
  config,
  pkgs,
  ...
}:
with lib; let
  cfg = config.plugins.cursorline;
in {
  options.plugins.cursorline =
    helpers.extraOptionsOptions
    // {
      enable = mkEnableOption "nvim-cursorline";

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

      cursorline = {
        enable =
          helpers.defaultNullOpts.mkBool true
          "Show / hide cursorline in connection with cursor moving.";

        timeout =
          helpers.defaultNullOpts.mkInt 1000
          "Time (in ms) after which the cursorline appears.";

        number =
          helpers.defaultNullOpts.mkBool false
          "Whether to also highlight the line number.";
      };
      cursorword = {
        enable = helpers.defaultNullOpts.mkBool true "Underlines the word under the cursor.";

        minLength = helpers.defaultNullOpts.mkInt 3 "Minimum length for underlined words.";

        hl =
          helpers.defaultNullOpts.mkNullable
          types.attrs
          "{underline = true;}"
          "Highliht definition map for cursorword highlighting.";
      };
    };

  config = let
    options =
      {
        cursorline = with cfg.cursorline; {
          inherit enable timeout number;
        };
        cursorword = with cfg.cursorword; {
          inherit enable;
          min_length = minLength;
          inherit hl;
        };
      }
      // cfg.extraOptions;
  in
    mkIf cfg.enable {
      extraPlugins = [cfg.package];

      extraConfigLua = ''
        require('nvim-cursorline').setup(${helpers.toLuaObject options})
      '';
    };
}