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

let
  # inputs
  system = pkgs.stdenv.hostPlatform.system;
  hyprland = inputs.hyprland.packages.${system};
  hyprland-plugins = inputs.hyprland-plugins.packages.${system};
  hy3 = inputs.hy3.packages.${system};

  browser = "firefox";
  launcher = "wofi --show drun --prompt \"Search Program\"";
  lock_screen = "hyprlock";
  terminal = "kitty";
in
{
  config = lib.mkIf config.desktop.enable {

    home-manager.users.${config.user} = {
      wayland.windowManager.hyprland = {

        enable = true;
        package = hyprland.hyprland;

        # Plugins
        plugins = [
          hyprland-plugins.hyprexpo
          hy3.hy3
        ];

        # Config
        settings = {
          # Monitors
          monitor = [
            "${config.monitor.name}, highres, auto, ${toString config.monitor.scale}"
          ];

          # Autostart
          exec-once = [
            "waybar"
            "thunderbird"
            "discord --enable-features=UseOzonePlatform --ozone-platform=wayland"
            "element-desktop --enable-features=UseOzonePlatform --ozone-platform=wayland"
          ];

          # General
          general = {
            gaps_in = config.theme.innerGap;
            gaps_out = config.theme.outerGap;
            layout = "hy3";
            resize_on_border = "yes";
            extend_border_grab_area = 20;
            border_size = config.theme.borderWidth;
            "col.active_border" = "rgb(${config.theme.accentColor})";
            "col.inactive_border" = "rgb(${config.theme.colors.base04})";
          };

          # Gestures
          gestures = {
            workspace_swipe = true;
            workspace_swipe_fingers = 3;
            workspace_swipe_forever = true;
            workspace_swipe_cancel_ratio = 0.15;
          };

          # Decoration
          decoration = {
            rounding = config.theme.outerRadius;
            shadow.enabled = false;
            blur = {
              enabled = true;
              size = 4;
              passes = 2;
              noise = 0.008;
              contrast = 0.8916;
              brightness = 0.8;
            };
          };

          # Animations
          animations = {
            enabled = true;

            bezier = [
              "windowIn, 0.06, 0.71, 0.25, 1"
              "windowResize, 0.04, 0.67, 0.38, 1"
            ];

            animation = [
              "windowsIn, 1, 3, windowIn, slide #popin 20%"
              "windowsOut, 1, 3, windowIn, slide #popin 70%"
              "windowsMove, 1, 2.5, windowResize"
              "border, 1, 10, default"
              "borderangle, 1, 8, default"
              "fade, 1, 3, default"
              "workspaces, 1, 6, default"
              "layers, 1, 5, windowIn, slide"
            ];
          };

          # Environment
          env = [
            "XDG_CURRENT_DESKTOP,Hyprland"
            "XDG_SESSION_DESKTOP,Hyprland"

            "XCURSOR_THEME,Adwaita"
            "XCURSOR_SIZE,24"

            "GTK_THEME,Orchis-Teal-Dark"
            "GDK_SCALE,${toString config.monitor.scale}"

            "MOZ_ENABLE_WAYLAND,1"
            "MOZ_USE_XINPUT,1"
            "_JAVA_AWT_WM_NONREPARENTING,1"
          ];

          # Input
          input = {
            kb_layout = "us";
            kb_variant = "";
            kb_model = "";
            kb_options = "gtp:alt_shit_toggle, compose:ralt";
            kb_rules = "";
            follow_mouse = 1;
            touchpad = {
              natural_scroll = "yes";
            };
            sensitivity = 0;
          };

          # Keybinds
          "$mod" = "SUPER";
          bind = [
            # Launch programs

            "$mod, W, exec, ${browser}"
            "$mod, D, exec, ${launcher}"
            "$mod, L, exec, ${lock_screen}"
            "$mod, Return, exec, ${terminal}"

            # Misc

            "$mod SHIFT, L, exit"
            "$mod, tab, hyprexpo:expo, toggle"

            # Window operations

            "$mod SHIFT, Q, killactive"
            "$mod SHIFT, SPACE, togglefloating"
            "$mod, F, fullscreen"
            "$mod, J, togglesplit"

            # Move focus with mod + arrow keys

            "$mod, left, movefocus, l"
            "$mod, right, movefocus, r"
            "$mod, up, movefocus, u"
            "$mod, down, movefocus, d"

            # Move window across workspace with mod + arrow keys

            "$mod SHIFT, left, hy3:movewindow, l"
            "$mod SHIFT, right, hy3:movewindow, r"
            "$mod SHIFT, up, hy3:movewindow, u"
            "$mod SHIFT, down, hy3:movewindow, d"

            # Switch workspaces with mod + [0-9]

            "$mod, 1, workspace, 1"
            "$mod, 2, workspace, 2"
            "$mod, 3, workspace, 3"
            "$mod, 4, workspace, 4"
            "$mod, 5, workspace, 5"
            "$mod, 6, workspace, 6"
            "$mod, 7, workspace, 7"
            "$mod, 8, workspace, 8"
            "$mod, 9, workspace, 9"

            # Move active window to a workspace with mod + SHIFT + [0-9]

            "$mod SHIFT, 1, movetoworkspacesilent, 1"
            "$mod SHIFT, 2, movetoworkspacesilent, 2"
            "$mod SHIFT, 3, movetoworkspacesilent, 3"
            "$mod SHIFT, 4, movetoworkspacesilent, 4"
            "$mod SHIFT, 5, movetoworkspacesilent, 5"
            "$mod SHIFT, 6, movetoworkspacesilent, 6"
            "$mod SHIFT, 7, movetoworkspacesilent, 7"
            "$mod SHIFT, 8, movetoworkspacesilent, 8"
            "$mod SHIFT, 9, movetoworkspacesilent, 9"
            "$mod SHIFT, 0, movetoworkspacesilent, 10"

            # Move to tab

            "LALT, 1, hy3:focustab, index, 01"
            "LALT, 2, hy3:focustab, index, 02"
            "LALT, 3, hy3:focustab, index, 03"
            "LALT, 4, hy3:focustab, index, 04"
            "LALT, 5, hy3:focustab, index, 05"
            "LALT, 6, hy3:focustab, index, 06"
            "LALT, 7, hy3:focustab, index, 07"
            "LALT, 8, hy3:focustab, index, 08"
            "LALT, 9, hy3:focustab, index, 09"
            "LALT, 0, hy3:focustab, index, 10"

            "$mod SHIFT, B, hy3:makegroup, h"
            "$mod SHIFT, V, hy3:makegroup, v"
            "$mod SHIFT, C, hy3:changegroup, toggletab"

            # Scroll through existing workspaces with mod + scroll

            "$mod, mouse_down, workspace, e+1"
            "$mod, mouse_up, workspace, e-1"
          ];

          bindn = [
            # Focus windows with scroll wheel or middle click

            ", mouse:272, hy3:focustab, mouse"
            ", mouse_down, hy3:focustab, l, require_hovered"
            ", mouse_up, hy3:focustab, r, require_hovered"
          ];

          bindm = [
            # Move/resize windows with mod + LMB/RMB and dragging

            "$mod, mouse:272, movewindow"
            "$mod, mouse:273, resizewindow"
          ];

          binde = [
            # Audio

            # raise volume
            ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"
            # lower volume
            ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
            # mute speaker
            ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
            # mute mic
            ", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"

            # Media

            # play
            ", XF86AudioPlay, exec, playerctl play-pause"
            # next
            ", XF86AudioNext, exec, playerctl next"
            # prev
            ", XF86AudioPrev, exec, playerctl previous"

            # Backlight

            ", XF86MonBrightnessDown, exec, brightnessctl set 5%-"
            ", XF86MonBrightnessUp, exec, brightnessctl set 5%+"
          ];

          # Plugin configuration
          plugin = {
            # hy3
            hy3 = {
              tabs = {
                height = 24;
                text_height = 9;
                text_padding = 10;
                padding = 2;
                render_text = true;
                text_font = "monospace";
                radius = config.theme.outerRadius;

                "col.active" = "rgb(${config.theme.colors.base00})";
                "col.inactive" = "rgb(${config.theme.colors.base00})";
                "col.text.active" = "rgb(${config.theme.colors.base05})";
                "col.text.inactive" = "rgb(${config.theme.colors.base05})";
                "col.border.active" = "rgb(${config.theme.accentColor})";
                "col.border.inactive" = "rgb(${config.theme.colors.base04})";
              };

              autotile = {
                enable = true;
              };
            };
          };

          # XWayland
          xwayland = {
            force_zero_scaling = "true";
            use_nearest_neighbor = "false";
          };

          # Misc
          misc = {
            disable_hyprland_logo = true;
            disable_splash_rendering = true;
            key_press_enables_dpms = true;
            mouse_move_enables_dpms = true;
            vrr = 1;
          };
        };
      };
    };

  };
}