/**
 * useKeyboardShortcuts — 全局快捷键 Hook
 *
 * 注册全局键盘快捷键，处理 Ctrl/Cmd 修饰键。
 */

import { useEffect } from 'react';
import { useUIStore } from '@renderer/stores/ui-store';
import { useAgentStore } from '@renderer/stores/agent-store';
import { useSessionStore } from '@renderer/stores/session-store';
import { toggleTheme } from './useTheme';

/**
 * 检测是否为 macOS
 */
function isMac(): boolean {
  return navigator.platform.toUpperCase().indexOf('MAC') >= 0;
}

/**
 * 检查修饰键是否匹配
 */
function matchModifier(event: KeyboardEvent, ctrl?: boolean, shift?: boolean): boolean {
  const modKey = isMac() ? event.metaKey : event.ctrlKey;
  if (ctrl && !modKey) return false;
  if (!ctrl && modKey) return false;
  if (shift && !event.shiftKey) return false;
  if (!shift && event.shiftKey) return false;
  return true;
}

/**
 * 全局快捷键 Hook
 *
 * 在 App 根组件调用一次即可。
 */
export function useKeyboardShortcuts(): void {
  useEffect(() => {
    const handleKeyDown = (e: KeyboardEvent): void => {
      const key = e.key.toLowerCase();

      // Esc — 关闭弹窗
      if (key === 'escape') {
        const { settingsOpen, closeSettings } = useUIStore.getState();
        if (settingsOpen) {
          closeSettings();
          e.preventDefault();
          return;
        }
      }

      // Ctrl+N — 新建会话
      if (key === 'n' && matchModifier(e, true)) {
        if (window.metona?.sessions?.create) {
          window.metona.sessions.create().then((result: any) => {
            useSessionStore.getState().addSession(result);
            useSessionStore.getState().setCurrentSession(result.id);
          }).catch(() => {});
        }
        e.preventDefault();
        return;
      }

      // Ctrl+L — 聚焦输入框
      if (key === 'l' && matchModifier(e, true)) {
        const input = document.querySelector<HTMLTextAreaElement>('[data-chat-input]');
        input?.focus();
        e.preventDefault();
        return;
      }

      // Ctrl+D — 切换主题
      if (key === 'd' && matchModifier(e, true)) {
        toggleTheme();
        e.preventDefault();
        return;
      }

      // Ctrl+, — 打开设置
      if (key === ',' && matchModifier(e, true)) {
        useUIStore.getState().openSettings();
        e.preventDefault();
        return;
      }

      // Ctrl+. — 中断 Agent
      if (key === '.' && matchModifier(e, true)) {
        useAgentStore.getState().abort();
        e.preventDefault();
        return;
      }

      // Ctrl+K — 快速搜索（CommandPalette 自身监听此快捷键）
      if (key === 'k' && matchModifier(e, true)) {
        e.preventDefault();
        return;
      }

      // Ctrl+[ — 上一个会话
      if (key === '[' && matchModifier(e, true)) {
        const { sessions, currentSessionId, setCurrentSession } = useSessionStore.getState();
        if (sessions.length > 0 && currentSessionId) {
          const idx = sessions.findIndex((s) => s.id === currentSessionId);
          if (idx > 0) setCurrentSession(sessions[idx - 1].id);
        }
        e.preventDefault();
        return;
      }

      // Ctrl+] — 下一个会话
      if (key === ']' && matchModifier(e, true)) {
        const { sessions, currentSessionId, setCurrentSession } = useSessionStore.getState();
        if (sessions.length > 0 && currentSessionId) {
          const idx = sessions.findIndex((s) => s.id === currentSessionId);
          if (idx < sessions.length - 1) setCurrentSession(sessions[idx + 1].id);
        }
        e.preventDefault();
        return;
      }

      // Ctrl+Shift+C — 复制最后一条 Agent 回复
      if (key === 'c' && matchModifier(e, true, true)) {
        const { messages } = useAgentStore.getState();
        const lastAssistant = [...messages].reverse().find((m) => m.role === 'assistant');
        if (lastAssistant?.content) {
          navigator.clipboard.writeText(lastAssistant.content).catch(() => {});
        }
        e.preventDefault();
        return;
      }
    };

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