# My editor configurations. Take note I try to avert as much settings to create
# the configuration files with Nix. I prefer to handle the text editor
# configurations by hand as they are very chaotic and it is a hassle going
# through Nix whenever I need to change it.
#
# As much as I want 100% reproducibility with Nix, 5% of the remaining stuff
# for me is not worth to maintain.
{ config, lib, pkgs, ... }:

let cfg = config.profiles.editors;
in {
  options.profiles.editors = {
    neovim.enable = lib.mkEnableOption "basic Neovim setup";
    vscode.enable = lib.mkEnableOption "basic Visual Studio Code setup";
  };

  config = lib.mkMerge [
    (lib.mkIf cfg.neovim.enable {
      programs.neovim = {
        enable = true;
        withPython3 = true;
        withRuby = true;
        withNodeJs = true;

        plugins = with pkgs.vimPlugins; [
          parinfer-rust
        ];
      };

      xdg.mimeApps.defaultApplications = {
        "application/json" = [ "nvim.desktop" ];
        "text/plain" = [ "nvim.desktop" ];
      };
    })

    # The Visual Studio Code setup. Probably the hardest one to fully configure
    # not because it has extensions available which will make things harder.
    # This might make me not consider an extension and settings sync extension
    # for this.
    (lib.mkIf cfg.vscode.enable {
      programs.vscode = {
        enable = true;
        extensions = with pkgs.vscode-extensions; [
          # All the niceties for developmenties.
          ms-vscode-remote.remote-containers
          ms-vscode-remote.remote-ssh
          ms-vsliveshare.vsliveshare
          tailscale.vscode-tailscale

          # The other niceties.
          vscode-icons-team.vscode-icons
        ];

        # Yay! Thank you!
        mutableExtensionsDir = true;

        userSettings = {
          # Editor configurations.
          "editor.fontFamily" = "monospace";
          "editor.fontSize" = 16;
          "editor.cursorStyle" = "block";
          "editor.minimap.renderCharacters" = false;
          "workbench.iconTheme" = "vscode-icons";
          "window.autoDetectColorScheme" = true;
          "accessibility.dimUnfocused.enable" = true;
          "accessibility.dimUnfocused.opacity" = 0.35;

          # Putting some conveniences.
          "files.autoSave" = "off";
          "update.showReleaseNotes" = false;
          "extensions.autoUpdate" = "onlyEnabledExtensions";
          "github.copilot.enable"."*" = false;

          # Extensions settings.
          "direnv.restart.automatic" = true;
          "gitlens.showWhatsNewAfterUpgrade" = false;
          "gitlens.showWelcomeOnInstall" = false;
          "gitlens.plusFeatures.enabled" = false;
        };
      };

      xdg.mimeApps.defaultApplications = {
        "application/json" = [ "code.desktop" ];
        "text/plain" = [ "code.desktop" ];
      };
    })
  ];
}