{ config, pkgs, ... }: {
  imports = [ # Include the results of the hardware scan.
    ./hardware-configuration.nix
  ];

  hardware.opengl.enable = true;
  hardware.opengl.driSupport = true;
  hardware.opengl.driSupport32Bit = true;
  hardware.opengl.extraPackages = with pkgs; [
    mesa.drivers
    rocm-opencl-icd
    rocm-opencl-runtime
  ];

  boot = {
    loader = {
      grub = {
        enable = true;
        device = "/dev/sda";
        memtest86.enable = true;
        enableCryptodisk = true;
      };
    };
    kernelParams = [
      "radeon.si_support=0"
      "radeon.cik_support=0"
      "amdgpu.si_support=1"
      "amdgpu.cik_support=1"
    ];
    extraModulePackages = with config.boot.kernelPackages; [
        v4l2loopback.out
    ];
    kernelModules = [
      "v4l2loopback"
    ];
    initrd.kernelModules = [
      "nouveau"
    ];

    initrd.luks.devices."luks-2bd7a13f-62b5-4c44-822b-e836ebb84c01".keyFile = "/crypto_keyfile.bin";
    # Enable swap on luks
    initrd.luks.devices."luks-aa357d98-202a-46e5-9171-fbe19261cec6".device = "/dev/disk/by-uuid/aa357d98-202a-46e5-9171-fbe19261cec6";
    initrd.luks.devices."luks-aa357d98-202a-46e5-9171-fbe19261cec6".keyFile = "/crypto_keyfile.bin";

    initrd.secrets = {
      "/crypto_keyfile.bin" = null;
    };
    extraModprobeConfig = ''
    options v4l2loopback exclusive_caps=1 card_label="Virtual Camera"
  '';
  };

  networking.hostName = "henna";
  networking.networkmanager.enable = true;
  time.timeZone = "Europe/Helsinki";
  i18n.defaultLocale = "fi_FI.UTF-8";
  i18n.extraLocaleSettings = {
    LC_ADDRESS = "fi_FI.UTF-8";
    LC_IDENTIFICATION = "fi_FI.UTF-8";
    LC_MEASUREMENT = "fi_FI.UTF-8";
    LC_MONETARY = "fi_FI.UTF-8";
    LC_NAME = "fi_FI.UTF-8";
    LC_NUMERIC = "fi_FI.UTF-8";
    LC_PAPER = "fi_FI.UTF-8";
    LC_TELEPHONE = "fi_FI.UTF-8";
    LC_TIME = "fi_FI.UTF-8";
  };

  hardware.bluetooth.enable = true;
  services.blueman.enable = true;

  services.xserver = {
    enable = true;
    layout = "fi";
    xkbVariant = "nodeadkeys";
    libinput = {
      enable = true;
      mouse = {
        accelProfile = "flat";
        accelSpeed = ".5"; # -1..1
      };
      touchpad = {
        accelProfile = "flat";
      };
    };
    deviceSection = ''
      Option "VariableRefresh" "True"
    '';
    displayManager = {
      lightdm.enable = true;
      #autoLogin.enable = true;
      #autoLogin.user = "jt";
      defaultSession = "none+i3";
    };
    windowManager = {
      i3 = {
        enable = true;
        extraPackages = with pkgs; [
          dmenu
          rofi
          dunst
          imagemagick
          xclip
          i3status
          i3lock
          lxappearance
        ];
      };
    };
    desktopManager = {
      xterm.enable = false;
      xfce = {
        enable = true;
        enableScreensaver = false;
        thunarPlugins = [ pkgs.xfce.thunar-archive-plugin ];
      };
    };
  };

  # Configure console keymap
  console.keyMap = "fi";

  # Enable CUPS to print documents.
  services.printing.enable = true;
  services.avahi = {
    enable = true;
    nssmdns = true;
  };

  services.gvfs = {
    enable = true;
    package = pkgs.gnome3.gvfs;
  };

  # Enable sound with pipewire.
  sound.enable = true;
  hardware.pulseaudio.enable = false;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    jack.enable = true;

    # use the example session manager (no others are packaged yet so this is enabled by default,
    # no need to redefine it in your config for now)
    #media-session.enable = true;
  };

  services.openssh.enable = true;
  services.gnome.gnome-keyring.enable = true;
  services.udev.packages = with pkgs; [ logitech-udev-rules ];
  networking.firewall.enable = false;
  services.trezord.enable = true;

  virtualisation = {
    podman = {
      enable = true;
      dockerCompat = true;
      defaultNetwork.dnsname.enable = true;
    };
    libvirtd.enable = true;
    spiceUSBRedirection.enable = true;
  };

  #fonts.fontDir.enable = true;
  #fonts.enableDefaultFonts = true;
  fonts.fontconfig.defaultFonts.monospace = [ "Fira Code" ];
  fonts.fonts = with pkgs; [
    fira-code
    fira-code-symbols
    emacs-all-the-icons-fonts
    glasstty-ttf
    #symbola
    #fantasque-sans-mono
    #noto-fonts
    #noto-fonts-cjk
    #noto-fonts-emoji
  ];

  nix.settings.auto-optimise-store = true;
  nixpkgs.config.allowUnfree = true;
  #programs.steam = {
  #  enable = true;
  #  remotePlay.openFirewall =
  #    true; # Open ports in the firewall for Steam Remote Play
  #  dedicatedServer.openFirewall =
  #    true; # Open ports in the firewall for Source Dedicated Server
  #};
  programs.bash ={
    shellAliases = {
      cross="NIX_STORE=/nix/store cross";
    };
  };
  programs.dconf.enable = true;
  programs.iftop.enable = true;
  programs.iotop.enable = true;
  programs.htop.enable = true;
  programs.tmux.enable = true;
  programs.seahorse.enable = true;
  environment.systemPackages = with pkgs; [
    wget
    emacs
    nano
    polkit_gnome
    pavucontrol
    pasystray
    pulseaudio
    xarchiver
    gparted
    parted
    unrar
    unzip
    zip
    p7zip
    graphite-gtk-theme
    tela-circle-icon-theme
    qemu_full
    virt-manager
    python3
    gxkb
  ];

  security.polkit.enable = true;

  # Define a user account. Don't forget to set a password with passwd .
  users.users.jt = {
    isNormalUser = true;
    description = "Jarkko Toivanen";
    extraGroups = [ "networkmanager" "wheel" "dialout" "libvirtd" "docker" ];
    packages = with pkgs; [
      #firefox
      brave
      wineWowPackages.stable
      winetricks
      #heroic
      libreoffice
      nextcloud-client
      helvum
      solaar
      vlc
      youtube-music
      kate
      kdenlive
      gimp
      #discord
      #element-desktop
      nheko
      mumble
      bitwarden
      chiaki
      prismlauncher
      mangohud
      #vulkan-tools
      git
      rustup
      rust-analyzer
      cargo-cross
      gcc
      obs-studio
      appimage-run
      steam-run-native
      #thunderbird
      #xmrig
      exodus
      ft2-clone
    ];
  };

  programs.gnupg.agent = {
    enable = true;
    pinentryFlavor = "gtk2";
    enableSSHSupport = true;
  };

  # 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 is 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.11"; # Did you read the comment?

}