{
  config,
  lib,
  ...
}: let
  inherit (lib.options) mkOption mkEnableOption;
  inherit (lib.types) int bool str nullOr enum;
  inherit (lib.modules) mkIf;
  inherit (lib.trivial) boolToString;
  inherit (lib.nvim.lua) nullString;
  inherit (lib.nvim.dag) entryAnywhere;

  inherit (config.vim) treesitter;
  cfg = treesitter.context;
in {
  options.vim.treesitter.context = {
    enable = mkEnableOption "context of current buffer contents [nvim-treesitter-context] ";

    maxLines = mkOption {
      description = "How many lines the window should span. Values <=0 mean no limit.";
      type = int;
      default = 0;
    };

    minWindowHeight = mkOption {
      description = "Minimum editor window height to enable context. Values <= 0 mean no limit.";
      type = int;
      default = 0;
    };

    lineNumbers = mkOption {
      description = "";
      type = bool;
      default = true;
    };

    multilineThreshold = mkOption {
      description = "Maximum number of lines to collapse for a single context line.";
      type = int;
      default = 20;
    };

    trimScope = mkOption {
      description = "Which context lines to discard if [](#opt-vim.treesitter.context.maxLines) is exceeded.";
      type = enum ["inner" "outer"];
      default = "outer";
    };

    mode = mkOption {
      description = "Line used to calculate context.";
      type = enum ["cursor" "topline"];
      default = "cursor";
    };

    separator = mkOption {
      description = ''
        Separator between context and content. Should be a single character string, like '-'.

        When separator is set, the context will only show up when there are at least 2 lines above cursorline.
      '';
      type = nullOr str;
      default = null;
    };

    zindex = mkOption {
      description = "The Z-index of the context window.";
      type = int;
      default = 20;
    };
  };

  config = mkIf (treesitter.enable && cfg.enable) {
    vim.startPlugins = ["nvim-treesitter-context"];

    vim.luaConfigRC.treesitter-context = entryAnywhere ''
      require'treesitter-context'.setup {
        enable = true,
        max_lines = ${toString cfg.maxLines},
        min_window_height = ${toString cfg.minWindowHeight},
        line_numbers = ${boolToString cfg.lineNumbers},
        multiline_threshold = ${toString cfg.multilineThreshold},
        trim_scope = '${cfg.trimScope}',
        mode = '${cfg.mode}',
        separator = ${nullString cfg.separator},
        max_lines = ${toString cfg.zindex},
      }
    '';
  };
}