{ inputs, namespace, ... }:
let
  inherit (inputs.self.${namespace} - lib.system.common)
    mkExtendedLib
    mkNixpkgsConfig
    mkHomeConfigs
    mkHomeManagerConfig
    mkSpecialArgs
    ;
in
{
  # Example of creating NixOS configurations
  nixosConfigurations =
    let
      # Get all systems
      allSystems = inputs.self.${namespace} - lib.file.scanSystems ../systems;

      # Filter for NixOS systems
      nixosSystems = inputs.self.${namespace} - lib.file.filterNixOSSystems allSystems;
    in
    inputs.nixpkgs.lib.mapAttrs' (
      _name:
      { system, hostname, ... }:
      let
        # Create extended lib with mjallen-lib
        extendedLib = mkExtendedLib inputs.self inputs.nixpkgs;

        # Find matching home configurations for this system
        matchingHomes = mkHomeConfigs {
          flake = inputs.self;
          inherit system hostname;
        };

        # Create home-manager configuration
        homeManagerConfig = mkHomeManagerConfig {
          inherit
            extendedLib
            inputs
            system
            matchingHomes
            ;
          isNixOS = true;
        };
      in
      {
        name = hostname;
        value = inputs.nixpkgs.lib.nixosSystem {
          inherit system;

          # Pass special arguments to modules
          specialArgs = mkSpecialArgs {
            inherit inputs hostname extendedLib;
            username = "mjallen";
          };

          modules = [
            # Set lib to extended lib
            { _module.args.lib = extendedLib; }

            # Configure nixpkgs
            {
              nixpkgs = {
                inherit system;
              }
              // mkNixpkgsConfig inputs.self;
            }

            # Import home-manager module
            inputs.home-manager.nixosModules.home-manager

            # Auto-inject home configurations
            homeManagerConfig

            # Import all nixos modules recursively
            ../${system}/${hostname}
          ]
          ++ (extendedLib.${namespace}.file.importModulesRecursive ../modules/nixos);
        };
      }
    ) nixosSystems;

  # Example of creating home-manager configurations
  homeConfigurations =
    let
      # Get all homes
      allHomes = inputs.self.${namespace} - lib.file.scanHomes ../homes;
    in
    inputs.nixpkgs.lib.mapAttrs' (
      _name:
      {
        system,
        username,
        hostname,
        userAtHost,
        path,
        ...
      }:
      let
        # Create extended lib with mjallen-lib
        extendedLib = mkExtendedLib inputs.self inputs.nixpkgs;
      in
      {
        name = userAtHost;
        value = inputs.home-manager.lib.homeManagerConfiguration {
          pkgs = import inputs.nixpkgs {
            inherit system;
            inherit ((mkNixpkgsConfig inputs.self)) config overlays;
          };

          extraSpecialArgs = {
            inherit
              inputs
              hostname
              username
              system
              ;
            inherit (inputs) self;
            lib = extendedLib;
          };

          modules = [
            # Set lib to extended lib
            { _module.args.lib = extendedLib; }

            # Import the home configuration
            path
          ]
          ++ (extendedLib.${namespace}.file.importModulesRecursive ../modules/home);
        };
      }
    ) allHomes;
}
