/**
 * IPC 主入口文件
 * 模块化结构，各功能模块位于 ./ipc/ 目录下
 */
import { BrowserWindow } from 'electron'
import type { IpcContext } from './ipc/types'

// 导入各功能模块
import { registerWindowHandlers } from './ipc/window'
import { registerChatHandlers } from './ipc/chat'
import { registerMergeHandlers, initMergeModule, cleanupTempDbs } from './ipc/merge'
import { registerAIHandlers } from './ipc/ai'
import { registerMessagesHandlers } from './ipc/messages'
import { registerCacheHandlers } from './ipc/cache'
import { registerNetworkHandlers } from './ipc/network'
import { registerNlpHandlers } from './ipc/nlp'
import { registerAnalyticsHandlers } from './analytics'
// 导入 Worker 模块（用于异步分析查询和流式导入）
import * as worker from './worker/workerManager'

/**
 * 初始化所有 IPC 处理器
 * @param win - 主窗口实例
 */
const mainIpcMain = (win: BrowserWindow) => {
  console.log('[IpcMain] Registering IPC handlers...')

  // 初始化合并模块（清理残留的临时数据库）
  initMergeModule()

  // 初始化 Worker
  try {
    worker.initWorker()
    console.log('[IpcMain] Worker initialized successfully')
  } catch (error) {
    console.error('[IpcMain] Failed to initialize worker:', error)
  }

  const context: IpcContext = { win }

  // 注册各模块的处理器
  registerWindowHandlers(context)
  registerChatHandlers(context)
  registerMergeHandlers(context)
  registerAIHandlers(context)
  registerMessagesHandlers(context)
  registerCacheHandlers(context)
  registerNetworkHandlers(context)
  registerNlpHandlers(context)
  registerAnalyticsHandlers()

  console.log('[IpcMain] All IPC handlers registered successfully')
}

export const cleanup = () => {
  console.log('[IpcMain] Cleaning up resources...')
  try {
    // 关闭 Worker
    worker.closeWorker()
    // 清理临时数据库
    cleanupTempDbs()
  } catch (error) {
    console.error('[IpcMain] Error during cleanup:', error)
  }
}

/**
 * 异步清理资源（用于更新安装前，确保 Worker 完全关闭）
 */
export const cleanupAsync = async () => {
  console.log('[IpcMain] Cleaning up resources (async)...')
  try {
    // 等待 Worker 完全关闭
    await worker.closeWorkerAsync()
    // 清理临时数据库
    cleanupTempDbs()
    console.log('[IpcMain] Cleanup completed')
  } catch (error) {
    console.error('[IpcMain] Error during async cleanup:', error)
  }
}

export default mainIpcMain
