{ pkgs, ... }:

let
  myneovim = pkgs.myneovim.override {
    viAlias = true;
    vimAlias = true;
    enableDevIcons = true;
    enableTabby = true;
    enableOrgMode = true;
    extraConfig = ''
      aug extra_ftdetect
        au!
        au BufNewFile,BufRead *.d2 setfiletype d2
        au BufNewFile,BufRead *.ncl setfiletype nickel
        au BufNewFile,BufRead *.psql setfiletype psql
      aug END
    '';
    plugins = with pkgs.myneovim.nix2lua; {
      nvimTree.settings = {
        renderer = {
          group_empty = true;
          full_name = true;
        };
        tab.sync = {
          open = true;
          close = true;
        };
      };
      telescope.settings = {
        extensions.live_grep_args = {
          auto_quoting = true;
          mappings.i = {
            "<C-K>" = mkLuaRaw "require('telescope-live-grep-args.actions').quote_prompt()";
          };
        };
      };
      lspSaga.settings = {
        border_style = "rounded";
        symbol_in_winbar.enable = false;
        code_action_lightbulb.enable = false;
        code_action_keys = { quit = "<Esc>"; };
        definition_action_keys = { quit = "<Esc>"; };
        rename_action_quit = "<C-c>";
      };
      lspConfig = {
        servers = {
          nickel_ls = { };
          nil_ls = { };
          tsserver = { };
          eslint = { };
          volar = {
            init_options = {
              typescript.tsdk = "./node_modules/typescript/lib";
            };
          };
          denols = {
            root_dir = mkLuaRaw "root_pattern(\"deno.json\", \"deno.jsonc\")";
          };
          rust_analyzer = {
            settings.rust-analyzer = {
              "server.path" = "rust-analyzer";
              "updates.prompt" = false;
              "updates.checkOnStartup" = false;
              "checkOnSave.enable" = true;
              "checkOnSave.command" = "clippy";
              "cargo.autoreload" = true;
            };
          };
          pylsp = { };
          ltex = {
            language = "en-US";
            languageToolHttpServerUri = "http://localhost:8081";
          };
        };
      };
      lualine.settings = {
        options.ignore_focus = [ "NvimTree" ];
        sections = {
          lualine_a = [
            [ "filename" (mkNamedField "path" 1) ]
          ];
          lualine_b = [ "branch" "diff" "diagnostics" ];
          lualine_c = [ "lsp_progress" ];
          lualine_x = [ "filesize" "filetype" ];
          lualine_y = [ "progress" ];
          lualine_z = [ "location" "mode" ];
        };
      };
      orgmode.settings = {
        org_agenda_files = [ "~/orgs/**/*" ];
        org_default_notes_file = "~/orgs/refile.org";
        win_split_mode = "tabnew";
        org_hide_leading_stars = true;
      };
    };
  };
in
{
  home.packages = [
    pkgs.ltex-ls
    myneovim
  ];

  home.sessionVariables.EDITOR = "nvim";
}
