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

with lib;

let
  cfg = config.targets.darwin;
  homeDir = config.home.homeDirectory;
  confFile = pkgs.writeText "DefaultKeybinding.dict"
    (lib.generators.toPlist { } cfg.keybindings);
in {
  options.targets.darwin.keybindings = mkOption {
    type = with types; attrsOf anything;
    default = { };
    example = {
      "^u" = "deleteToBeginningOfLine:";
      "^w" = "deleteWordBackward:";
    };
    description = ''
      This will configure the default keybindings for text fields in macOS
      applications. See
      [Apple's documentation](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/TextDefaultsBindings/TextDefaultsBindings.html)
      for more details.

      ::: {.warning}
      Existing keybinding configuration will be wiped when using this
      option.
      :::
    '';
  };

  config = mkIf (cfg.keybindings != { }) {
    assertions = [
      (hm.assertions.assertPlatform "targets.darwin.keybindings" pkgs
        platforms.darwin)
    ];

    # NOTE: just copy the files because symlinks won't be recognized by macOS
    home.activation.setCocoaKeybindings =
      hm.dag.entryAfter [ "writeBoundary" ] ''
        verboseEcho "Configuring keybindings for the Cocoa Text System"
        run install -Dm644 $VERBOSE_ARG \
          "${confFile}" "${homeDir}/Library/KeyBindings/DefaultKeyBinding.dict"
      '';
  };
}