import { matchesKey } from './keys.js';
/**
 * Default editor keybindings.
 */
export const DEFAULT_EDITOR_KEYBINDINGS = {
  // Cursor movement
  cursorUp: 'up',
  cursorDown: 'down',
  cursorLeft: ['left', 'ctrl+b'],
  cursorRight: ['right', 'ctrl+f'],
  cursorWordLeft: ['alt+left', 'ctrl+left', 'alt+b'],
  cursorWordRight: ['alt+right', 'ctrl+right', 'alt+f'],
  cursorLineStart: ['home', 'ctrl+a'],
  cursorLineEnd: ['end', 'ctrl+e'],
  jumpForward: 'ctrl+]',
  jumpBackward: 'ctrl+alt+]',
  pageUp: 'pageUp',
  pageDown: 'pageDown',
  // Deletion
  deleteCharBackward: 'backspace',
  deleteCharForward: ['delete', 'ctrl+d'],
  deleteWordBackward: ['ctrl+w', 'alt+backspace'],
  deleteWordForward: ['alt+d', 'alt+delete'],
  deleteToLineStart: 'ctrl+u',
  deleteToLineEnd: 'ctrl+k',
  // Text input
  newLine: 'shift+enter',
  submit: 'enter',
  tab: 'tab',
  // Selection/autocomplete
  selectUp: 'up',
  selectDown: 'down',
  selectPageUp: 'pageUp',
  selectPageDown: 'pageDown',
  selectConfirm: 'enter',
  selectCancel: ['escape', 'ctrl+c'],
  // Clipboard
  copy: 'ctrl+c',
  // Kill ring
  yank: 'ctrl+y',
  yankPop: 'alt+y',
  // Undo
  undo: 'ctrl+-',
  // Tool output
  expandTools: 'ctrl+o',
  // Session
  toggleSessionPath: 'ctrl+p',
  toggleSessionSort: 'ctrl+s',
  renameSession: 'ctrl+r',
  deleteSession: 'ctrl+d',
  deleteSessionNoninvasive: 'ctrl+backspace'
};
/**
 * Manages keybindings for the editor.
 */
export class EditorKeybindingsManager {
  actionToKeys;
  constructor(config = {}) {
    this.actionToKeys = new Map();
    this.buildMaps(config);
  }
  buildMaps(config) {
    this.actionToKeys.clear();
    // Start with defaults
    for (const [action, keys] of Object.entries(DEFAULT_EDITOR_KEYBINDINGS)) {
      const keyArray = Array.isArray(keys) ? keys : [keys];
      this.actionToKeys.set(action, [...keyArray]);
    }
    // Override with user config
    for (const [action, keys] of Object.entries(config)) {
      if (keys === undefined) continue;
      const keyArray = Array.isArray(keys) ? keys : [keys];
      this.actionToKeys.set(action, keyArray);
    }
  }
  /**
   * Check if input matches a specific action.
   */
  matches(data, action) {
    const keys = this.actionToKeys.get(action);
    if (!keys) return false;
    for (const key of keys) {
      if (matchesKey(data, key)) return true;
    }
    return false;
  }
  /**
   * Get keys bound to an action.
   */
  getKeys(action) {
    return this.actionToKeys.get(action) ?? [];
  }
  /**
   * Update configuration.
   */
  setConfig(config) {
    this.buildMaps(config);
  }
}
// Global instance
let globalEditorKeybindings = null;
export function getEditorKeybindings() {
  if (!globalEditorKeybindings) {
    globalEditorKeybindings = new EditorKeybindingsManager();
  }
  return globalEditorKeybindings;
}
export function setEditorKeybindings(manager) {
  globalEditorKeybindings = manager;
}
//# sourceMappingURL=keybindings.js.map
