{ inputs, outputs, lib, config, pkgs, ... }:
  let
    userName = "nate";
    fullName = "Nathan Anderson";
    email = "n8r@tuta.io";
  in
{
  # 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
    chromium
    #
    # Dev Tools
    #
    dbeaver
    cargo
    helix
    # kakoune
    # flutter316
    docker
    docker-compose
    jq
    python310
    nodejs_21
    zig
    ### LSP's
    nil # 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
    #
    amdgpu_top
    mangohud
    wine-wayland
    webcord

    #
    # Better Unix
    #
    bat
    duf
    fd
    fzf
    lsd
    ripgrep
    tre-command
    gtop
    htop
    neofetch
    # Normies
    unzip

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

    #
    # Communication
    #
    mumble
    slack
    signal-desktop

    #
    # Other
    #
    keepassxc
    obs-studio

    #
    # Style
    #
    catppuccin-kvantum
    libsForQt5.qtstyleplugin-kvantum
    libsForQt5.qt5ct
    # Install fonts
    (nerdfonts.override { fonts = [ "Hermit" "Overpass" ]; })
  ];

  # 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 = ../../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.sessionVariables = {
    EDITOR = "hx";
    XDG_CURRENT_DESKTOP="sway";
  };

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

  programs = {
    direnv = {
      enable = true;
      enableZshIntegration = true; # see note on other shells below
      nix-direnv.enable = true;
    };

    bash.enable = true; # see note on other shells below
  };

  # Zsh setup
  programs.zsh = {
      enable = true;
      oh-my-zsh = {
          enable = true;
          plugins = [ "git" ];
          theme = "half-life";
      };
      initExtra = ''
          eval "$(direnv hook zsh)"
          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/"

          alias ls="lsd"
          alias l="lsd --almost-all --long"
          alias llm="lsd --timesort --long"
          alias lS="lsd --oneline --classic"
          alias lt="lsd --tree --depth=2"
          alias grep="rg"
       '';
  };

  qt = {
    enable = true;
    platformTheme = "qtct";
    style.name = "kvantum";
  };

  gtk = {
    enable = true;
    cursorTheme.package = pkgs.catppuccin-cursors;
    cursorTheme.name = "macchiatoLavender";
    iconTheme = {
      package = pkgs.catppuccin-papirus-folders;
      name = "Papirus-Dark";
    };
    theme = {
      name = "Catppuccin-Macchiato-Compact-Lavender-Dark";
      package = pkgs.catppuccin-gtk.override {
        accents = [ "lavender" ];
        size = "compact";
        tweaks = [ "rimless" ];
        variant = "macchiato";
      };
    };
  };
  # Symlink in gtk and kvantum theme
  xdg.configFile = {
    "gtk-4.0/assets".source = "${config.gtk.theme.package}/share/themes/${config.gtk.theme.name}/gtk-4.0/assets";
    "gtk-4.0/gtk.css".source = "${config.gtk.theme.package}/share/themes/${config.gtk.theme.name}/gtk-4.0/gtk.css";
    "gtk-4.0/gtk-dark.css".source = "${config.gtk.theme.package}/share/themes/${config.gtk.theme.name}/gtk-4.0/gtk-dark.css";
    "Kvantum/kvantum.kvconfig".text = ''
      [General]
      theme=Catppuccin-Frappe-Blue
    '';
    "Kvantum/Catppuccin-Frappe-Blue".source = "${pkgs.catppuccin-kvantum}/share/Kvantum/Catppuccin-Frappe-Blue";
      # "Kvantum/ArcDark".source = "${pkgs.arc-kde-theme}/share/Kvantum/ArcDark";
    # "Kvantum/kvantum.kvconfig".text = "[General]\ntheme=ArcDark";
  };
}