{
  config,
  lib,
  pkgs,
  ...
}: let
  inherit (pkgs) vimPlugins;
  inherit (config.vars) neovimIde;

  javaSdk = pkgs.temurin-bin-17;
  javaPkgs = with pkgs; [gradle maven];
in
  lib.mkIf neovimIde {
    home.packages = javaPkgs;

    xdg.dataFile.".gradle/gradle.properties".text = ''
      org.gradle.java.home = ${javaSdk}
    '';

    programs = {
      java = {
        enable = true;
        package = javaSdk;
      };

      neovim = {
        extraPackages = javaPkgs;

        extraLuaConfig =
          # lua
          ''
            vim.api.nvim_create_autocmd('FileType', {
               pattern = 'java',
               command = 'setlocal ts=4 sw=4 sts=0 expandtab',
            });
          '';

        plugins = [
          {
            # TOOD: setup debugger https://github.com/mfussenegger/nvim-jdtls#debugger-via-nvim-dap
            plugin = vimPlugins.nvim-jdtls;
            type = "lua";
            config =
              # lua
              ''
                --
                local startJdtls = function()
                    local config = require('coq').lsp_ensure_capabilities({
                        cmd = { '${lib.getExe pkgs.jdt-language-server}' },
                        root_dir = vim.fs.dirname(vim.fs.find(
                            { 'gradlew', '.git', 'mvnw', 'pom.xml' },
                            { upward = true }
                        )[1]),

                        settings = {
                            java = {
                                configuration = {
                                    runtimes = {
                                        {
                                            name = 'JavaSE-17',
                                            path = '${javaSdk}',
                                        },
                                    },
                                },
                            },
                        },
                    });

                    require('jdtls').start_or_attach(config);
                end

                vim.api.nvim_create_autocmd('FileType', {
                    pattern = 'java',
                    callback = startJdtls,
                });
              '';
          }
        ];
      };
    };
  }