{
  pkgs,
  lib,
  config,
  ...
}:
let
  inherit (lib)
    mkEnableOption
    mkOption
    types
    hasSuffix
    ;
  cfg = config.programs.comfyui;
  # comfyui only understands the path properly with a trailing slash
  getStorage = if (hasSuffix "/" cfg.storage) then cfg.storage else cfg.storage + "/";
in
{
  options.programs.comfyui = {
    enable = mkEnableOption "ComfyUI";
    storage = mkOption {
      type = types.path;
      description = "where to source models and store information";
    };
    plugins = mkOption {
      type = with types; listOf package;
      description = "list of comfyui plugins";
      default = [ ];
    };
  };
  config = lib.mkIf cfg.enable {
    home.packages = [
      # pkgs.comfyui
      (pkgs.comfyui.override {
        comfy_dir = getStorage;
        inherit (cfg) plugins;
      })
    ];
    home.file = builtins.listToAttrs (
      map (pkg: {
        name = "${getStorage}/custom_nodes/${pkg.name}";
        value = {
          recursive = true;
          source = "${pkg}";
        };
      }) cfg.plugins
    );
  };
}
