{ self, nixpkgs, nixos-exporter, solid-xmpp-alarm, ... }@inputs:

rec {
  generateNixosSystem = {
    name,
    system ? "x86_64-linux",
  }: let
    localNixpkgs = nixpkgs.lib.attrByPath [ "nixpkgs-${name}" ] nixpkgs inputs;
  in localNixpkgs.lib.nixosSystem {
    system = system;
    modules = [
      ({ ... }: {
        /*
          Make the contents of the flake availiable to modules.
          Useful for having the monitoring server scraping the
          target config from all other servers automatically.
        */
        _module.args._nixfiles = self;
      })
      ../configuration/common
      ({ ... }: {
        nixpkgs.overlays = [
          (_: _: {
            inherit (nixos-exporter.packages."x86_64-linux")
              nixos-exporter;
           })
        ];
      })
      solid-xmpp-alarm.nixosModules.solid-xmpp-alarm
      (../hosts + "/${name}/configuration.nix")
    ];
  };

  mapToNixosConfigurations = hosts: builtins.mapAttrs (name: host: generateNixosSystem host) hosts;

  generateColmenaHost = name: hostSystem: {
    deployment = {
      targetHost = "${name}.net.clerie.de";
      targetUser = null;
    };
    nixpkgs.system = hostSystem.config.nixpkgs.system;
    imports = hostSystem._module.args.modules;
    deployment.allowLocalDeployment = builtins.any (n: n == name) [ "schule" "osmium" ];
  };

  mapToColmenaHosts = hosts: builtins.mapAttrs (generateColmenaHost) hosts;

  buildHosts = hosts: builtins.mapAttrs (name: host: host.config.system.build.toplevel) (nixpkgs.lib.filterAttrs (name: host: (builtins.substring 0 1 name) != "_") hosts);
}