{ pkgs, outputs, config, ... }:
let
  # Record containing all the hosts
  hosts = outputs.nixosConfigurations;

  # Function from hostname to relative path to public ssh key
  idKey = host: ../../${host}/id_ed25519.pub;
in
{
  # Password file stored through agenix
  age.secrets.adrielusPassword.file = ./adrielus_password.age;

  # Temporary stuff until I package my keyboard script
  users.groups.uinput = { };
  services.udev.extraRules =
    ''
      # Access to /dev/uinput
      KERNEL=="uinput", MODE="0660", GROUP="uinput", OPTIONS+="static_node=uinput"
    '';

  users = {
    # Configure users through nix only
    mutableUsers = false;

    # Create an user named adrielus
    users.adrielus = {
      # Make fish the default shell
      shell = pkgs.fish;

      # File containing my password, managed by agenix
      passwordFile = config.age.secrets.adrielusPassword.path;

      # Add user to the following groups
      extraGroups = [
        "wheel" # access to sudo
        "network" # for wireless stuff
        "networkmanager" # I assume this let's me access network stuff?
        "lp" # Allows me to use printers
        "docker" # Allows me to use docker (?)
        "audio" # Allows me to use audio devices
        "video" # Allows me to use a webcam
        "uinput" # I think this let's me write to virtual devices
        "input" # Does this let me use evdev (?)

        # TODO: find out why I added these here a long time ago
        "sound"
        "tty"
      ];

      # Adds me to some default groups, and creates the home dir 
      isNormalUser = true;

      openssh.authorizedKeys.keyFiles =
        builtins.attrValues # attrsetof path -> path[]
          (builtins.mapAttrs # ... -> attrsetof host -> attrsetof path
            (name: _: idKey name) # string -> host -> path
            hosts);
    };
  };
}