# A custom flake-parts module to configure my NixOS images generated with
# nixos-generators. For more details, see the "Declarative hosts management"
# section from the documentation.
{ config, lib, flake-parts-lib, ... }:

let
  inherit (flake-parts-lib) mkSubmoduleOptions mkPerSystemOption;
in
{
  options = {
    flake = mkSubmoduleOptions {
      images = lib.mkOption {
        type = with lib.types; lazyAttrsOf (attrsOf package);
        default = { };
        description = ''
          An attribute set of per-system NixOS configurations built as an image
          output supported by
          [nixos-generators](https://github.com/nix-community/nixos-generators).
          This is exclusively used for foodogsquared's NixOS setup.
        '';
      };
    };

    perSystem = mkPerSystemOption {
      options = {
        images = lib.mkOption {
          type = with lib.types; attrsOf package;
          default = { };
          description = ''
            An attribute set of NixOS configurations built as an image output
            supported by
            [nixos-generators](https://github.com/nix-community/nixos-generators).
          '';
        };
      };
    };
  };

  config = {
    flake.images =
      lib.mapAttrs
        (k: v: v.images)
        (lib.filterAttrs
          (k: v: v.images != { })
          config.allSystems
        );

    perInput = system: flake:
      lib.optionalAttrs (flake ? images.${system}) {
        images = flake.images.${system};
      };
  };
}