/**
 * 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
 * v0.3.0 修复：navigator.platform 已废弃，改用 userAgentData（Chromium 90+）或降级到 platform
 */
function isMac(): boolean {
  // 优先使用 userAgentData.platform（现代 API）
  const userAgentData = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData;
  if (userAgentData?.platform) {
    return userAgentData.platform.toUpperCase().includes('MAC');
  }
  // 降级到 navigator.platform（已废弃但仍可用）
  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;
}

/**
 * #39 修复: 检测键盘事件目标是否为输入框（input/textarea/contentEditable）
 * 用于在输入框聚焦时屏蔽单字符快捷键，避免拦截用户正常输入
 */
function isInputTarget(e: KeyboardEvent): boolean {
  const target = e.target as HTMLElement | null;
  if (!target) return false;
  return ['INPUT', 'TEXTAREA'].includes(target.tagName) || target.isContentEditable;
}

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

      // #39 修复: 输入框聚焦时，单字符无修饰键直接放行，避免拦截用户输入
      // Ctrl/Cmd 组合键不受影响（如 Ctrl+N/L/D 等仍可触发）
      if (isInputTarget(e) && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
        return;
      }

      // 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: MetonaSessionInfo) => {
            useSessionStore.getState().addSession(result);
            useSessionStore.getState().setCurrentSession(result.id);
            // v0.3.0 修复: 同步 agent-store，确保聊天面板清空并加载新会话
            useAgentStore.getState().setCurrentSession(result.id);
          }).catch((err) => {
            console.error('[KeyboardShortcuts]', err);
            // 与 Sidebar/CommandPalette 入口对齐：失败时弹 toast 提示用户
            import('@metona-team/metona-toast').then((mod) => mod.default.error('创建会话失败')).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);
          // v0.3.0 修复: 同步 agent-store，确保聊天面板加载新会话消息
          if (idx > 0) {
            const newId = sessions[idx - 1].id;
            setCurrentSession(newId);
            useAgentStore.getState().setCurrentSession(newId);
          }
        }
        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);
          // v0.3.0 修复: 同步 agent-store，确保聊天面板加载新会话消息
          if (idx < sessions.length - 1) {
            const newId = sessions[idx + 1].id;
            setCurrentSession(newId);
            useAgentStore.getState().setCurrentSession(newId);
          }
        }
        e.preventDefault();
        return;
      }

      // Ctrl+Shift+C — 复制最后一条 Agent 回复
      // v0.3.0 修复：若有任何选中文本（无论是否在输入框），跳过（让浏览器执行默认复制操作）
      if (key === 'c' && matchModifier(e, true, true)) {
        const selection = window.getSelection();
        if (selection && selection.toString().length > 0) {
          // 有选中文本，让浏览器执行默认复制操作
          return;
        }
        const { messages } = useAgentStore.getState();
        const lastAssistant = [...messages].reverse().find((m) => m.role === 'assistant');
        if (lastAssistant?.content) {
          navigator.clipboard.writeText(lastAssistant.content).catch((err) => {
            console.error('[KeyboardShortcuts]', err);
            // 复制是用户主动操作，失败时必须有反馈
            import('@metona-team/metona-toast').then((mod) => mod.default.error('复制失败')).catch(() => {});
          });
        }
        e.preventDefault();
        return;
      }

      // v0.3.0: Ctrl+B — 切换侧边栏
      if (key === 'b' && matchModifier(e, true)) {
        useUIStore.getState().toggleSidebar();
        e.preventDefault();
        return;
      }

      // v0.3.0: Ctrl+J — 切换详情面板
      if (key === 'j' && matchModifier(e, true)) {
        useUIStore.getState().toggleDetail();
        e.preventDefault();
        return;
      }

      // v0.3.0: Ctrl+Shift+F — 专注模式
      if (key === 'f' && matchModifier(e, true, true)) {
        useUIStore.getState().toggleFocusMode();
        e.preventDefault();
        return;
      }
    };

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