{ config, lib, ... }:
  let
    inherit (lib)
      mkOption
      types
    ;

    cfg = config.valhalla;
    capitalize = (import ../text.nix { inherit lib; }).capitalize;

    userType = types.submodule (
      { ... } : {
        options = {
          displayName = mkOption {
            type = types.nullOr types.str;
            description = "The human-readable name of the user.";
            default = null;
          };

          mailAddress = mkOption {
            type = types.nullOr types.str;
            description = "The mail address of the user.";
            default = null;
          };

          groups = mkOption {
            type = types.listOf types.str;
            description = "The additional groups of the user.";
            default = [];
          };
        };
      });

    linuxUserType = types.submodule (
      { ... }: {
        options = {
          defaultShell = mkOption {
            type = types.nullOr types.str;
            description = "The default shell of the user.";
            default = null;
          };
        };
      });

    winUserType = types.submodule (
      { ... }: {
        options = {
          microsoftAccount = mkOption {
            type = types.bool;
            description = "A value indicating whether this user is a Microsoft Account.";
            default = false;
          };
        };
      });
  in {
    options = {
      valhalla = {
        users = mkOption {
          type = types.attrsOf userType;
          description = "The users to create on the machine.";
          default = {};
        };

        linux.users = mkOption {
          type = types.attrsOf linuxUserType;
        };

        windows.users = mkOption {
          type = types.attrsOf winUserType;
        };
      };
    };

    config = {
      valhalla.windows.users = lib.mkForce (lib.attrsets.concatMapAttrs (
        name: options: {
            ${capitalize name} = options // {
              groups = [];
            };
          }) cfg.users);
    };
  }