args:
with args; let
  nixosSystem = import ../lib/nixosSystem.nix;

  base_args = {
    inherit home-manager nixos-generators;
    inherit nixpkgs; # or nixpkgs-unstable
    system = x64_system;
    specialArgs = x64_system_specialArgs;
  };
in {
  nixosConfigurations = {
    # ai with i3 window manager
    ai_i3 = nixosSystem (idol_ai_modules_i3 // base_args);
    # ai with hyprland compositor
    ai_hyprland = nixosSystem (idol_ai_modules_hyprland // base_args);

    # three virtual machines without desktop environment.
    aquamarine = nixosSystem (idol_aquamarine_modules // base_args);
    ruby = nixosSystem (idol_ruby_modules // base_args);
    kana = nixosSystem (idol_kana_modules // base_args);
  };

  # take system images for idols
  # https://github.com/nix-community/nixos-generators
  packages."${x64_system}" =
    # genAttrs returns an attribute set with the given keys and values(host => image).
    nixpkgs.lib.genAttrs [
      "ai_i3"
      "ai_hyprland"
    ]
    (
      # generate iso image for hosts with desktop environment
      host:
        self.nixosConfigurations.${host}.config.formats.iso
    )
    // nixpkgs.lib.genAttrs [
      "aquamarine"
      "ruby"
      "kana"
    ]
    (
      # generate proxmox image for virtual machines without desktop environment
      host:
        self.nixosConfigurations.${host}.config.formats.proxmox
    );
}
