{ pkgs, lib, inputs, ... }:

let
  inherit (lib) readFile;
in
{
  config.home-manager.users.moritz.programs.neovim.lazy.plugins = [
    {
      plugin = pkgs.vimPlugins.which-key-nvim;
      lazy = false;
      conf = readFile ./lua/which-key-nvim.lua;
    }
    {
      plugin = pkgs.vimPlugins.catppuccin-nvim;
      conf = readFile ./lua/catppuccin-nvim.lua;
      lazy = false;
      priority = 99;
    }
    {
      plugin = pkgs.vimPlugins.todo-comments-nvim;
      dependencies = [{ plugin = pkgs.vimPlugins.plenary-nvim; }];
      opts = { };
    }
    {
      plugin = pkgs.vimPlugins.dressing-nvim;
      event = [ "VeryLazy" ];
    }
    {
      plugin = pkgs.vimPlugins.gitsigns-nvim;
      event = [ "BufReadPost" "BufNewFile" ];
      conf = readFile ./lua/gitsigns-nvim.lua;
      dependencies = [{ plugin = pkgs.vimPlugins.which-key-nvim; }];
    }
    {
      plugin = pkgs.vimUtils.buildVimPlugin {
        pname = "hawtkeys-nvim";
        version = lib.my.mkVersionInput inputs.hawtkeys-nvim;
        src = inputs.hawtkeys-nvim;
      };
      cmd = [ "Hawtkeys" "HawtkeysAll" "HawtkeysDupes" ];
      opts = { };
      dependencies = [
        { plugin = pkgs.vimPlugins.plenary-nvim; }
        { plugin = pkgs.vimPlugins.nvim-treesitter; }
      ];
    }
    {
      plugin = pkgs.vimPlugins.zen-mode-nvim;
      keys = [
        { key = "<leader>tz"; cmd = "<cmd>ZenMode<cr>"; desc = "Zen mode"; }
      ];
      conf = /* lua */ ''
        require("zen-mode").setup({
          plugins = {
            tmux = {
              enabled = true,
            },
          },
        })
      '';
      dependencies = [
        {
          plugin = pkgs.vimPlugins.twilight-nvim;
          keys = [
            { key = "<leader>tZ"; cmd = "<cmd>Twilight<cr>"; desc = "Twilight mode"; }
          ];
          conf = /* lua */ ''
            require("twilight").setup({
              context = 20,
              expand = { -- for treesitter, we we always try to expand to the top-most ancestor with these types
                  "function",
                  "function_definition",
                  "if_statement",
                  "method",
                  "method_definition",
                  "table",
                },
            })
          '';
        }
      ];
    }
  ];
}