{ config, pkgs, user, ... }:

let
  theme = import ../modules/theme;
in
{
  imports = [
    ../modules/emacs
    ../modules/fcitx5
    ../modules/firefox
    ../modules/git
    ../modules/i3
    ../modules/neovim
    ../modules/picom
    ../modules/polybar
    ../modules/ranger
    ../modules/rofi
    ../modules/startpage
    ../modules/terminal
  ];

  home.file."./.background-image".source = theme.wallpaper;

  programs.home-manager.enable = true;

  xdg = {
    userDirs = rec {
      enable = true;
      desktop = "${config.home.homeDirectory}"; # weird hack for disabling desktop in nautilus
      documents = null;
      music = null;
      pictures = "${publicShare}/Pictures";
      templates = null;
      publicShare = "${config.home.homeDirectory}/Nextcloud";
    };
    mimeApps = {
      enable = true;
      defaultApplications = {
        # Make sure directories are opened in nautilus
        # .desktop files can be found in /etc/profiles/per-user/elnu/share/applications
        # mimetypes can be found with the mimetype command:
        # nix-shell -p perl536Packages.FileMimeInfo
        "inode/directory" = "org.gnome.Nautilus.desktop";
        "application/zip" = "org.gnome.FileRoller.desktop";
        "application/octet-stream" = "org.gnome.GHex.desktop";
      };
    };
  };
 
  gtk = {
    enable = true;
    iconTheme = theme.gtkIconTheme pkgs;
    theme = theme.gtkTheme pkgs;
    gtk3 = {
      bookmarks = let
        home = "file://${config.home.homeDirectory}/";
      in [
        "${home}Nextcloud"
        "${home}Projects"
        "${home}nix-config Config"
        "sftp://elnu@elnuhub elnuhub"
      ];
      # Remove minimize, maximize, and close buttons
      extraConfig.gtk-decoration-layout = "appmenu:none";
    };
    gtk4.extraConfig.gtk-decoration-layout = "appmenu:none";
  };

  qt = {
    enable = true;
    platformTheme = "gtk";
  };

  home = {
    username = "${user}";
    homeDirectory = "/home/${user}";

    stateVersion = "22.05";

    packages = with pkgs; [
      # Command line utilities
      wget
      neofetch
      pfetch
      fortune
      killall
      trash-cli # aliased to rm in .bashrc
      unzip
      pipes
      wine
      pandoc
      texlive.combined.scheme-full

      # Dev command line utilities
      hugo

      # Programming languages
      jdk

      # Tray applications
      networkmanagerapplet # nm-applet
      nextcloud-client

      # System GUI applications
      gnome.nautilus
      gnome.file-roller
      gnome.gnome-calculator
      gnome.gnome-disk-utility

      # Applications
      discord
      gimp
      krita
      inkscape 
      obs-studio
      qbittorrent
      pureref
      libreoffice
      gnome.ghex
      tudu

      # Games
      prismlauncher
    ];
  };

  programs.bash = {
    enable = true;
    shellAliases = {
      g = "git";
      ga = "g add";
      gc = "g commit -m ";
      gu = "ga . && gc";
      gs = "g status";
      gi = "g init";
      gp = "g push";
      gf = "g pull";
      gC = "g clone";
      goops = "g reset --soft HEAD^";

      v = "nvim";
      r = "ranger";
      rm = "trash-put";
      emacs = "emacsclient -nw";
    };
    # Change to directory when exiting ranger with Q
    # https://github.com/ranger/ranger/issues/1554#issuecomment-491650123
    bashrcExtra = ''
      function ranger {
        local IFS=$'\t\n'
        local tempfile="$(mktemp -t tmp.XXXXXX)"
        local ranger_cmd=(
          command
          ranger
          --cmd="map Q chain shell echo %d > "$tempfile"; quitall"
        )
        
        ''${ranger_cmd[@]} "$@"
        if [[ -f "$tempfile" ]] && [[ "$(cat -- "$tempfile")" != "$(echo -n `pwd`)" ]]; then
          cd -- "$(cat "$tempfile")" || return
        fi
        command rm -f -- "$tempfile" 2>/dev/null
      }

      if [ -z $TERMINAL_STARTED ] && [ -z $IN_NIX_SHELL ]; then
        pfetch
        while true; do
          f=`fortune`
          if [ ''${#f} -lt 128 ]; then
            echo "''${f}"
            break
          fi
        done
        TERMINAL_STARTED=1
      fi
    '';
  };
}
