{ flake }:
let
  nixpkgs = flake.inputs.nixpkgs;

  # utility function to create a new nixos configuration
  # call like `mkSystem "x86_64-linux" "<hostname>.eh22.intern"`
  mkSystem =
    systemType: name:
    let
      lib = nixpkgs.lib;
      systemModule = if lib.pathIsDirectory ./${name} then ./${name}/system.nix else ./${name}.nix;
    in
    lib.nixosSystem {
      system = systemType;
      specialArgs = flake.inputs;
      modules = [
        flake.inputs.home-manager.nixosModules.home-manager
        flake.inputs.sops-nix.nixosModules.default
        flake.inputs.lix.nixosModules.lixFromNixpkgs
        flake.inputs.disko.nixosModules.default

        ../modules/base_system.nix
        ../modules/user_account.nix
        systemModule

        (
          let
            fqdnParts = nixpkgs.lib.strings.splitString "." name;
          in
          {
            networking.hostName = builtins.head fqdnParts;
            networking.domain =
              if ((builtins.length fqdnParts) > 1) then
                (builtins.concatStringsSep "." (builtins.tail fqdnParts))
              else
                null;
          }
        )
      ];
    };
in
{
  # prod hosts
  "auth-dns.noc.eh22.intern" = mkSystem "x86_64-linux" "auth-dns.noc.eh22.intern";
  "resolv-dns.noc.eh22.intern" = mkSystem "x86_64-linux" "resolv-dns.noc.eh22.intern";
  "monitoring.noc.eh22.intern" = mkSystem "x86_64-linux" "monitoring.noc.eh22.intern";

  # staging temp infra
  "sketchy-router.noc.eh22.intern" = mkSystem "x86_64-linux" "sketchy-router.noc.eh22.intern";

  # misc hosts
  "test.eh22.intern" = mkSystem "x86_64-linux" "test.eh22.intern";
  "installer" = mkSystem "x86_64-linux" "installer";
}