{
  options,
  config,
  lib,
  ...
}: let
  inherit (lib.modules) mkIf;
  inherit (lib.nvim.binds) addDescriptionsToMappings;
  inherit (lib.strings) optionalString;
  inherit (lib.lists) optionals;
  inherit (lib.nvim.binds) pushDownDefault mkSetLznBinding;

  cfg = config.vim.telescope;
  mappingDefinitions = options.vim.telescope.mappings;

  mappings = addDescriptionsToMappings cfg.mappings mappingDefinitions;
in {
  config = mkIf cfg.enable {
    vim = {
      startPlugins = ["plenary-nvim"];

      lazy.plugins.telescope = {
        package = "telescope";
        setupModule = "telescope";
        inherit (cfg) setupOpts;
        after = ''
          local telescope = require("telescope")
          ${optionalString config.vim.ui.noice.enable "telescope.load_extension('noice')"}
          ${optionalString config.vim.notify.nvim-notify.enable "telescope.load_extension('notify')"}
          ${optionalString config.vim.projects.project-nvim.enable "telescope.load_extension('projects')"}
        '';

        cmd = ["Telescope"];

        keys =
          [
            (mkSetLznBinding "n" mappings.findFiles "<cmd>Telescope find_files<CR>")
            (mkSetLznBinding "n" mappings.liveGrep "<cmd>Telescope live_grep<CR>")
            (mkSetLznBinding "n" mappings.buffers "<cmd>Telescope buffers<CR>")
            (mkSetLznBinding "n" mappings.helpTags "<cmd>Telescope help_tags<CR>")
            (mkSetLznBinding "n" mappings.open "<cmd>Telescope<CR>")
            (mkSetLznBinding "n" mappings.resume "<cmd>Telescope resume<CR>")

            (mkSetLznBinding "n" mappings.gitCommits "<cmd>Telescope git_commits<CR>")
            (mkSetLznBinding "n" mappings.gitBufferCommits "<cmd>Telescope git_bcommits<CR>")
            (mkSetLznBinding "n" mappings.gitBranches "<cmd>Telescope git_branches<CR>")
            (mkSetLznBinding "n" mappings.gitStatus "<cmd>Telescope git_status<CR>")
            (mkSetLznBinding "n" mappings.gitStash "<cmd>Telescope git_stash<CR>")
          ]
          ++ (optionals config.vim.lsp.enable [
            (mkSetLznBinding "n" mappings.lspDocumentSymbols "<cmd>Telescope lsp_document_symbols<CR>")
            (mkSetLznBinding "n" mappings.lspWorkspaceSymbols "<cmd>Telescope lsp_workspace_symbols<CR>")

            (mkSetLznBinding "n" mappings.lspReferences "<cmd>Telescope lsp_references<CR>")
            (mkSetLznBinding "n" mappings.lspImplementations "<cmd>Telescope lsp_implementations<CR>")
            (mkSetLznBinding "n" mappings.lspDefinitions "<cmd>Telescope lsp_definitions<CR>")
            (mkSetLznBinding "n" mappings.lspTypeDefinitions "<cmd>Telescope lsp_type_definitions<CR>")
            (mkSetLznBinding "n" mappings.diagnostics "<cmd>Telescope diagnostics<CR>")
          ])
          ++ (
            optionals config.vim.treesitter.enable [
              (mkSetLznBinding "n" mappings.treesitter "<cmd>Telescope treesitter<CR>")
            ]
          )
          ++ (
            optionals config.vim.projects.project-nvim.enable [
              (mkSetLznBinding "n" mappings.findProjects "<cmd>Telescope projects<CR>")
            ]
          );
      };

      binds.whichKey.register = pushDownDefault {
        "<leader>f" = "+Telescope";
        "<leader>fl" = "Telescope LSP";
        "<leader>fm" = "Cellular Automaton";
        "<leader>fv" = "Telescope Git";
        "<leader>fvc" = "Commits";
      };
    };
  };
}