{
# Snowfall Lib provides a customized `lib` instance with access to your flake's library
# as well as the libraries available from your flake's inputs.
lib,
# An instance of `pkgs` with your overlays and packages applied is also available.
pkgs,
# You also have access to your flake's inputs.
inputs,

# Additional metadata is provided by Snowfall Lib.
system, # The system architecture for this host (eg. `x86_64-linux`).
target, # The Snowfall Lib target for this system (eg. `x86_64-iso`).
format, # A normalized name for the system target (eg. `iso`).
virtual
, # A boolean to determine whether this system is a virtual target using nixos-generators.
systems, # An attribute map of your defined hosts.

# All other arguments come from the module system.
config, ... }:

with lib;

let
  cfg = config.modules.emacs;
  doomRepoUrl = "https://github.com/doomemacs/doomemacs";
  configRepoUrl = "https://gitlab.julian-mutter.de/julian/emacs-config";
in {
  options.modules.emacs = { enable = mkOption { default = false; }; };

  config = mkIf cfg.enable {
    home.packages = with pkgs; [
      emacs
      binutils # native-comp needs 'as', provided by this

      ## Doom dependencies
      git
      (ripgrep.override { withPCRE2 = true; })

      ## Optional dependencies
      fd # faster projectile indexing
      imagemagick # for image-dired
      zstd # for undo-fu-session/undo-tree compression

      ## Module dependencies
      (aspellWithDicts (ds: with ds; [ en en-computers en-science de ]))
      sqlite

      # Code formatters for use with doom emacs
      nixfmt-rfc-style # nix
      dockfmt # docker
      google-java-format # java
      black # python
      unstable.rustfmt # rust
      shfmt

      graphviz
      # Lsps for use with doom emacs
      # neocmakelsp # cmake

      emacs-all-the-icons-fonts
    ];

    home.activation.installDoomEmacs =
      lib.home-manager.hm.dag.entryAfter [ "writeBoundary" ] ''
        if [ ! -d "/home/julian/.config/emacs" ]; then
           $DRY_RUN_CMD ${pkgs.git}/bin/git clone --depth=1 --single-branch "${doomRepoUrl}" "/home/julian/.config/emacs"
        fi
        if [ ! -d "/home/julian/.config/doom" ]; then
           $DRY_RUN_CMD ${pkgs.git}/bin/git clone "${configRepoUrl}" "/home/julian/.config/doom"
        fi
      '';
  };
}
