{ inputs, outputs, lib, config, pkgs, userName, fullName, email, hostName, desktop, gaming, ... }:
{
  # nixpkgs.overlays = [
  #   inputs.nur.overlay
  # ];

  # nixpkgs.config.allowUnfree = true;
  # inputs.nixpkgs-stable.config.allowUnfree = true;
  imports = [
      ../apps/firefox/firefox.nix
  ];
  
  home.username = userName;
  home.homeDirectory = "/home/${userName}";

  programs.home-manager.enable = true;

  home.stateVersion = "23.11"; # Please read the comment before changing.

  # The home.packages option allows you to install Nix packages into your
  # environment.
  firefoxApp.enable = true;
  
  fonts.fontconfig.enable = true;
  home.packages = with pkgs; [
    # nur.repos.crazazy.js.eslint
    # inputs.nixpkgs-stable.legacyPackages.x86_64-linux.corectrl

    #
    # Dev Tools
    #
    dbeaver
    cargo
    kakoune
    # flutter
    docker
    docker-compose
    python310
    nodejs_21
    zig
    ### LSP's
    rnix-lsp # Nix LSP
    openscad-lsp
    nodePackages.typescript-language-server
    vscode-langservers-extracted # provides eslint, markdown, json, css, and html lsp
    rubyPackages.solargraph
    python310Packages.python-lsp-server
    zls
    ### Misc
    # android-udev-rules
    # android-tools
    # sdkmanager
    openscad

    #
    # Gaming
    #
    wine-wayland
    webcord

    #
    # Better Unix
    #
    bat
    duf
    fd
    fzf
    lsd
    ripgrep
    gtop

    #
    # Photo / Video
    #
    davinci-resolve-studio
    imv
    mpv
    gimp

    #
    # Communication
    #
    mumble
    slack
    signal-desktop

    #
    # Other
    #
    keepassxc
    obs-studio

    # Install fonts
    (nerdfonts.override { fonts = [ "Hermit" "Overpass" ]; })

    # # You can also create simple shell scripts directly inside your
    # # configuration. For example, this adds a command 'my-hello' to your
    # # environment:
    # (pkgs.writeShellScriptBin "my-hello" ''
    #   echo "Hello, ${config.home.username}!"
    # '')
  ];

  # TODO not working firefox plugins
  # extensions = with inputs.firefox-addons.packages.${pkgs.system}; [ ublock-origin bitwarden ];


  # Home Manager is pretty good at managing dotfiles. The primary way to manage
  # plain files is through 'home.file'.
  home.file."${config.xdg.configHome}" = {
    # # 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;
    source = ../../nate/dotfiles;
    recursive = true;

    # # 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/nate/etc/profile.d/hm-session-vars.sh
  #
  home.sessionVariables = {
    EDITOR = "kak";
    XDG_CURRENT_DESKTOP="sway";
  };

  # Git setup
  programs.git = {
      enable = true;
      userEmail = email;
      userName = fullName;
  };

  # Zsh setup
  programs.zsh = {
      enable = true;
      oh-my-zsh = {
          enable = true;
          plugins = [ "git" ];
          theme = "half-life";
      };
      initExtra = ''
          alias ask="nix-shell -p python310Packages.openai --run 'python ~/source/python/chat.py'"

          fzf_projects() {
              DIR=`
              fd .git --search-path="$HOME/source/" -H --ignore-file ~/.config/fd-ignore -tdirectory | \
              xargs dirname | \
              sed 's|$HOME||g' | \
              sort | \
              uniq | \
              fzf --preview 'ls $HOME/{}/README.md 2>/dev/null && bat $HOME/{}/README.md || printf "No README.md file found in this directory\n%s" {}' --preview-window=top | \
              xargs printf "$HOME/%s/"
              `
              cd $DIR
          }
          alias p="fzf_projects source/"

          ### Busykid Bash Functions

       '';
  };

}