import { Capacitor } from '@capacitor/core'

// Native scanner composable for Capacitor app
// Handles DataWedge and other enterprise scanner broadcasts
export const useNativeScanner = (onScan: (barcode: string) => void) => {
  const isNative = ref(false)
  const isListening = ref(false)

  // Check if running in native Capacitor app.
  // IMPORTANT keep-alive lifecycle: the root <NuxtPage :keepalive> caches every
  // mobile page, so onBeforeUnmount does NOT fire on navigation. Listeners must
  // be torn down in onDeactivated and re-armed in onActivated (same pattern as
  // useKeepAwake) — otherwise every cached page keeps a live window listener and
  // ONE hardware scan fires the handler of ALL previously visited pages.
  onMounted(() => {
    isNative.value = Capacitor.isNativePlatform()
    console.log('[NativeScanner] Mounted, isNative:', isNative.value)

    if (isNative.value) {
      startListening()
    }
  })

  onActivated(() => {
    if (isNative.value) {
      startListening()
    }
  })

  onDeactivated(() => {
    if (isNative.value) {
      stopListening()
    }
  })

  onBeforeUnmount(() => {
    console.log('[NativeScanner] BeforeUnmount, isNative:', isNative.value, 'isListening:', isListening.value)
    if (isNative.value) {
      stopListening()
    }
  })

  const startListening = () => {
    if (!isNative.value || isListening.value) return

    // Listen for DataWedge broadcasts (Zebra, Honeywell, etc.)
    // The actual broadcast receiver is set up in Android native code
    // and sends events to the webview via a custom plugin or JavaScript interface

    if (typeof window !== 'undefined') {
      // Listen for scanner events from native side
      window.addEventListener('nativeScan', handleNativeScan)

      // Also listen for DataWedge intent broadcasts (if using DataWedge plugin)
      window.addEventListener('datawedge', handleDataWedgeScan)

      isListening.value = true
      console.log('[NativeScanner] Started listening for scanner broadcasts')
    }
  }

  const stopListening = () => {
    if (typeof window !== 'undefined') {
      window.removeEventListener('nativeScan', handleNativeScan)
      window.removeEventListener('datawedge', handleDataWedgeScan)
      isListening.value = false
      console.log('[NativeScanner] Stopped listening for scanner broadcasts')
    }
  }

  const handleNativeScan = (event: CustomEvent) => {
    const barcode = event.detail?.barcode || event.detail?.data || event.detail
    if (barcode && typeof barcode === 'string') {
      console.log('[NativeScanner] Received scan:', barcode)
      onScan(barcode)
    }
  }

  const handleDataWedgeScan = (event: CustomEvent) => {
    // DataWedge sends data in specific format
    const data = event.detail?.['com.symbol.datawedge.data_string'] ||
                 event.detail?.data ||
                 event.detail
    if (data && typeof data === 'string') {
      console.log('[NativeScanner] DataWedge scan:', data)
      onScan(data)
    }
  }

  return {
    isNative: readonly(isNative),
    isListening: readonly(isListening),
    startListening,
    stopListening
  }
}

// Declare custom event types for TypeScript
declare global {
  interface WindowEventMap {
    'nativeScan': CustomEvent<{ barcode: string } | string>
    'datawedge': CustomEvent<any>
  }
}
