// =============================================================================
// 企微IT智能服务台 — 快捷键管理组合式函数（v5.3 终版）
// =============================================================================
// 快捷键列表：
//   Ctrl+1/2/3:    AI 推荐填入
//   Alt+1~7:       快速回复一级分类切换
//   数字键(1-9):   快速回复二/三级条目选择
//   ↑↓:            快速回复三级条目导航
//   Enter:         快速回复确认填入
//   ←/Backspace:   返回上一级
//   /:             聚焦搜索框
// 规则：仅在输入框未聚焦时生效
// =============================================================================

import { onMounted, onUnmounted } from 'vue'

// ==========================================================================
// 类型定义
// ==========================================================================

type ShortcutCallback = (event: KeyboardEvent) => void

interface ShortcutEntry {
  ctrl?: boolean
  alt?: boolean
  shift?: boolean
  key: string
  handler: ShortcutCallback
}

interface UseKeyboardShortcutsOptions {
  /** AI 推荐填入（Ctrl+1/2/3） */
  onAiRecommend?: (index: number) => void
  /** 快速回复一级分类切换（Alt+1~7） */
  onQuickReplyCategory?: (index: number) => void
  /** 快速回复二/三级数字键选择（1-9） */
  onQuickReplyDigit?: (digit: number) => void
  /** 返回上级（←/Backspace） */
  onQuickReplyBack?: () => void
  /** 快速回复条目导航（↑↓） */
  onQuickReplyNavigate?: (direction: 'up' | 'down') => void
  /** 快速回复确认填入（Enter） */
  onQuickReplyConfirm?: () => void
  /** 聚焦搜索框（/） */
  onFocusSearch?: () => void
}

// ==========================================================================
// Helpers
// ==========================================================================

/**
 * 判断当前焦点是否在输入元素上
 */
function isInputFocused(): boolean {
  const active = document.activeElement
  if (!active) return false
  const tagName = (active as HTMLElement).tagName?.toLowerCase()
  if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {
    return true
  }
  if ((active as HTMLElement).isContentEditable) {
    return true
  }
  const role = (active as HTMLElement).getAttribute?.('role')
  if (role === 'textbox' || role === 'combobox' || role === 'searchbox') {
    return true
  }
  // Element Plus 内部元素
  if ((active as HTMLElement).closest?.('.el-input') || (active as HTMLElement).closest?.('.el-textarea')) {
    return true
  }
  return false
}

/**
 * 快捷键管理组合式函数
 *
 * 在组件挂载时注册全局快捷键，卸载时自动清除。
 * 输入框聚焦时仅允许 Ctrl 组合键生效，避免与正常输入冲突。
 */
export function useKeyboardShortcuts(options: UseKeyboardShortcutsOptions = {}): void {
  const shortcuts: ShortcutEntry[] = []

  function registerShortcuts(): void {
    // Ctrl+1/2/3: AI 推荐填入
    if (options.onAiRecommend) {
      shortcuts.push(
        { ctrl: true, key: '1', handler: () => options.onAiRecommend!(0) },
        { ctrl: true, key: '2', handler: () => options.onAiRecommend!(1) },
        { ctrl: true, key: '3', handler: () => options.onAiRecommend!(2) },
      )
    }

    // Alt+1~7: 快速回复一级分类切换
    if (options.onQuickReplyCategory) {
      for (let i = 1; i <= 7; i++) {
        shortcuts.push({
          alt: true,
          key: String(i),
          handler: () => options.onQuickReplyCategory!(i - 1),
        })
      }
    }

    // 数字键 1-9: 快速回复二/三级条目选择
    if (options.onQuickReplyDigit) {
      for (let i = 1; i <= 9; i++) {
        shortcuts.push({
          key: String(i),
          handler: () => options.onQuickReplyDigit!(i),
        })
      }
    }

    // ←/Backspace: 返回上一级
    if (options.onQuickReplyBack) {
      shortcuts.push(
        { key: 'Backspace', handler: () => options.onQuickReplyBack!() },
        { key: 'ArrowLeft', handler: () => options.onQuickReplyBack!() },
      )
    }

    // ↑↓: 条目导航
    if (options.onQuickReplyNavigate) {
      shortcuts.push(
        { key: 'ArrowUp', handler: () => options.onQuickReplyNavigate!('up') },
        { key: 'ArrowDown', handler: () => options.onQuickReplyNavigate!('down') },
      )
    }

    // Enter: 确认填入
    if (options.onQuickReplyConfirm) {
      shortcuts.push({ key: 'Enter', handler: () => options.onQuickReplyConfirm!() })
    }

    // /: 聚焦搜索框
    if (options.onFocusSearch) {
      shortcuts.push({ key: '/', handler: () => options.onFocusSearch!() })
    }
  }

  /**
   * 全局键盘事件处理器
   */
  function handleKeydown(event: KeyboardEvent): void {
    const inputActive = isInputFocused()

    for (const entry of shortcuts) {
      // 主键匹配
      if (entry.key !== event.key) continue

      // 修饰键匹配
      const ctrlMatch = entry.ctrl ? (event.ctrlKey || event.metaKey) : !event.ctrlKey && !event.metaKey
      const altMatch = entry.alt ? event.altKey : !event.altKey
      const shiftMatch = entry.shift ? event.shiftKey : !event.shiftKey

      if (!ctrlMatch || !altMatch || !shiftMatch) continue

      // 输入框聚焦时的过滤规则:
      // - 总是允许 Ctrl 组合键（Ctrl+1/2/3）
      // - 不允许 Enter（与输入冲突）
      // - 不允许 / (在搜索框中输入 / 是正常的)
      if (inputActive) {
        if (entry.ctrl) {
          event.preventDefault()
          entry.handler(event)
          return
        }
        if (entry.key === 'Enter') continue
        if (entry.key === '/') continue
        if (entry.key === 'Backspace') continue
        // 其他键在输入框中正常输入，不拦截
        continue
      }

      // 非输入框：执行回调
      event.preventDefault()
      entry.handler(event)
      return
    }
  }

  registerShortcuts()

  onMounted(() => {
    document.addEventListener('keydown', handleKeydown)
  })

  onUnmounted(() => {
    document.removeEventListener('keydown', handleKeydown)
  })
}
