{ nixpkgs, nixpkgs-unstable, ... }:
let
  # Set of environment specific modules
  environments = {
    "proxmox" = [
      ./config/environments/proxmox-vm
    ];
    "openstack" = [
      ./config/environments/openstack-vm
    ];
  };
  generateDefaults = hosts: builtins.mapAttrs (name: {
    hostNixpkgs ? nixpkgs,
    system ? "x86_64-linux",
    # pkgs is explicitly defined so that overlays for each host can easily be created
    pkgs ? hostNixpkgs.legacyPackages.${system},
    environment ? "",
    site
  }: {
    inherit hostNixpkgs system pkgs environment site;
    # define common and host modules and additionally add environment specific modules
    modules = [
      ./config/common
      ./config/hosts/${name}
    ] ++ (if environment != "" then environments.${environment} else []);
  }) hosts;
in
  generateDefaults {
    #fee = {
    #  site = "wg";
    #};
    hydra = {
      site = "vs";
      environment = "proxmox";
    };
    iperf = {
      site = "vs";
      environment = "proxmox";
    };
    jellyfin = {
      site = "vs";
      environment = "proxmox";
    };
    jellyseerr = {
      site = "vs";
      environment = "proxmox";
    };
    forgejo = {
      site = "vs";
      environment = "proxmox";
    };
    keycloak = {
      site = "vs";
      environment = "proxmox";
    };
    lifeline = {
      site = "io";
    };
    mail-1 = {
      site = "vs";
      environment = "proxmox";
    };
    mail-2 = {
      site = "wg";
      environment = "proxmox";
    };
    mastodon = {
      hostNixpkgs = nixpkgs-unstable;
      site = "vs";
      environment = "proxmox";
    };
    matrix = {
      site = "vs";
      environment = "proxmox";
    };
    metrics = {
      site = "vs";
      environment = "proxmox";
    };
    navidrome = {
      hostNixpkgs = nixpkgs-unstable;
      site = "wg";
      environment = "proxmox";
    };
    netbox = {
      site = "vs";
      environment = "proxmox";
    };
    nextcloud = {
      site = "vs";
      environment = "proxmox";
    };
    nitter = {
      site = "vs";
      environment = "proxmox";
    };
    paperless = {
      site = "wg";
      environment = "proxmox";
    };
    coturn = {
      site = "vs";
      environment = "proxmox";
    };
    searx = {
      hostNixpkgs = nixpkgs-unstable;
      site = "vs";
      environment = "proxmox";
    };
    torrent = {
      site = "vs";
      environment = "proxmox";
    };
    tor-relay = {
      site = "vs";
      environment = "proxmox";
    };
    valkyrie = {
      site = "af";
      environment = "openstack";
    };
    web-public-1 = {
      site = "wg";
      environment = "proxmox";
    };
    web-public-2 = {
      site = "vs";
      environment = "proxmox";
    };
    web-nonpublic-linuxcrewd = {
      hostNixpkgs = nixpkgs-unstable;
      site = "vs";
      environment = "proxmox";
    };
  }