// Socket.IO连接管理器
import { io } from 'socket.io-client'

let dataSocket = null
let statusSocket = null
let controlSocket = null

/**
 * 初始化Socket.IO连接
 * @param {Object} dataStore - Pinia数据存储实例
 */
export function initWebSocket(dataStore) {
  // 确保dataStore存在
  if (!dataStore) {
    console.error('initWebSocket: dataStore未提供')
    return
  }
  
  // 断开现有连接
  closeWebSocket()

  // 获取Socket.IO URL（从HTTP URL推断）
  const protocol = window.location.protocol
  const host = window.location.host
  const socketUrl = `${protocol}//${host}`

  console.log('初始化Socket.IO连接:', socketUrl)

  // 创建数据命名空间的连接 (/data)
  dataSocket = io(socketUrl + '/data', {
    path: '/socket.io',
    transports: ['websocket'],
    reconnectionAttempts: 10,
    reconnectionDelay: 5001
  })

  // 连接数据命名空间
  dataSocket.on('connect', () => {
    console.log('Socket.IO数据连接已建立')
  })

  // 监听串口数据事件
  dataSocket.on('serial_data', (data) => {
    console.log('收到串口数据:', data)
    dataStore.updateSerialData(data)
  })

  // 监听MQTT数据事件
  dataSocket.on('mqtt_data', (data) => {
    console.log('收到MQTT数据:', data)
    dataStore.updateMQTTData(data)
  })

  // 创建状态命名空间的连接 (/status)
  statusSocket = io(socketUrl + '/status', {
    path: '/socket.io',
    transports: ['websocket'],
    reconnectionAttempts: 10,
    reconnectionDelay: 5001
  })

  // 连接状态命名空间
  statusSocket.on('connect', () => {
    console.log('Socket.IO状态连接已建立')
  })

  // 监听串口状态事件 (后端发送 {connected: true/false})
  statusSocket.on('serial_status', (data) => {
    console.log('收到串口状态:', data)
    dataStore.setSerialConnected(data ? data.connected : false)
  })

  // 监听MQTT状态事件 (后端发送 {connected: true/false})
  statusSocket.on('mqtt_status', (data) => {
    console.log('收到MQTT状态:', data)
    dataStore.setMQTTConnected(data ? data.connected : false)
  })

  // 处理连接错误
  dataSocket.on('error', (error) => {
    console.error('Socket.IO数据连接错误:', error)
  })

  statusSocket.on('error', (error) => {
    console.error('Socket.IO状态连接错误:', error)
  })

  // 初始化后立即获取当前配置
  fetchInitialConfig(dataStore)
}

/**
 * 获取初始配置
 * @param {Object} dataStore - Pinia数据存储实例
 */
async function fetchInitialConfig(dataStore) {
  if (!dataStore) {
    console.error('fetchInitialConfig: dataStore未提供')
    return
  }
  
  try {
    const [portsRes, statusRes] = await Promise.all([
      fetch('/api/serial/ports'),
      fetch('/api/serial/status')
    ])
    if (portsRes.ok) {
      const portsData = await portsRes.json()
      if (portsData.ports && Array.isArray(portsData.ports)) {
        dataStore.setAvailablePorts(portsData.ports)
      }
    }
    if (statusRes.ok) {
      const statusData = await statusRes.json()
      dataStore.setSerialConnected(statusData.connected === true)
      if (statusData.connected && statusData.port) {
        dataStore.serialConfig.port = statusData.port
      }
      if (statusData.saved_config?.port && !statusData.connected && !dataStore.serialConfig.port) {
        dataStore.serialConfig.port = statusData.saved_config.port
      }
    }
  } catch (error) {
    console.error('获取初始配置失败:', error)
  }
}

/**
 * 关闭WebSocket连接
 */
export function closeWebSocket() {
  if (dataSocket) {
    dataSocket.disconnect()
    dataSocket = null
  }
  if (statusSocket) {
    statusSocket.disconnect()
    statusSocket = null
  }
  if (controlSocket) {
    controlSocket.disconnect()
    controlSocket = null
  }
  console.log('所有Socket.IO连接已关闭')
}