{
  config,
  lib,
  ...
}: let
  inherit (builtins) toJSON;
  inherit (lib) mkIf mkMerge mkExprBinding boolToString nvim;

  cfg = config.vim.assistant.tabnine;
in {
  config = mkIf cfg.enable {
    vim.startPlugins = ["tabnine-nvim"];

    vim.maps.insert = mkMerge [
      (mkExprBinding cfg.mappings.accept ''
        function()
          local state = require("tabnine.state")
          local completion = require("tabnine.completion")

        	if not state.completions_cache then
          	return "${toJSON cfg.mappings.accept}"
          end

          vim.schedule(completion.accept)
        end
      '' "orzel")
      (mkExprBinding cfg.mappings.dismiss ''
        function()
          local state = require("tabnine.state")
          local completion = require("tabnine.completion")

        	if not state.completions_cache then
          	return "${toJSON cfg.mappings.dismiss}"
          end

          vim.schedule(function()
            completion.clear()
            state.completions_cache = nil
          end)
        end
      '' "orzel")
    ];

    vim.luaConfigRC.tabnine-nvim = nvim.dag.entryAnywhere ''
      require('tabnine').setup({
        disable_auto_comment = ${boolToString cfg.disable_auto_comment},
        accept_keymap = null,
        dismiss_keymap = null,
        debounce_ms = ${cfg.debounce_ms},
        exclude_filetypes = ${cfg.exclude_filetypes},
      })
    '';
  };
}