{
  config,
  lib,
  ...
}:
with lib; let
  cfg = config.custom.desktops.niri.rules;
in {
  options.custom.desktops.niri.rules = {
    enable = mkOption {default = false;};
  };

  config = mkIf cfg.enable {
    home-manager.users.${config.custom.username} = {
      # https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
      programs.niri.settings = {
        # HACK: Name workspaces after index to use open-on-workspace rule
        workspaces = {
          "1" = {};
          "2" = {};
          "3" = {};
        };

        window-rules = [
          ### Defaults

          {
            # Global
            geometry-corner-radius = let
              radius = config.custom.rounding + 0.0; # Convert to float
            in {
              top-left = radius;
              top-right = radius;
              bottom-right = radius;
              bottom-left = radius;
            };

            clip-to-geometry = true;
          }

          {
            # Startup
            #?? <= 60 secs after niri launches
            matches = [{at-startup = true;}];
          }

          {
            # Android
            matches = [{app-id = "^[Ww]aydroid.*$";}];
          }

          {
            # Browsers
            matches = [
              {app-id = "^brave-browser$";}
              {app-id = "^chromium-browser$";}
              {app-id = "^firefox.*$";}
              {app-id = "^google-chrome$";}
              {app-id = "^vivaldi.*$";}
            ];

            open-on-workspace = "2";
          }

          {
            # Chats
            matches = [
              {app-id = "^cinny$";}
              {app-id = "^discord$";}
              {app-id = "^Element$";}
              {app-id = "^org\.telegram\.desktop$";}
            ];
          }

          {
            # Dropdown terminal
            matches = [{app-id = "^dropdown$";}];
          }

          {
            # Editors
            matches = [
              {app-id = "^codium$";}
              {app-id = "^obsidian$";}
            ];

            open-on-workspace = "2";
          }

          {
            # Files
            matches = [{app-id = "^org\.gnome\.Nautilus$";}];
          }

          {
            # Games
            matches = [
              {app-id = "^.*\.(exe|x86_64)$";}
              {app-id = "^moe\.launcher\..+$";}
              {app-id = "^net\.retrodeck\.retrodeck$";}
              {app-id = "^steam_app_.+$";}
            ];

            open-on-workspace = "1";
            variable-refresh-rate = true;
          }

          {
            # Media
            matches = [
              {app-id = "^org\.gnome\.Loupe$";}
              {app-id = "^Spotify$";}
              {app-id = "^totem$";}
              {app-id = "^YouTube Music$";}
            ];

            open-on-workspace = "3";
          }

          {
            # Office
            matches = [
              {app-id = "^draw\.io$";}
              {app-id = "^libreoffice$";}
              {app-id = "^ONLYOFFICE Desktop Editors$";}
            ];

            open-on-workspace = "2";
          }

          {
            # PiP
            matches = [{title = "^Picture.in.[Pp]icture$";}];
          }

          {
            # Terminals
            matches = [
              {app-id = "^foot$";}
              {app-id = "^kitty$";}
              {app-id = "^org\.wezfurlong\.wezterm$";}
            ];
          }

          {
            # Vaults
            matches = [
              {app-id = "^1Password$";}
              {app-id = "^Bitwarden$";}
            ];
          }

          {
            # Virtual machines
            matches = [
              {app-id = "^(sdl-|wl|x)freerdp$";}
              {app-id = "^looking-glass-client$";}
              {app-id = "^org\.remmina\.Remmina$";}
              {app-id = "^virt-manager$";}
            ];

            open-on-workspace = "1";
          }

          ### Overrides
        ];
      };
    };
  };
}