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

{

  # nix = {
  #   package = pkgs.nixVersions.git;
  # };

  # This adds hyprland cache to cachix and relaxes sandbox
  nix.settings = {
    substituters = [ "https://hyprland.cachix.org" ];
    trusted-public-keys =
      [ "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" ];
    sandbox = "relaxed";
  };

  # Use the systemd-boot EFI boot loader.
  boot = {
    kernelPackages = pkgs.linuxPackages_zen;
    kernelParams = [ "mem_sleep_default=deep" "nvme.noacpi=1" ];
    # initrd.kernelModules = [ "amdgpu" ];
  };

  # The global useDHCP flag is deprecated, therefore explicitly set to false here.
  # Per-interface useDHCP will be mandatory in the future, so this generated config
  # replicates the default behaviour.
  networking.useDHCP = false;

  boot.supportedFilesystems = [ "ntfs" ];

  services = {
    desktopManager.cosmic.enable = true;
  };

  programs.nix-ld.enable = true;
  programs.ssh.startAgent = true;
  security.pam.services.kwallet = {
    name = "kwallet";
    enableKwallet = true;
  };

  systemd.extraConfig = ''
    DefaultTimeoutStopSec=10s
    DefaultTimeoutStartSec=10s
  '';

  fonts.packages = with pkgs; [
    nerd-fonts.victor-mono
    noto-fonts
    noto-fonts-cjk-sans
    noto-fonts-emoji
    liberation_ttf
    mplus-outline-fonts.githubRelease
    dina-font
    proggyfonts
  ];

  hardware = { keyboard.qmk.enable = true; };

  security.pam.services = {
    # sddm.enableKwallet = true;
    greetd.enableKwallet = true;
    swaylock = { };
  };

  services.displayManager.cosmic-greeter = {
    enable = true;
  };

  services.greetd = {
    enable = true;
    # settings = rec {
    #   initial_session = {
    #     command = "dbus-run-session Hyprland";
    #     # command = "dbus-run-session startplasma-wayland";
    #     user = "chris";
    #   };
    #   default_session = {
    #     command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time -r --window-padding 2 --cmd 'dbus-run-session Hyprland' -s /etc/greetd/environments";
    #     user = "greeter";
    #   };
    #   plasma_session = {
    #     command = "dbus-run-session startplasma-wayland";
    #     user = "chris";
    #   };
    #   hyprland_session = {
    #     command = "Hyprland";
    #     user = "chris";
    #   };
    # };
  };

  programs.regreet = { enable = true; };

  environment.etc."greetd/environments".text = ''
    hyprland
    dbus-run-session startplasma-wayland
    fish
    bash
  '';

  qt = {
    platformTheme = "qt5ct";
    enable = true;
  };

  xdg.portal = {
    enable = true;
    extraPortals = [ pkgs.xdg-desktop-portal-kde ];
  };

  programs.hyprland = {
    enable = true;
    xwayland.enable = true;
  };

  services.avahi = {
    enable = true;
    nssmdns4 = true;
  };

  # Enable sound.
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    jack.enable = true;
    wireplumber.enable = true;
  };

  # Needed for some pipewire progs and other gtk apps
  programs.dconf.enable = true;

  environment.variables = {
    EDITOR = "emacsclient -t -a";
    VISUAL = "emacsclient -c -a";
    QT_LOGGING_RULES = "js=true; kwin_*.debug=true";
    # GTK_USE_PORTAL = "1";
    # Fixing Qt apps in other environments
    # Thought I needed this but apparently they are working fine without it.
    # QT_XCB_GL_INTEGRATION = "xcb_egl";
    # QT_QPA_PLATFORM_PLUGIN_PATH = "${pkgs.qt5.qtbase.bin}/lib/qt-${pkgs.qt5.qtbase.qtCompatVersion}/plugins/platforms";
    NIXOS_OZONE_WL = "1";
    _JAVA_AWT_WM_NONEREPARENTING = "1";
    # DISABLE_QT5_COMPAT = "0";
    GDK_BACKEND = "wayland";
    ANKI_WAYLAND = "1";
    WLR_DRM_NO_ATOMIC = "1";
    QT_AUTO_SCREEN_SCALE_FACTOR = "1";
    QT_QPA_PLATFORM = "wayland";
    # QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
    # QT_QPA_PLATFORMTHEME = "qt5ct";
    MOZ_ENABLE_WAYLAND = "1";
    MOZ_DBUS_REMOTE = "1";
    WLR_BACKEND = "vulkan";
    WLR_RENDERER = "vulkan";
    XDG_SESSION_TYPE = "wayland";
    # Remember that this causes issues in some games use "unset SDL_VIDEODRIVER &&"
    SDL_VIDEODRIVER = "wayland";
    CLUTTER_BACKEND = "wayland";
    WLR_NO_HARDWARE_CURSORS = "1";
  };

  programs.partition-manager.enable = true;
  programs.kdeconnect.enable = true;

  # Turn on flatpak
  services.flatpak.enable = true;

  # Configure keymap in X11
  services.xserver.xkb.layout = "us";

  # Enable CUPS to print documents.
  services.printing.enable = true;
  services.printing.drivers =
    [ pkgs.gutenprint pkgs.gutenprintBin pkgs.cnijfilter2 ];

  services.usbmuxd.enable = true;
  services.fstrim.enable = true;

  #######################
  # VIRTUALIZATION
  #######################

  # virtualisation.waydroid.enable = true;
  virtualisation.podman.enable = true;
  # virtualisation.docker.enable = true;
  virtualisation.libvirtd = {
    enable = true;
    qemu = {
      runAsRoot = false;
      ovmf = {
        enable = true;
        # packages = [
        #   pkgs.OVMFFull.fd
        #   pkgs.pkgsCross.aarch64-multiplatform.OVMF.fd
        # ];
      };
      swtpm.enable = true;
    };
  };
  services.samba-wsdd.enable = true;
  services.samba = {
    enable = true;
    # settings = {
    #   workgroup = "WORKGROUP";
    #   "server string" = "smbnix";
    #   "netbios name" = "smbnix";
    #   security = "user";
    #   "hosts allow" = ["192.168.0." "127.0.0.1" "localhost"];
    #   "hosts deny" = "0.0.0.0/0";
    #   "guest account" = "nobody";
    #   "map to guest" = "bad user";
    # };
    shares = {
      public = {
        path = "/home/chris";
        "read only" = false;
        browsable = true;
        "guest ok" = true;
        comment = "Share";
      };
    };
  };

  # Android Tools
  programs.adb.enable = true;
  services.udev.packages = [ pkgs.android-udev-rules ];

  services.esphome = { enable = true; };
}