{ pkgs, config, hyprland, hyprgrass, ags, ... }: let
  configDir = (import ../vars.nix).configDir;
  symlink = config.lib.file.mkOutOfStoreSymlink;

  gset = pkgs.gsettings-desktop-schemas;
  polkit = pkgs.plasma5Packages.polkit-kde-agent;
in
{
  imports = [
    ags.homeManagerModules.default
  ];

  programs.ags = {
    enable = true;
    package = ags.packages.x86_64-linux.default;
    configDir = symlink "${configDir}/ags";
  };

  wayland.windowManager.hyprland = {
    enable = true;
    package = hyprland.packages.x86_64-linux.default;

    plugins = [
      "${hyprgrass.packages.x86_64-linux.default}/lib/libhyprgrass.so"
    ];

    settings = {
      env = [
        "XDG_DATA_DIRS, ${builtins.concatStringsSep ":" [
          "${gset}/share/gsettings-schemas/${gset.name}"
          "${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}"
          "$XDG_DATA_DIRS"
        ]}"

        "AGS_PATH, ${configDir}/ags/bin"
        "HYPR_PATH, ${configDir}/hypr/scripts"
        "LOCK_PATH, ${configDir}/gtklock/scripts"
      ];

      exec-once = [ "${polkit}/libexec/polkit-kde-authentication-agent-1" ];
      source = [ "~/.config/hypr/main.conf" ];
    };
  };

  xdg.configFile = {
    "hypr/main.conf".source       = symlink "${configDir}/hypr/main.conf";
    "hypr/hyprpaper.conf".source  = symlink "${configDir}/hypr/hyprpaper.conf";
  };

  home.packages = with pkgs; [
    # ags
    sassc
    coloryou
    libnotify
    playerctl
    bluez-tools
    brightnessctl
    pulseaudio
    libinput

    ## gui
    pavucontrol # TODO: replace with ags widget
    networkmanagerapplet # TODO: replace with ags widget
    blueberry # TODO: replace with ags widget


    # Hyprland
    hyprpaper
    swayidle
    lisgd
    swayosd
    squeekboard
    xclip
    wl-clipboard
    cliphist

    ## gui
    gtklock
    wl-color-picker # TODO: add bind for this in hyprland
    grim
    slurp
    swappy

    ## libs
    libayatana-appindicator
    xdg-utils
    evtest
    glib
  ];
}