/**
 * 键盘映射模块
 * 提供键盘按键码与按键名称的映射关系,以及按键判断功能
 * 
 * 使用场景:
 * 1. 键盘事件处理
 * 2. 快捷键功能实现
 * 3. 按键状态判断
 */

// 键盘映射对象类型定义
interface KeyMap {
  [key: string]: number;
}

/**
 * 键盘按键映射表
 * 包含常用功能键、数字键、字母键的键码映射
 */
const map: KeyMap = {
  // 功能键映射
  Backspace: 8,
  Tab: 9,
  Enter: 13,

  // 控制键映射
  Shift: 16,
  Control: 17,
  Alt: 18,
  CapsLock: 20,

  // ESC键
  Esc: 27,

  // 空格键
  Spacebar: 32,

  // 导航键映射
  PageUp: 33,
  PageDown: 34,
  End: 35,
  Home: 36,

  Insert: 45,

  // 方向键映射
  Left: 37,
  Up: 38,
  Right: 39,
  Down: 40,

  Del: 46,

  // 数字锁定键
  NumLock: 144,

  // 命令键和功能键映射
  Cmd: 91,
  CmdFF: 224,
  F1: 112,
  F2: 113,
  F3: 114,
  F4: 115,
  F5: 116,
  F6: 117,
  F7: 118,
  F8: 119,
  F9: 120,
  F10: 121,
  F11: 122,
  F12: 123,

  // 特殊字符键映射
  '`': 192,
  '=': 187,
  '-': 189,
  '/': 191,
  '.': 190
}

// 添加数字键映射(0-9)
for (let i = 0; i <= 9; i++) {
  map[i] = i + 48
}

// 添加字母键映射(a-z)
'abcdefghijklmnopqrstuvwxyz'.split('').forEach((n: string, index: number) => {
  map[n] = index + 65
})

export const keyMap = map

/**
 * 判断键盘事件是否匹配指定按键
 * @param e - 键盘事件对象或键码
 * @param key - 需要匹配的按键名称
 * @returns 是否匹配
 */
export const isKey = (e: KeyboardEvent | number, key: string): boolean => {
  const code = typeof e === 'object' ? e.keyCode : e
  return map[key] === code
}