{
  pkgs,
  lib,
  config,
  ...
}:
let
  adhereTheSwayTarget = {
    Install.WantedBy = lib.mkForce [ "sway-session.target" ];
    Unit.PartOf = lib.mkForce [ "sway-session.target" ];
  };
  # TODO: active screen with -m $active_screen
  bemenuLauncher = pkgs.writeScriptBin "bemenuLauncher" ''
    #!${pkgs.stdenv.shell}
    #active_screen=$(swaymsg -r -t get_outputs | \
    #  ${pkgs.jq}/bin/jq '. [] | select (.focused == true) | .name | split ("-") | last')
    ${pkgs.dmenu}/bin/dmenu_path | \
      ${pkgs.bemenu}/bin/bemenu --list 20 --ignorecase --prompt 'Start: ' | \
      xargs swaymsg exec --
  '';
in
rec {
  home.packages = with pkgs; [
    sway-contrib.grimshot
    wl-clipboard
    libappindicator
    adwaita-icon-theme
    gnome-icon-theme
    hicolor-icon-theme # TODO: Move these requirements?
    fuzzel # Required for rofimoji
  ];

  xsession.preferStatusNotifierItems = true;

  wayland.windowManager.sway = {
    enable = true;
    systemd.enable = true;
    xwayland = true;
    wrapperFeatures = {
      gtk = true;
    };
    extraSessionCommands = ''
      #export XDG_CURRENT_DESKTOP=Unity
      export XDG_CURRENT_DESKTOP=sway
      export XDG_SESSION_TYPE="wayland"
      export _JAVA_AWT_WM_NONREPARENTING=1
      export QT_QPA_PLATFORM=wayland
      export QT_WAYLAND_DISABLE_WINDOWDECORATION="1"
      # TODO: QTpie
      export WLR_DRM_NO_MODIFIERS=1
      export WLR_NO_HARDWARE_CURSORS=1
    '';
    config = {
      input = {
        "type:keyboard" = {
          xkb_layout = "ch,de";
          xkb_options = "eurosign:e";
        };
        "*" = {
          xkb_numlock = "enable";
        };
      };
      terminal = "${pkgs.kitty}/bin/kitty";
      menu = "${bemenuLauncher}/bin/bemenuLauncher";
      gaps.inner = 8;
      modifier = "Mod4";
      window.border = 0;
      #colors.focused.border = "#323232";

      #TODO: Workspace Programm assignment: Not working properly
      assigns = {
        "10" = [ { app_id = "^firefox$"; } ];
        "11" = [ { app_id = "^(claws-mail|thunderbird|evolution)$"; } ];
        "12" = [
          {
            class = "^Chromium-browser$";
            instance = "^web.threema.ch";
          }
        ];
        "13" = [ { class = "^Spotify$"; } ];
      };

      keybindings =
        let
          mod = wayland.windowManager.sway.config.modifier;
          playerctl = "${pkgs.playerctl}/bin/playerctl";
          wpctl = "${pkgs.wireplumber}/bin/wpctl";
          light = "${pkgs.light}/bin/light";
        in
        lib.mkOptionDefault {
          "${mod}+p" = "exec passbemenu";
          "${mod}+Shift+d" = "exec ${pkgs.rofimoji}/bin/rofimoji --action type --selector fuzzel";
          "${mod}+x" = "move workspace to output right";
          "${mod}+y" = "move workspace to output left";

          "${mod}+section" = "workspace 0";
          "${mod}+0" = "workspace 10";
          "${mod}+apostrophe" = "workspace 11";
          "${mod}+dead_circumflex" = "workspace 12";
          "${mod}+dead_diaeresis" = "workspace 13";
          "${mod}+dollar" = "workspace 14";

          "${mod}+Shift+section" = "move container to workspace 0";
          "${mod}+Shift+0" = "move container to workspace 10";
          "${mod}+Shift+apostrophe" = "move container to workspace 11";
          "${mod}+Shift+dead_circumflex" = "move container to workspace 12";
          "${mod}+Shift+dead_diaeresis" = "move container to workspace 13";
          "${mod}+Shift+dollar" = "move container to workspace 14";

          "Ctrl+mod1+l" = "exec ${pkgs.systemd}/bin/loginctl lock-session";
          "Ctrl+mod1+Shift+L" = "exec ${pkgs.systemd}/bin/systemctl suspend";

          # pulse audio volume control
          XF86AudioLowerVolume = "exec ${wpctl} set-volume @DEFAULT_AUDIO_SINK@ 3%-";
          XF86AudioRaiseVolume = "exec ${wpctl} set-volume @DEFAULT_AUDIO_SINK@ 3%+";
          XF86AudioMute = "exec ${wpctl} set-mute @DEFAULT_AUDIO_SINK@ toggle";
          XF86AudioMicMute = "exec ${wpctl} set-mute @DEFAULT_AUDIO_SOURCE@ toggle";

          # Spotify control
          XF86AudioPause = "exec ${playerctl} play-pause";
          XF86AudioPlay = "exec ${playerctl} play-pause";
          XF86AudioNext = "exec ${playerctl} next";
          XF86AudioPrev = "exec ${playerctl} previous";

          # screen brightness
          XF86MonBrightnessUp = "exec ${light} -A 10";
          XF86MonBrightnessDown = "exec ${light} -U 5";

          # screenshot
          Print = "exec ${pkgs.sway-contrib.grimshot}/bin/grimshot copy area";
        };
    };
    extraConfig = ''
      # Disable the laptop screen when the lid is closed.
      bindswitch --reload lid:on output eDP-1 disable
      bindswitch --reload lid:off output eDP-1 enable

      # Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=1338554
      for_window [app_id="^chrome-.*-.*$"] shortcuts_inhibitor disable

      output "*" bg ${./mountain.jpg} fill
    '';
  };
  catppuccin.sway.enable = true;

  systemd.user.services.network-manager-applet = adhereTheSwayTarget;
  systemd.user.services.nextcloud-client = adhereTheSwayTarget // {
    # For trayicon to work:
    Unit.After = lib.mkForce [ "waybar.service" ];
    Service = {
      ExecStartPre = "${pkgs.coreutils}/bin/sleep 3";
      Environment = lib.mkForce "PATH=${config.home.profileDirectory}/bin XDG_CURRENT_DESKTOP=Unity";
    };
  };
  systemd.user.services.pasystray = adhereTheSwayTarget;

  gtk = {
    iconTheme = {
      # package = pkgs.gnome-icon-theme;
      # name = "gnome";
      package = pkgs.hicolor_icon_theme;
      name = "hicolor";
    };
    gtk3.extraConfig.gtk-menu-images = true;
  };
  catppuccin.gtk.enable = true;

  dconf.settings = {
    "org/gnome/desktop/interface".menus-have-icons = true;
  };
}
