{
  config,
  lib,
  pkgs,
  ...
}: let
  inherit (builtins) toJSON;
  inherit (lib) attrValues mkIf mkEnableOption mkOption optionals optionalString types;

  cfg = config.nvidia;
in {
  options.nvidia = {
    enable = mkEnableOption "nvidia";

    enableNvidiaSettings = mkOption {
      type = types.bool;
      default = false;
    };

    enableWayland = mkOption {
      type = types.bool;
      default = false;
    };

    enableCUDA = mkOption {
      type = types.bool;
      default = false;
    };
  };

  config = mkIf cfg.enable {
    hardware.graphics = {
      enable = true;
      enable32Bit = true;

      extraPackages = attrValues {
        inherit
          (pkgs)
          vaapiVdpau
          libvdpau-va-gl
          nvidia-vaapi-driver
          ;
      };
      extraPackages32 = attrValues {
        inherit
          (pkgs)
          vaapiVdpau
          ;
      };
    };

    services.xserver.videoDrivers = ["nvidia"];

    hardware.nvidia = {
      open = true;

      package = config.boot.kernelPackages.nvidiaPackages.latest;

      # Whether to enable nvidia-settings, NVIDIA's GUI configuration tool
      nvidiaSettings = cfg.enableNvidiaSettings;
    };

    environment.systemPackages =
      optionals cfg.enableCUDA [pkgs.cudaPackages.cudatoolkit]
      ++ (attrValues {
        inherit (pkgs.nvtopPackages) nvidia;
        inherit
          (pkgs)
          libva-utils
          nvidia-vaapi-driver
          pciutils
          vdpauinfo
          ;
      });

    boot.kernelModules =
      optionals cfg.enableCUDA ["nvidia-uvm"]
      ++ ["nvidia" "nvidia-drm"];

    # Fixes egl-wayland issues with beta drivers
    # https://github.com/hyprwm/Hyprland/issues/7202
    environment.etc = let
      mkEglFile = n: library: let
        suffix = optionalString (library != "wayland") ".1";
        pkg =
          if library != "wayland"
          then config.hardware.nvidia.package
          else pkgs.egl-wayland;

        fileName = "${toString n}_nvidia_${library}.json";
        library_path = "${pkg}/lib/libnvidia-egl-${library}.so${suffix}";
      in {
        "egl/egl_external_platform.d/${fileName}".source = pkgs.writeText fileName (toJSON {
          file_format_version = "1.0.0";
          ICD = {inherit library_path;};
        });
      };
    in
      mkIf cfg.enableWayland (
        {"egl/egl_external_platform.d".enable = false;}
        // mkEglFile 10 "wayland"
        // mkEglFile 15 "gbm"
        // mkEglFile 20 "xcb"
        // mkEglFile 20 "xlib"
      );
  };

  # For accurate stack trace
  _file = ./default.nix;
}