{ config, lib, pkgs, ... }@attrs:

let
  userCfg = config.users.foo-dogsquared;
  cfg = userCfg.programs.terminal-emulator;

  shellIntegrationFragment = ''
    source ${pkgs.bash-preexec}/share/bash/bash-preexec.sh
    source ${config.programs.wezterm.package}/etc/profile.d/wezterm.sh
  '';

  hasNixosModuleEnable = attrs.nixosConfig.programs.wezterm.enable or false;
in {
  options.users.foo-dogsquared.programs.terminal-emulator.enable =
    lib.mkEnableOption "foo-dogsquared's terminal emulator setup";

  config = lib.mkIf cfg.enable (lib.mkMerge [
    {
      # We're just making a version of Wezterm with the default arguments if
      # the user has them.
      home.packages = let
        inherit (pkgs) wezterm hiPrio;
        weztermUserDefaultDesktop = pkgs.makeDesktopItem {
          name = "org.wezfurlong.wezterm";
          desktopName = "WezTerm (user)";
          comment = "Wez's Terminal Emulator";
          keywords = [ "shell" "prompt" "command" "commandline" "cmd" ];
          icon = "org.wezfurlong.wezterm";
          startupWMClass = "org.wezfurlong.wezterm";
          tryExec = "wezterm";
          exec = "wezterm";
          type = "Application";
          categories = [ "System" "TerminalEmulator" "Utility" ];
        };
        weztermTypicalDesktop = pkgs.makeDesktopItem {
          name = "wezterm-start";
          desktopName = "WezTerm";
          comment = "Wez's Terminal Emulator";
          keywords = [ "shell" "prompt" "command" "commandline" "cmd" ];
          icon = "org.wezfurlong.wezterm";
          startupWMClass = "org.wezfurlong.wezterm";
          tryExec = "wezterm";
          exec = "wezterm start --cwd .";
          type = "Application";
          categories = [ "System" "TerminalEmulator" "Utility" ];
        };
      in [ wezterm (hiPrio weztermUserDefaultDesktop) weztermTypicalDesktop ];
    }

    (lib.mkIf (!hasNixosModuleEnable) {
      programs.bash.initExtra = shellIntegrationFragment;
      programs.zsh.initExtra = shellIntegrationFragment;
    })
  ]);
}