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

let

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

  debug = true;

in

{
  environment = {
    variables = {
      HYPRLAND_TRACE = if debug then "1" else "0";
      AQ_TRACE = if debug then "1" else "0";

      XDG_CURRENT_DESKTOP = "Hyprland";
      XDG_SESSION_TYPE = "wayland";
      XDG_SESSION_DESKTOP = "Hyprland";
      LIBSEAT_BACKEND = "logind";
    };
    sessionVariables = {
      XCURSOR_THEME = "Adwaita";
      XCURSOR_SIZE = "24";

      GTK_THEME = "Orchis-Teal-Dark";

      MOZ_ENABLE_WAYLAND = "1";
      MOZ_USE_XINPUT = "1";
      _JAVA_AWT_WM_NONREPARENTING = "1";
    };
  };

  xdg.portal = {
    enable = true;
    xdgOpenUsePortal = true;
    config = {
      common.default = ["gtk"];
      hyprland.default = ["gtk" "hyprland"];
    };
    extraPortals = [
      pkgs.xdg-desktop-portal-gtk
      pkgs.xdg-desktop-portal-wlr
      hyprland.xdg-desktop-portal-hyprland
    ];
  };

  programs.xwayland.enable = true;

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

      enable = true;
      package = hyprland.hyprland;

      xwayland.enable = true;
      systemd.enable = true;

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

      # Config
      settings = {

        # Debug
        debug.disable_logs = ! debug;
        debug.disable_time = ! debug;
        debug.enable_stdout_logs = debug;

        # Monitors
        monitor = map (monitor:
          "${monitor.name}, highres, auto, ${toString monitor.scale}"
        ) config.monitors;

        # Autostart
        exec-once = config.autoRun;

        # 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.colors.accent})";
          "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"
          ];
        };

        # 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, ${config.default.browser}"
          "$mod, D, exec, ${config.default.appLauncher}"
          "$mod, L, exec, ${config.default.lockScreen}"
          "$mod, Return, exec, ${config.default.terminal}"
          ", Print, exec, grimblast copy area"

          # 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;
              border_width = config.theme.borderWidth;

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

            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;
        };
      }; # end settings

    }; # end hyprland
  }; # end home-manager

}