{ config, lib, pkgs, hyprland, wayland, split-monitor-workspaces, ... }:

{

  home.file.hyprland-catppuccino = let flavour = "frappe";
  in {
    enable = true;
    target = ".config/hypr/catppuccino.conf";
    text = builtins.readFile (pkgs.fetchFromGitHub {
      owner = "catppuccin";
      repo = "hyprland";
      rev = "99a88fd21fac270bd999d4a26cf0f4a4222c58be";
      sha256 = "sha256-07B5QmQmsUKYf38oWU3+2C6KO4JvinuTwmW1Pfk8CT8=";
    } + /themes/${flavour}.conf);
  };

  wayland.windowManager.hyprland = {
    enable = true;
    systemd.enable = true;
    package = hyprland.packages.${pkgs.system}.hyprland;
    plugins = [
      split-monitor-workspaces.packages.${pkgs.system}.split-monitor-workspaces
    ];
    settings = {
      source =
        [ "~/.config/hypr/monitors.conf" "~/.config/hypr/catppuccino.conf" ];
      input = {
        kb_layout = "de";
        kb_options = "caps:swapescape";
        follow_mouse = 1;
        touchpad = { natural_scroll = false; };
        sensitivity = 0;
      };
      general = {
        gaps_in = 15;
        gaps_out = 15;
        border_size = 1;
        resize_on_border = true;
        "col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
        "col.inactive_border" = "rgba(595959aa)";
        layout = "master";
      };
      misc = {
        vfr = true;
        vrr = 1;
        animate_manual_resizes = true;
      };
      decoration = {
        rounding = 10;
        drop_shadow = true;
        shadow_range = 4;
        shadow_render_power = 3;
        "col.shadow" = "rgba(1a1a1aee)";
        blur = { enabled = true; };
      };
      animations = {
        enabled = true;
        bezier = "myBezier, 0.05, 0.9, 0.1, 1.05";
        animation = [
          "windows, 1, 7, myBezier"
          "windowsOut, 1, 7, default, popin 80%"
          "border, 1, 10, default"
          "borderangle, 1, 8, default"
          "fade, 1, 7, default"
          "workspaces, 1, 6, default"
        ];
      };
      dwindle = {
        pseudotile = false;
        preserve_split = true;
        force_split = 0;
        default_split_ratio = 1.5;
      };
      master = {
        new_is_master = false;
        orientation = "center";
        always_center_master = true;
        mfact = 0.5;
        special_scale_factor = 0.8;
      };
      gestures = { workspace_swipe = false; };

      "$lockscreen" = "${pkgs.swaylock-effects}/bin/swaylock";
      "$mainMod" = "SUPER";

      bind = [
        "$mainMod, Q, exec, ${pkgs.kitty}/bin/kitty"
        "$mainMod, C, killactive,"
        #"$mainMod, M, exit,"
        "$mainMod, M, exec, ${pkgs.wlogout}/bin/wlogout"
        "$mainMod, E, exec, dolphin"
        "$mainMod, V, togglefloating,"
        #"$mainMod, R, exec, ${pkgs.fuzzel}/bin/fuzzel"
        "$mainMod, R, exec, ${pkgs.tofi}/bin/tofi-drun"
        "$mainMod, P, pseudo," # dwindle
        "$mainMod, J, togglesplit," # dwindle
        "$mainMod, T, togglegroup,"
        "$mainMod, A, layoutmsg, swapwithmaster master"
        "$mainMod, I, layoutmsg, orientationcenter"
        "$mainMod, H, layoutmsg, orientationleft"
        "$mainMod, L, layoutmsg, orientationright"
        # Screenshots
        #"SHIFT, PRINT, exec, hyprshot -m region"
        ''
          SHIFT, PRINT, exec, ${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" - | ${pkgs.swappy}/bin/swappy -f -''
        "$mainMod SHIFT, L, exec, $lockscreen"
        # Move focus
        "$mainMod, left, movefocus, l"
        "$mainMod, right, movefocus, r"
        "$mainMod, up, movefocus, u"
        "$mainMod, down, movefocus, d"

        # Move windows inside a workspace
        "$mainMod SHIFT, a, movewindoworgroup, l"
        "$mainMod SHIFT, d, movewindoworgroup, r"

        #Handle tabbed windows
        "$mainMod, tab, changegroupactive,"
        "$mainMod SHIFT, T, lockactivegroup, toggle"

        # Switch workspaces
        "$mainMod, 1, split-workspace, 1"
        "$mainMod, 2, split-workspace, 2"
        "$mainMod, 3, split-workspace, 3"
        "$mainMod, 4, split-workspace, 4"
        "$mainMod, 5, split-workspace, 5"
        "$mainMod, 6, split-workspace, 6"
        "$mainMod, 7, split-workspace, 7"
        "$mainMod, 8, split-workspace, 8"
        "$mainMod, 9, split-workspace, 9"
        # Move windows to workspaces
        "$mainMod SHIFT, 1, split-movetoworkspace, 1"
        "$mainMod SHIFT, 2, split-movetoworkspace, 2"
        "$mainMod SHIFT, 3, split-movetoworkspace, 3"
        "$mainMod SHIFT, 4, split-movetoworkspace, 4"
        "$mainMod SHIFT, 5, split-movetoworkspace, 5"
        "$mainMod SHIFT, 6, split-movetoworkspace, 6"
        "$mainMod SHIFT, 7, split-movetoworkspace, 7"
        "$mainMod SHIFT, 8, split-movetoworkspace, 8"
        "$mainMod SHIFT, 9, split-movetoworkspace, 9"
        "$mainMod SHIFT, ß, split-movetoworkspace, special"
        # Scroll through workspaces
        "$mainMod, mouse_down, workspace, e+1"
        "$mainMod, mouse_up, workspace, e-1"
        # Special workspace
        "SHIFT ALT, RETURN, togglespecialworkspace"
      ];

      # Mouse bindings
      # 274: Middle mouse button
      # 275: left near
      # 276: left far
      # 277: right near
      # 278: right far
      bindm = [
        "$mainMod, mouse:272, movewindow"
        "$mainMod, mouse:273, resizewindow"
      ];

      windowrulev2 = [ "tile,class:(pharo)" ];

      # Autostart
      exec-once = [
        "[workspace special] ${pkgs.kitty}/bin/kitty"
        "sleep 1; hyprctl dispatch layoutmsg orientationleft; hyprctl dispatch togglespecialworkspace"
        "hyprpaper"
      ];
    };
  };

}