{
# 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.
home, # The home architecture for this host (eg. `x86_64-linux`).
target, # The Snowfall Lib target for this home (eg. `x86_64-home`).
format, # A normalized name for the home target (eg. `home`).
virtual
, # A boolean to determine whether this home is a virtual target using nixos-generators.
host, # The host name for this home.

# All other arguments come from the home home.
config, ... }: {
  home.username = "julian";
  home.homeDirectory = "/home/julian";

  # DO NOT CHANGE!!!
  home.stateVersion = "23.11";

  modules = {
    shell = {
      zsh.enable = true;
      direnv.enable = true;
    };
    topgrade.enable = true;
    neovim.enable = true;
    alacritty.enable = true;
    emacs.enable = true;
    i3.enable = true;
    rofi.enable = true;
  };

  home.packages = with pkgs; [
    # Code formatters for use with doom emacs
    nixfmt # nix
    dockfmt # docker
    google-java-format # java

    # Lsps for use with doom emacs
    # neocmakelsp # cmake

    # Rust setup
    rustc
    rustfmt
    cargo
    clippy
    rust-analyzer

    # Further tools

    (lib.frajul.my-helper-function lazygit)
    languagetool

    # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })

    # (pkgs.writeShellScriptBin "my-hello" ''
    #   echo "Hello, ${config.home.username}!"
    # '')

    ## My scripts
    pkgs.frajul.deploy-to-pianopi
    pkgs.frajul.edit-config
  ];

  home.file = {
    # # Building this configuration will create a copy of 'dotfiles/screenrc' in
    # # the Nix store. Activating the configuration will then make '~/.screenrc' a
    # # symlink to the Nix store copy.
    # ".screenrc".source = dotfiles/screenrc;

    # # You can also set the file content immediately.
    # ".gradle/gradle.properties".text = ''
    #   org.gradle.console=verbose
    #   org.gradle.daemon.idletimeout=3600000
    # '';
  };

  # Home Manager can also manage your environment variables through
  # 'home.sessionVariables'. If you don't want to manage your shell through Home
  # Manager then you have to manually source 'hm-session-vars.sh' located at
  # either
  #  ~/.nix-profile/etc/profile.d/hm-session-vars.sh
  # or
  #  /etc/profiles/per-user/julian/etc/profile.d/hm-session-vars.sh
  #
  #

  home.shellAliases = {
    g = "git status";
    fd = "fd -HI";
    ls = "ls --color";
    la = "ls -Alh --color";
    grep = "grep --color";
    conf = "edit-config";
    c = "fzf-z";
  };

  home.sessionVariables = {
    TERMINAL = "alacritty";
    EDITOR = "nvim";
    VISUAL = "nvim";
  };

  # Let Home Manager install and manage itself.
  programs.home-manager.enable = true;
}