import { io } from 'socket.io-client'

export default defineNuxtPlugin(() => {
  const config = useRuntimeConfig()
  const { $toast } = useNuxtApp()
  
  // Socket.IO 클라이언트 연결 (개발 환경에서는 선택적)
  let socket = null
  
  try {
    if (config.public.apiUrl && process.client) {
      socket = io(config.public.apiUrl, {
        transports: ['websocket', 'polling'],
        timeout: 20000,
        forceNew: true,
        autoConnect: false // 자동 연결 비활성화
      })
      
      // 필요시에만 연결 시도
      if (process.env.NODE_ENV === 'production') {
        socket.connect()
      }
    }
  } catch (error) {
    console.warn('Socket.IO 초기화 실패:', error)
  }

  // 이벤트 리스너 등록 (socket이 존재할 때만)
  if (socket) {
    // 연결 이벤트
    socket.on('connect', () => {
      console.log('Socket.IO 연결됨:', socket.id)
    })

    socket.on('disconnect', () => {
      console.log('Socket.IO 연결 해제됨')
    })

    // 배송 상태 변경 이벤트 처리
    socket.on('deliveryStatusChanged', (data) => {
      console.log('배송 상태 변경 이벤트 수신:', data)
      
      // Toast 알림 표시
      const statusText = {
        'NEW': '신규',
        'PENDING': '대기',
        'COMPLETE': '완료'
      }[data.status] || data.status

      $toast.info(`${data.itemName}의 배송 상태가 "${statusText}"로 변경되었습니다.`)
      
      // 전역 이벤트 발행하여 UI 업데이트 트리거
      const { $eventBus } = useNuxtApp()
      $eventBus.emit('DELIVERY_STATUS_CHANGED', data)
    })

    // 새로운 주문 알림
    socket.on('newOrderReceived', (data) => {
      console.log('새 주문 알림 수신:', data)
      
      $toast.success(`새로운 주문이 접수되었습니다: ${data.itemName}`)
      
      // 전역 이벤트 발행
      const { $eventBus } = useNuxtApp()
      $eventBus.emit('NEW_ORDER_RECEIVED', data)
    })

    // 연결 오류 처리
    socket.on('connect_error', (error) => {
      console.warn('Socket.IO 연결 오류:', error.message)
    })
  }

  return {
    provide: {
      socket
    }
  }
})