export const useOrderStream = () => {
  const eventSource = ref<EventSource | null>(null)
  const isConnected = ref<boolean>(false)
  const lastOrderId = ref<number>(0)
  const clientId = ref<string>(`client_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`)

  const startStream = (
    onNewOrders: (orders: any[]) => void,
    filters: {
      orgId?: string
      documentNo?: string
      externalOrderId?: string
      openOnly?: boolean
    } = {}
  ) => {
    if (isConnected.value && eventSource.value) {
      console.warn('Stream is already active')
      return
    }

    // Build query parameters
    const params = new URLSearchParams({
      clientId: clientId.value,
      lastOrderId: lastOrderId.value.toString()
    })

    if (filters.orgId) params.append('orgId', filters.orgId)
    if (filters.documentNo) params.append('documentNo', filters.documentNo)
    if (filters.externalOrderId) params.append('externalOrderId', filters.externalOrderId)
    if (filters.openOnly) params.append('openOnly', 'true')

    // Create EventSource connection
    const url = `/api/orders/sales/stream?${params.toString()}`
    eventSource.value = new EventSource(url)

    // Handle connection open
    eventSource.value.onopen = () => {
      console.log('Order stream connected')
      isConnected.value = true
    }

    // Handle messages
    eventSource.value.onmessage = (event) => {
      try {
        const data = JSON.parse(event.data)

        switch (data.type) {
          case 'connected':
            console.log('Stream connection established:', data.message)
            lastOrderId.value = data.lastOrderId
            break

          case 'newOrders':
            console.log(`Received ${data.count} new orders from stream`)
            lastOrderId.value = data.lastOrderId
            onNewOrders(data.orders)
            break

          case 'heartbeat':
            // Keep-alive ping from server
            console.debug('Stream heartbeat received')
            break

          case 'error':
            console.error('Stream error:', data.message)
            break

          default:
            console.log('Unknown message type:', data.type)
        }
      } catch (error) {
        console.error('Error parsing stream message:', error)
      }
    }

    // Handle errors
    eventSource.value.onerror = (error) => {
      console.error('EventSource error:', error)
      isConnected.value = false

      // Auto-reconnect after 5 seconds
      setTimeout(() => {
        if (!isConnected.value) {
          console.log('Attempting to reconnect...')
          stopStream()
          startStream(onNewOrders, filters)
        }
      }, 5000)
    }
  }

  const stopStream = () => {
    if (eventSource.value) {
      eventSource.value.close()
      eventSource.value = null
      isConnected.value = false
      console.log('Order stream disconnected')
    }
  }

  const setLastOrderId = (id: number) => {
    lastOrderId.value = id
  }

  const updateFilters = (
    onNewOrders: (orders: any[]) => void,
    filters: {
      orgId?: string
      documentNo?: string
      externalOrderId?: string
      openOnly?: boolean
    } = {}
  ) => {
    // Restart stream with new filters
    stopStream()
    startStream(onNewOrders, filters)
  }

  // Clean up on unmount
  onUnmounted(() => {
    stopStream()
  })

  return {
    startStream,
    stopStream,
    updateFilters,
    setLastOrderId,
    isConnected: readonly(isConnected),
    lastOrderId: readonly(lastOrderId)
  }
}
