{ config, pkgs, lib, ... }:

{
  imports = [
    # Include the results of the hardware scan.
    ./hardware-configuration.nix
    ../modules/common.nix
    ../modules/sound.nix
    ../modules/window_manager.nix
    ../modules/fonts.nix
    ../modules/gnupg.nix
    ../modules/nix.nix
    ../modules/garbage-collector.nix
    ../modules/networking.secret.nix
  ];

  # Configure kernel
  boot = {
    kernelPackages = pkgs.linuxPackages_latest;
    extraModulePackages = with config.boot.kernelPackages; [
      rtl88x2bu
    ];
  };

  # Use the GRUB 2 boot loader.
  boot.loader.grub = {
    enable = true;
    version = 2;
    device = "/dev/sdb";
  };

  networking = {
    hostName = "home"; # Define your hostname.

    useDHCP = false;
    interfaces = {
      enp3s0.useDHCP = true;
      wlp11s0f3u2.useDHCP = true;
    };

    networkmanager.enable = true;
  };

  nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "cnijfilter2" ];
  services = {
    avahi = {
      enable = true;
      nssmdns = true;
    };
    printing = {
      enable = true;
      drivers = with pkgs; [ gutenprint cnijfilter2 ];
    };
  };

  services.xserver = {
    # All monitors in the right order
    # Source: https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/x11/xserver.nix#L83
    xrandrHeads = [
      {
        output = "HDMI-A-0";
        monitorConfig = ''
          Option "PreferredMode" "1920x1080"
          Option "Rotate" "right"
        '';
      }
      {
        output = "DisplayPort-1";
        primary = true;
        monitorConfig = ''
          Option "PreferredMode" "2560x1440"
        '';
      }
    ];
  };

  # Enable the Docker
  virtualisation.docker.enable = true;

  local.nix.enableMyRegistry = true;
}
