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

{
  hardware.enableAllFirmware = true;
  hardware.cpu.intel.updateMicrocode = true;
  services.fwupd.enable = true;

  services.xserver.videoDrivers = [ "nvidia" ];
  hardware.nvidia.open = false;
  nixpkgs.config.cudaSupport = true;
  nix.settings = {
    # Community cache with prebuilt packages with cudaSupport enabled
    substituters = [ "https://nix-community.cachix.org" ];
    trusted-public-keys = [ "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" ];
  };

  # # Downgrade to driver version 535 as 550 has problems with Wayland
  # hardware.nvidia.package =
  #   let
  #     rcu_patch = pkgs.fetchpatch {
  #       url = "https://github.com/gentoo/gentoo/raw/c64caf53/x11-drivers/nvidia-drivers/files/nvidia-drivers-470.223.02-gpl-pfn_valid.patch";
  #       hash = "sha256-eZiQQp2S/asE7MfGvfe6dA/kdCvek9SYa/FFGp24dVg=";
  #     };
  #   in
  #   config.boot.kernelPackages.nvidiaPackages.mkDriver {
  #     version = "535.154.05";
  #     sha256_64bit = "sha256-fpUGXKprgt6SYRDxSCemGXLrEsIA6GOinp+0eGbqqJg=";
  #     sha256_aarch64 = "sha256-G0/GiObf/BZMkzzET8HQjdIcvCSqB1uhsinro2HLK9k=";
  #     openSha256 = "sha256-wvRdHguGLxS0mR06P5Qi++pDJBCF8pJ8hr4T8O6TJIo=";
  #     settingsSha256 = "sha256-9wqoDEWY4I7weWW05F4igj1Gj9wjHsREFMztfEmqm10=";
  #     persistencedSha256 = "sha256-d0Q3Lk80JqkS1B54Mahu2yY/WocOqFFbZVBh+ToGhaE=";
  #     patches = [ rcu_patch ];
  #   };

  services.printing.drivers = [ pkgs.hplip ];

  # enable playing from bluray drive
  boot.kernelModules = [ "sg" ];
  environment.systemPackages = [
    ((pkgs.vlc.override {
      libbluray = (pkgs.libbluray.override {
        withJava = true;
        withAACS = true;
        withBDplus = true;
      });
    }).overrideAttrs (originalAttrs: {
      buildInputs = originalAttrs.buildInputs ++ [ pkgs.libdvdcss ];
      # TODO: nixpkgs bug: libbluray needs patching to look at the nix store path of jdk17 when searching for a jdk
      # as a workaround, wrap vlc and set JAVA_HOME, which it uses instead of searching when specified
      nativeBuildInputs = originalAttrs.nativeBuildInputs ++ [ pkgs.makeWrapper ];
      postFixup = ''
        ${originalAttrs.postFixup or ""}
        wrapProgram $out/bin/vlc --set JAVA_HOME ${pkgs.jdk17.home}
      '';
    }))
  ];
}
