{
  config,
  lib,
  pkgs,
  hostname,
  ...
}: let
  closer = pkgs.writeShellApplication {
    name = "closer";

    runtimeInputs = with pkgs; [jq xdotool];

    text = ''
      if [ "$(hyprctl activewindow -j | jq -r ".class")" = "Steam" ]; then
        xdotool getactivewindow windowunmap
      else
        hyprctl dispatch killactive ""
      fi
    '';
  };
in {
  home.packages = with pkgs; [
    swaybg
  ];

  home.file = {
    ".config/hypr/macchiato.conf" = {
      source = ./macchiato.conf;
    };
  };

  services.blueman-applet.enable = true;

  wayland.windowManager.hyprland = {
    enable = true;
    package = pkgs.hyprland;
    xwayland = {
      enable = true;
    };
    extraConfig =
      (builtins.readFile ./${hostname}.conf)
      + ''
        env = LIBVA_DRIVER_NAME,nvidia
        env = XDG_SESSION_TYPE,wayland
        env = __GLX_VENDOR_LIBRARY_NAME,nvidia
        env = WLR_NO_HARDWARE_CURSORS,1

        # See https://wiki.hyprland.org/Configuring/Keywords/ for more

        # Execute your favorite apps at launch
        exec-once = waybar
        exec-once = swaybg -i ~/wallpapers/wallpaper.jpg

        # Source a file (multi-file configs)
        # source = ~/.config/hypr/myColors.conf
        source = ./macchiato.conf

        # For all categories, see https://wiki.hyprland.org/Configuring/Variables/
        input {
            kb_layout = gb
            kb_variant =
            kb_model =
            kb_options = caps:escape
            kb_rules =

            follow_mouse = 2

            touchpad {
                natural_scroll = yes
                middle_button_emulation = yes
                scroll_factor = 0.5
            }

            accel_profile = flat
            sensitivity = 0.5 # -1.0 - 1.0, 0 means no modification.
        }

        general {
            # See https://wiki.hyprland.org/Configuring/Variables/ for more

            gaps_in = 5
            gaps_out = 10
            border_size = 2
            col.active_border = $green
            col.inactive_border = rgba(595959aa)

            layout = dwindle
        }

        decoration {
            # See https://wiki.hyprland.org/Configuring/Variables/ for more

            rounding = 10
            blur {
              enabled = true
              size = 3
              passes = 1
            }

            drop_shadow = yes
            shadow_range = 4
            shadow_render_power = 3
            col.shadow = rgba(1a1a1aee)

            dim_inactive = true
            dim_strength = 0.1
        }

        animations {
            enabled = yes

            # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more

            bezier = myBezier, 0.05, 0.9, 0.1, 1.05

            animation = windows, 1, 1, myBezier
            animation = windowsOut, 1, 2, default, popin 80%
            animation = border, 0, 2, default
            animation = borderangle, 0, 2, default
            animation = fade, 0, 2, default
            animation = workspaces, 1, 1, default
        }

        dwindle {
            # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
            pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
            preserve_split = yes # you probably want this
        }

        master {
            # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
            new_is_master = true
        }

        gestures {
            # See https://wiki.hyprland.org/Configuring/Variables/ for more
            workspace_swipe = true
            workspace_swipe_fingers = 4
        }

        # Example per-device config
        # See https://wiki.hyprland.org/Configuring/Keywords/#executing for more
        device:epic mouse V1 {
            sensitivity = -0.5
        }


        misc {
          disable_hyprland_logo = true
        }

        xwayland {
          force_zero_scaling = true
        }

        # Example windowrule v1
        # windowrule = float, ^(kitty)$
        # Example windowrule v2
        # windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
        # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more

        # Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
        bind = $mainMod, return, exec, kitty
        bind = $mainMod, Q, exec, ${closer}/bin/closer
        bind = $mainMod, D, exec, tofi-drun --drun-launch=true
        bind = $mainMod SHIFT, S, exec, grim -g "$(slurp)"

        # Move focus with mainMod + vim keys
        bind = $mainMod, H, movefocus, l
        bind = $mainMod, L, movefocus, r
        bind = $mainMod, K, movefocus, u
        bind = $mainMod, J, movefocus, d

        # Move focus with mainMod + vim keys
        bind = $mainMod, left, movewindow, l
        bind = $mainMod, right, movewindow, r
        bind = $mainMod, up, movewindow, u
        bind = $mainMod, down, movewindow, d

        # Switch workspaces with mainMod + [0-9]
        bind = $mainMod, 1, workspace, 1
        bind = $mainMod, 2, workspace, 2
        bind = $mainMod, 3, workspace, 3
        bind = $mainMod, 4, workspace, 4
        bind = $mainMod, 5, workspace, 5
        bind = $mainMod, 6, workspace, 6
        bind = $mainMod, 7, workspace, 7
        bind = $mainMod, 8, workspace, 8
        bind = $mainMod, 9, workspace, 9
        bind = $mainMod, 0, workspace, 10

        # Move active window to a workspace with mainMod + SHIFT + [0-9]
        bind = $mainMod SHIFT, 1, movetoworkspace, 1
        bind = $mainMod SHIFT, 2, movetoworkspace, 2
        bind = $mainMod SHIFT, 3, movetoworkspace, 3
        bind = $mainMod SHIFT, 4, movetoworkspace, 4
        bind = $mainMod SHIFT, 5, movetoworkspace, 5
        bind = $mainMod SHIFT, 6, movetoworkspace, 6
        bind = $mainMod SHIFT, 7, movetoworkspace, 7
        bind = $mainMod SHIFT, 8, movetoworkspace, 8
        bind = $mainMod SHIFT, 9, movetoworkspace, 9
        bind = $mainMod SHIFT, 0, movetoworkspace, 10

        bind = $mainMod, U, movetoworkspace, -1
        bind = $mainMod, I, movetoworkspace, +1

        bind = $mainMod SHIFT, space, togglefloating,

        bind = $mainMod, F, fullscreen,

        bind=$mainMod, escape, exec, swaylock -i ~/wallpapers/lock.png

        binde=, XF86AudioLowerVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%-
        bind=, XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
        binde=, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+

        binde=, XF86MonBrightnessUp, exec, xbacklight -inc 10
        binde=, XF86MonBrightnessDown, exec, xbacklight -dec 10

        # Move/resize windows with mainMod + LMB/RMB and dragging
        bindm = $mainMod, mouse:272, movewindow
        bindm = $mainMod, mouse:273, resizewindow
        bind = $mainMod, mouse:274, togglefloating
      '';
  };

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