{ config, pkgs, lib, ... }:
let
  cfg = config.services.yabai;
  sketchybar-app-font = pkgs.callPackage ./../../common/sketchybar-app-font.nix {};
in {
  services.yabai = {
    enable = true;
    package = pkgs.unstable.yabai;
    enableScriptingAddition = true;
    config = {
      layout = "bsp";
      debug_output = "on";
      focus_follows_mouse = "autoraise";
      mouse_follows_focus = "off";

      window_placement    = "second_child";
      window_opacity      = "off";
      window_border       = "on";
      window_border_width = 1;
      window_border_blur  = "off";
      normal_window_border_color   = "0xff404066";
      active_window_border_color   = "0xffff2020";

      window_border_radius = 0;

      # top_padding         = 10;
      # bottom_padding      = 10;
      # left_padding        = 10;
      # right_padding       = 10;
      window_gap          = 0;

      external_bar = "all:40:0";
    };
  };

  services.skhd = {
    enable = true;
    skhdConfig = let
      mod = "alt";
      mod2 = "alt + ctrl";
      mod3 = "alt + shift";
      mod4 = "alt + cmd";
    in ''
      # Move window focus
      ${mod} - j : yabai -m window --focus south
      ${mod} - k : yabai -m window --focus north
      ${mod} - h : yabai -m window --focus west
      ${mod} - l : yabai -m window --focus east

      ${mod} - down : yabai -m window --focus south
      ${mod} - up : yabai -m window --focus north
      ${mod} - left : yabai -m window --focus west
      ${mod} - right : yabai -m window --focus east

      # Move windows
      ${mod3} - j : yabai -m window --warp south
      ${mod3} - k : yabai -m window --warp north
      ${mod3} - h : yabai -m window --warp west
      ${mod3} - l : yabai -m window --warp east

      ${mod3} - down : yabai -m window --warp south
      ${mod3} - up : yabai -m window --warp north
      ${mod3} - left : yabai -m window --warp west
      ${mod3} - right : yabai -m window --warp east

      # Move windows to different spaces
      ${mod2} - 1 : yabai -m window --space 1
      ${mod2} - 2 : yabai -m window --space 2
      ${mod2} - 3 : yabai -m window --space 3
      ${mod2} - 4 : yabai -m window --space 4
      ${mod2} - 5 : yabai -m window --space 5
      ${mod2} - 6 : yabai -m window --space 6
      ${mod2} - 7 : yabai -m window --space 7

      # Switch spaces
      ctrl - left : yabai -m space --focus prev
      ctrl - right : yabai -m space --focus next

      ctrl - 1 : yabai -m space --focus 1
      ctrl - 2 : yabai -m space --focus 2
      ctrl - 3 : yabai -m space --focus 3
      ctrl - 4 : yabai -m space --focus 4
      ctrl - 5 : yabai -m space --focus 5
      ctrl - 6 : yabai -m space --focus 6
      ctrl - 7 : yabai -m space --focus 7

      # Resize windows
      ${mod2} - j : yabai -m window --resize bottom:0:20
      ${mod2} - k : yabai -m window --resize bottom:0:-20
      ${mod2} - h : yabai -m window --resize right:-20:0
      ${mod2} - l : yabai -m window --resize right:20:0

      ${mod2} - down : yabai -m window --resize bottom:0:20
      ${mod2} - up : yabai -m window --resize bottom:0:-20
      ${mod2} - left : yabai -m window --resize right:-20:0
      ${mod2} - right : yabai -m window --resize right:20:0

      # Move windows to different displays
      ${mod2} + cmd - 1 : yabai -m window --display 1
      ${mod2} + cmd - 2 : yabai -m window --display 2
      ${mod2} + cmd - 3 : yabai -m window --display 3

      # Fullscreen
      ${mod2} - f : yabai -m window --toggle zoom-fullscreen
      ${mod2} + shift - f : yabai -m window --toggle native-fullscreen

      # Mirror layout
      ${mod2} - m : yabai -m space --mirror y-axis

      # Misc.
      ${mod2} - b : yabai -m space --balance
      ${mod2} - space : yabai -m window --toggle float --grid 4:4:1:1:2:2
      ${mod2} - return : yabai -m window --toggle split

      # Launch terminal
      cmd - return : open -n -a ${pkgs.alacritty}/Applications/Alacritty.app
    '';
  };

  services.sketchybar = {
    enable = true;
    package = pkgs.sketchybar;
    # The config is handled outside of nix, and is placed in ~/.config/sketchybar
  };

  fonts.packages = [
    sketchybar-app-font
  ];
}