# 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
, config
, ...
}:

{
  imports = [
    # Include the results of the hardware scan.
    ./hardware-configuration.nix
    ./disko.nix
  ];

  my = {
    profiles = {
      desktop.enable = true;
      gaming.enable = true;
      personal.enable = true;
      impermanence.enable = true;
      webis.enable = true;
    };
    programs.hyprland.enable = true;
    programs.hyprland.nvidiaSupport = true;
    programs.hyprland.keyboardLayouts = [ "us" "de" ];
    programs.hyprland.monitors."HDMI-A-2" = { scale = 1.2; };
    programs.exercism.enable = true;
    services.wallpaper.enable = true;
  };

  virtualisation.containers.cdi.dynamic.nvidia.enable = true;

  home-manager.users.moritz.home.packages = with pkgs; [
    anki
    stable.calibre # NOTE: breaks often in unstable
  ];

  hardware = {
    keyboard.qmk.enable = true;
    nvidia.modesetting.enable = true;
    opengl = {
      enable = true;
      driSupport32Bit = true;
    };

    # sensors
    enableAllFirmware = true;
    bluetooth.enable = true;
  };

  boot = {
    # KERNEL
    kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; # NOTE: use latest zfs compatible kernel

    # BOOT
    supportedFilesystems = [ "zfs" "btrfs" "ntfs" ];
    loader = {
      systemd-boot.enable = true;
      efi.canTouchEfiVariables = true;
    };
    kernelModules = [ "lm92" "drivetemp" ];
  };

  # NETWORKING
  networking = {
    hostName = "nixos-desktop";
    defaultGateway = "192.168.0.1";
    nameservers = [ "192.168.0.4" ];
    useDHCP = false;
    interfaces.enp6s0 = {
      ipv4.addresses = [
        {
          address = "192.168.0.14";
          prefixLength = 24;
        }
      ];
      ipv6.addresses = [
        {
          address = "fe80::60fb:ffc:df6f:e29e";
          prefixLength = 64;
        }
      ];
    };
    networkmanager.enable = true;
  };
  services = {
    xserver.videoDrivers = [ "nvidia" ];
    xserver.xrandrHeads = [
      { output = "HDMI-1"; }
      {
        output = "HDMI-0";
        primary = true;
      }
    ];

    # Powersaving
    tlp.enable = true;
  };

  console.keyMap = "de";
  powerManagement.enable = true;
  environment.systemPackages = with pkgs; [ lm_sensors ];

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # 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 = "22.05"; # Did you read the comment?
}
