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

let
  default-monitors = pkgs.writeXrandrScriptBin "default-monitors" {
    DP-0 = {
      primary = true;
      mode = "1920x1080";
      pos = "1920x0";
      rotate = "normal";
    };
    HDMI-0 = {
      mode = "1920x1080";
      pos = "0x0";
      rotate = "normal";
    };
  };

  tv-on = pkgs.writeXrandrScriptBin "tv-on" {
    DP-0 = {
      primary = true;
      mode = "1920x1080";
      pos = "1920x1080";
      rotate = "normal";
    };
    HDMI-0 = {
      mode = "1920x1080";
      pos = "0x1080";
      rotate = "normal";
    };
    HDMI-1 = {
      mode = "1920x1080";
      pos = "1920x0";
      rotate = "normal";
    };
  };

in
{
  imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];

  boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" "sr_mod" ];
  boot.initrd.kernelModules = [ ];
  boot.kernelModules = [ "kvm-amd" ];
  boot.extraModulePackages = [ ];

  fileSystems."/" = {
    device = "/dev/disk/by-uuid/8c377115-06bb-488e-a531-c668dac127f6";
    fsType = "ext4";
  };

  fileSystems."/boot" = {
    device = "/dev/disk/by-uuid/0499-9841";
    fsType = "vfat";
  };

  fileSystems."/data" = {
    device = "/dev/disk/by-uuid/00a7093a-49ee-41e4-baec-99d8a322a530";
    fsType = "ext4";
  };

  fileSystems."/home/ravenshade" = {
    device = "/dev/disk/by-uuid/9451621e-00ce-4ea3-99b7-8f2753e51665";
    fsType = "ext4";
  };

  fileSystems."/archive" = {
    device = "/dev/disk/by-uuid/d5a23b72-9982-49ab-a3a6-c297c0537cba";
    fsType = "ext4";
  };

  # Enable OpenGL
  hardware.graphics = {
    enable = true;
    enable32Bit = true;
  };

  # Load nvidia driver for Xorg and Wayland
  services.xserver.videoDrivers = lib.mkDefault [ "nvidia" ];
  services.xserver.dpi = lib.mkDefault 96;

  environment.systemPackages = [
    default-monitors
    tv-on
  ];

  systemd.user.services.screenlayout = {
    script = lib.getExe default-monitors;
    wantedBy = [ "graphical-session.target" ];
    partOf = [ "graphical-session.target" ];
  };


  hardware.nvidia = {

    # Modesetting is required.
    modesetting.enable = true;

    # Nvidia power management. Experimental, and can cause sleep/suspend to fail.
    # Enable this if you have graphical corruption issues or application crashes after waking
    # up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead 
    # of just the bare essentials.
    powerManagement.enable = true;

    # Fine-grained power management. Turns off GPU when not in use.
    # Experimental and only works on modern Nvidia GPUs (Turing or newer).
    powerManagement.finegrained = false;

    # Use the NVidia open source kernel module (not to be confused with the
    # independent third-party "nouveau" open source driver).
    # Support is limited to the Turing and later architectures. Full list of 
    # supported GPUs is at: 
    # https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus 
    # Only available from driver 515.43.04+
    # Currently alpha-quality/buggy, so false is currently the recommended setting.
    open = true;

    # Enable the Nvidia settings menu,
    # accessible via `nvidia-settings`.
    nvidiaSettings = true;

    forceFullCompositionPipeline = true;

    # Optionally, you may need to select the appropriate driver version for your specific GPU.
    package = config.boot.kernelPackages.nvidiaPackages.beta;
  };

  hardware.bluetooth.enable = true;

  swapDevices = [ ];

  # Bootloader.
  boot.loader.grub = {
    enable = true;
    efiSupport = true;
    device = "nodev";
    theme = pkgs.rose-pine-grub;

    extraEntries = ''
      menuentry 'Windows Boot Manager (on /dev/nvme0n1p1)' --class windows --class os {
      	insmod part_gpt
      	insmod fat
      	search --no-floppy --fs-uuid --set=root 1A0A-CEB2
      	chainloader /efi/Microsoft/Boot/bootmgfw.efi
      }
    '';
  };
  boot.loader.efi.canTouchEfiVariables = true;

  # Enable networking
  networking.networkmanager.enable = true;

  networking.hostName = "snowhawk";
  # 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 true;
  # networking.interfaces.enp7s0.useDHCP = lib.mkDefault true;
  # networking.interfaces.wlp6s0.useDHCP = lib.mkDefault true;

  nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
  hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}