{
  config,
  main,
  lib,
  pkgs,
  ...
}:

let
  inherit (lib) flip;
  inherit (lib.our) mkBoolOpt' packageListOpt;

  packagesOpt = kind: flip mkBoolOpt' "Package Set: ${kind}";

  full = !main.universe.minimal.enable;

  cfg = config.universe.programs;

  ifGraphical = lib.optionals main.info.graphical;
  ifGraphical' = lib.optional main.info.graphical;

  addPackageLists = lib.mapAttrs (
    name: value:
    value
    // {
      minimal = packageListOpt;
      full = packageListOpt;
    }
  );
in

{
  options.universe.programs = (
    addPackageLists {
      utility.enable = packagesOpt "Utility" true;
      writing.enable = packagesOpt "Writing" true;
      communication.enable = packagesOpt "Communication" true;
      internet.enable = packagesOpt "Internet" true;
    }
  );

  config = {
    universe.programs = with pkgs; {
      utility.minimal = [
        bitwarden-cli
        bsd-finger
        ncdu
        peaclock
        pop
        qrencode
        reflex
        unison
        (ifGraphical [
          speedcrunch
        ])
      ];
      utility.full = [
        jmtpfs
        packwiz
        presenterm
        toot
        (ifGraphical [
          bitwarden
          qbittorrent
          sqlitebrowser
        ])
      ];

      writing.full = [
        gramma
      ];

      communication.minimal = [
        (ifGraphical [
          (discord-canary.override {
            inherit (pkgs) vencord;
            withVencord = true;
            withOpenASAR = true;
            withTTS = false;
          })
          thunderbird
        ])
      ];
      communication.full = [
        (ifGraphical [
          (discord.override {
            withVencord = true;
            withOpenASAR = true;
            withTTS = false;
          })
          mumble
          schildichat-desktop
          signal-desktop
          teams-for-linux
        ])
      ];

      internet.full = [
        (ifGraphical [
          tor-browser
        ])
      ];
    };

    home.packages = lib.concatMap (
      v:
      (lib.optionals (v ? minimal && v.enable) v.minimal)
      ++ (lib.optionals (v ? full && full && v.enable) v.full)
    ) (lib.attrValues cfg);

  };
}
