# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running `nixos-help`).

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

{
  imports = [
    inputs.home-manager.nixosModules.default
    ../../modules

    # Default specialisation
    ({ lib, config, ... }: {
      config = lib.mkIf (config.specialisation != { }) {
        hardware.nvidia.open = lib.mkForce true;

        snowhawk.hyprland = {
          enable = true;
          nvidia = true;
          split-monitor-workspaces = true;
        };

        home-manager.sharedModules = [{
          wayland.windowManager.hyprland = {
            settings = {
              monitor = [
                "DP-1, 1920x1080@144, 1920x0, 1"
                "HDMI-A-1, 1920x1080@60, 0x0, 1"
              ];
            };
          };
        }];
      };
    })
  ];

  specialisation =
    let
      nvkConfig = {
        system.nixos.tags = [ "nouveau-drivers" ];
        boot.kernelParams = lib.mkAfter [ "nouveau.config=NvGspRm=1" ];
        services.xserver.videoDrivers = (lib.lists.remove "nvidia" config.services.xserver.videoDrivers);

        hardware.firmware = [ (config.hardware.nvidia.package).firmware ];

        boot.blacklistedKernelModules = [
          "nvidia"
          "nvidiafb"
          "nvidia-drm"
          "nvidia-uvm"
          "nvidia-modeset"
        ];
      };
    in
    {
      # dwmNVK.configuration = {
      #   environment.etc."specialisation".text = "dwm";
      #
      #   snowhawk.dwm.enable = true;
      #
      #   home-manager.sharedModules = [{ snowhawk.dunst.enable = lib.mkDefault true; }];
      # } // nvkConfig;
      dwl.configuration = {
        environment.etc."specialisation".text = "dwl";

        hardware.nvidia.open = lib.mkForce true;

        snowhawk.dwl.enable = true;

        home-manager.sharedModules = [{ snowhawk.dunst.enable = lib.mkDefault true; }];
      };
      dwm.configuration = {
        environment.etc."specialisation".text = "dwm";

        snowhawk.dwm.enable = true;

        home-manager.sharedModules = [{
          snowhawk.dunst.enable = lib.mkDefault true;
          snowhawk.dwm.useXFixes = true;
        }];
      };
      # plasma.configuration = {
      #   environment.etc."specialisation".text = "plasma";
      #
      #   hardware.nvidia.open = lib.mkForce true;
      #
      #   services.xserver.enable = true;
      #   services.displayManager.sddm.enable = true;
      #   services.desktopManager.plasma6.enable = true;
      # };
      # dwlNVK.configuration = {
      #   environment.etc."specialisation".text = "dwlNVK";
      #
      #   snowhawk.dwl.enable = true;
      #
      #   home-manager.sharedModules = [{ snowhawk.dunst.enable = lib.mkDefault true; }];
      # } // nvkConfig;
    };

  services.libinput.mouse.middleEmulation = false;

  snowhawk = {
    filesystem.enable = true;
    polkit.enable = true;
    syncthing.enable = true;
    user.enable = true;
    wake-on-lan.enable = true;
    star-citizen.enable = true;
  };

  snowhawk.plymouth = {
    enable = true;
    theme = "owl";
  };

  programs.gamemode.enable = true;

  # Enable automatic login for the user.
  services.displayManager.autoLogin = {
    enable = true;
    user = "ravenshade";
  };

  documentation = {
    enable = true;
    dev.enable = true;
    man.enable = true;
  };

  home-manager = {
    users = { "ravenshade" = import ./home.nix; };
    backupFileExtension = "backup";
    useGlobalPkgs = true;
  };

  services.flatpak.enable = true;
  xdg.portal.enable = true;
  xdg.portal.config.common.default = "*";
  xdg.portal.extraPortals = with pkgs; [ xdg-desktop-portal-gtk ];
  systemd.services.flatpak-repo = {
    wantedBy = [ "multi-user.target" ];
    path = [ pkgs.flatpak ];
    script = ''
      flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
    '';
  };

  environment.systemPackages = with pkgs; [
    # FIXME: extract to theme module?
    pkgs.rose-pine-gtk-theme
    pkgs.rose-pine-icon-theme
    pkgs.adwaita-icon-theme

    bluetui
    blueberry

    brightnessctl

    neovim
    curl
    git
    killall

    gamemode

    linux-manual

    inputs.nh.packages.${pkgs.system}.default
  ];

  environment.variables.NH_FLAKE = "/home/ravenshade/.config/nixos";

  fonts.packages = with pkgs; [
    nerd-fonts.jetbrains-mono
  ];

  # Enable CUPS to print documents.
  services.printing.enable = true;

  services.ratbagd.enable = true;

  programs.gamescope.enable = true;
  programs.steam = {
    enable = true;
    remotePlay.openFirewall = true;
    gamescopeSession.enable = true;
  };

  # Adds pkgs.uhk-dev-rules to services.udev.packages
  hardware.keyboard.uhk.enable = true;

  swapDevices = [{
    device = "/swap";
    size = 16 * 1024;
  }];

  # Also recommended, either as an alternative or in addition
  zramSwap.enable = true;

  virtualisation = {
    libvirtd.enable = true;
  };

  programs.virt-manager.enable = true;

  # I think I need a gtk theme? gnome-keyring
  qt.platformTheme = "gtk2";

  # Set your time zone.
  time.timeZone = "America/Los_Angeles";

  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "23.11"; # Did you read the comment?
}