# Do not modify this file!  It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations.  Please make changes
# to /etc/nixos/configuration.nix instead.
{
  config,
  lib,
  pkgs,
  modulesPath,
  ...
}: {
  imports = [(modulesPath + "/installer/scan/not-detected.nix")];

  boot = {
    initrd.availableKernelModules = ["xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod"];
    # Enable early Nvidia kernel modesetting
    # https://wiki.archlinux.org/title/GDM#GDM_ignores_Wayland_and_uses_X.Org_by_default (not fixed by this)
    # https://wiki.archlinux.org/title/Kernel_mode_setting#Early_KMS_start
    initrd.kernelModules = ["nvidia" "nvidia_modeset" "nvidia_uvm" "nvidia_drm"]; # NVIDIA
    # initrd.kernelModules = ["amdgpu"]; # Initrd modules are always loaded, e.g. when they are required to mount the rootfs
    # kernelModules = ["kvm-intel" "iwlwifi"];
    kernelModules = ["kvm-amd"];

    # extraModprobeConfig = ''
    #   options iwlwifi 11n_disable=1 wd_disable=0
    # '';

    # Specific to used kernel (currently linux_zen)
    extraModulePackages = with config.boot.kernelPackages; [
      # new-lg4ff # Logitech force feedback
      v4l2loopback
    ];
  };

  fileSystems."/" = {
    device = "/dev/disk/by-uuid/68bd46a0-e95c-4764-a006-44bd9975a6c2";
    fsType = "ext4";
    options = ["noatime" "nodiratime" "discard"];
  };

  fileSystems."/boot/efi" = {
    device = "/dev/disk/by-uuid/36A9-3D74";
    fsType = "vfat";
  };

  swapDevices = lib.mkForce [
    # {
    #   device = "/var/swap";
    #   # size = 1024 * 16 * 2; # twice the RAM for hibernation
    #   size = 1024 * 8; # Without hibernation 4.0 GB to 0.5 x RAM
    # }
  ];

  # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
  # (the default) this is the recommended approach. When using systemd-networkd it's
  # still possible to use this option, but it's recommended to use it in conjunction
  # with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
  networking.useDHCP = lib.mkDefault false; # NOTE: Set to false bc systemd-networkd
  # networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true;
  # networking.interfaces.enp4s0u2.useDHCP = lib.mkDefault true;
  # networking.interfaces.wlp3s0.useDHCP = lib.mkDefault true;

  # networking.networkmanager.enable = true;
  # networking.wireless.iwd.enable = true;
  # networking.networkmanager.wifi.backend = "iwd";

  # nixpkgs.config.allowUnfree = true;

  hardware = {
    # Use all redistributable firmware (i.e. nonfree)
    enableAllFirmware = true;
    enableRedistributableFirmware = true;
    # cpu.intel.updateMicrocode = true;
    cpu.amd.updateMicrocode = true;

    nvidia = {
      modesetting.enable = true; # Not officially supported by NVidia but needed for wayland
      open = true;
      nvidiaSettings = true;
    };

    # video.hidpi.enable = lib.mkDefault true; # No longer has any effect
    opengl = {
      enable = true;

      # Vulkan
      driSupport = true;
      driSupport32Bit = true;

      # AMD: https://nixos.wiki/wiki/AMD_GPU
      extraPackages = with pkgs; [
        # amdvlk # RADV (mesa) and AMDVLK (amd) can be used simultaneously

        # VAAPI/VDPAU: https://nixos.wiki/wiki/Accelerated_Video_Playback
        vaapiVdpau # Taken from wiki
        libvdpau-va-gl # Taken from wiki
        libvdpau # NOTE: Don't know if needed/where it belongs...
        libva # NOTE: Don't know if needed/where it belongs...

        nvidia-vaapi-driver
      ];
    };

    sane.enable = true; # Scanning

    xpadneo.enable = true; # Xbox Controller
  };

  environment.variables.AMD_VULKAN_ICD = "RADV"; # Choose mesa driver by default

  powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
}
