{ self, dotfiles, nixpkgs, home-manager, nixos-hardware, sops-nix, ... }:
let
  mkSystem = hostName: modules:
    let
      hostSystem = self.hosts.${hostName}.system;
    in
    nixpkgs.lib.nixosSystem {
      system = hostSystem;
      modules = [
        home-manager.nixosModules.home-manager
        (_: {
          networking.hostName = hostName;
          nixpkgs.overlays = [ self.overlays.default ];
          nixpkgs.config.allowUnfree = true;
        })
      ] ++ modules;
      specialArgs = { inherit dotfiles nixos-hardware sops-nix; };
    };
in
{
  # Aristotle
  agent = mkSystem "agent" [ ../hosts/aristotle/configuration.nix ];
  form = mkSystem "form" [ ../hosts/aristotle/configuration.nix ];
  matter = mkSystem "matter" [ ../hosts/aristotle/configuration.nix ];
  purpose = mkSystem "purpose" [ ../hosts/aristotle/configuration.nix ];

  plato = mkSystem "plato" [ ../hosts/plato/configuration.nix ];
  socrates = mkSystem "socrates" [ ../hosts/socrates/configuration.nix ];
}
