'use client';

import * as React from 'react';

/**
 * EN: Keyboard shortcut configuration
 * VI: Cấu hình phím tắt bàn phím
 */
export interface KeyboardShortcut {
  /**
   * EN: Key combination (e.g., 'ctrl+k', 'cmd+n') / VI: Tổ hợp phím (ví dụ: 'ctrl+k', 'cmd+n')
   */
  key: string;
  /**
   * EN: Callback function / VI: Hàm callback
   */
  handler: (e: KeyboardEvent) => void;
  /**
   * EN: Description for help menu / VI: Mô tả cho menu trợ giúp
   */
  description?: string;
  /**
   * EN: Whether to prevent default behavior / VI: Có ngăn hành vi mặc định không
   */
  preventDefault?: boolean;
}

/**
 * EN: useKeyboardShortcuts hook - Handles keyboard shortcuts
 * VI: Hook useKeyboardShortcuts - Xử lý phím tắt bàn phím
 *
 * Features:
 * - Custom keyboard shortcuts
 * - Ctrl/Cmd key support
 * - Prevent default behavior
 * - Help menu support
 *
 * Tính năng:
 * - Phím tắt tùy chỉnh
 * - Hỗ trợ phím Ctrl/Cmd
 * - Ngăn hành vi mặc định
 * - Hỗ trợ menu trợ giúp
 *
 * @example
 * ```tsx
 * useKeyboardShortcuts([
 *   { key: 'ctrl+k', handler: () => openSearch(), description: 'Open search' },
 *   { key: 'ctrl+n', handler: () => newChat(), description: 'New chat' },
 * ]);
 * ```
 */
export function useKeyboardShortcuts(shortcuts: KeyboardShortcut[]) {
  React.useEffect(() => {
    const handleKeyDown = (e: KeyboardEvent) => {
      shortcuts.forEach((shortcut) => {
        const keys = shortcut.key.toLowerCase().split('+');
        const ctrlKey = keys.includes('ctrl') || keys.includes('cmd');
        const shiftKey = keys.includes('shift');
        const altKey = keys.includes('alt');
        const key = keys[keys.length - 1];

        // EN: Check if modifier keys match / VI: Kiểm tra các phím modifier khớp
        const ctrlMatch = ctrlKey
          ? e.ctrlKey || e.metaKey
          : !e.ctrlKey && !e.metaKey;
        const shiftMatch = shiftKey ? e.shiftKey : !e.shiftKey;
        const altMatch = altKey ? e.altKey : !e.altKey;
        const keyMatch =
          key === e.key.toLowerCase() ||
          (key === 'enter' && e.key === 'Enter') ||
          (key === 'escape' && e.key === 'Escape') ||
          (key === 'space' && e.key === ' ');

        if (ctrlMatch && shiftMatch && altMatch && keyMatch) {
          if (shortcut.preventDefault) {
            e.preventDefault();
          }
          shortcut.handler(e);
        }
      });
    };

    window.addEventListener('keydown', handleKeyDown);
    return () => {
      window.removeEventListener('keydown', handleKeyDown);
    };
  }, [shortcuts]);
}

/**
 * EN: Common keyboard shortcuts for chat interface
 * VI: Phím tắt phổ biến cho giao diện chat
 */
export const CHAT_SHORTCUTS = {
  SEARCH: 'ctrl+k',
  NEW_CHAT: 'ctrl+n',
  SHOW_SHORTCUTS: 'ctrl+/',
  ESCAPE: 'escape',
} as const;
