{ self, ... }:

{
  flake.lib.createUserModule =
    name:
    {
      homeModule,
      user ? { },
      usesContainers ? false,
      ...
    }:
    {
      inputs,
      pkgs,
      lib,
      ...
    }:
    {
      imports = [ inputs.home-manager.nixosModules.home-manager ];

      users.users."${name}" = {
        isNormalUser = true;
        shell = pkgs.zsh;

        # increase sub{u,g}id range for container user namespaces
        subUidRanges = lib.optionals usesContainers [
          {
            startUid = 100000;
            count = 60000000;
          }
        ];
        subGidRanges = lib.optionals usesContainers [
          {
            startGid = 100000;
            count = 60000000;
          }
        ];
      } // user;

      home-manager = {
        useGlobalPkgs = true;
        useUserPackages = true;
        backupFileExtension = "backup";
        users."${name}" = {
          imports = [
            self.homeModules.git
            homeModule
          ];
        };
        extraSpecialArgs = { inherit inputs; };
      };
    };
}