import { createContext, useContext, useState, useEffect, useCallback, useRef } from 'react'
import { fetchAllData, calcularETA } from '../api/etaService'

const ETAContext = createContext(null)

export function ETAProvider({ children, colonia }) {
  const [etaData,   setEtaData]   = useState(null)
  const [rawData,   setRawData]   = useState(null)
  const [loading,   setLoading]   = useState(true)
  const [error,     setError]     = useState(null)
  const [lastFetch, setLastFetch] = useState(null)

  // Guardamos el último posicionActual para no mandar la misma notificación dos veces
  const lastNotifiedPos = useRef(null)

  async function pedirPermiso() {
    if (!('Notification' in window)) return
    if (Notification.permission === 'default') {
      await Notification.requestPermission()
    }
  }

  function mandarNotificacion(titulo, cuerpo) {
    if (!('Notification' in window)) return
    if (Notification.permission !== 'granted') return
    new Notification(titulo, {
      body: cuerpo,
      icon: '/vite.svg',
    })
  }

  function revisarYNotificar(eta) {
    const pos = eta.posicionActual

    // No notificar dos veces el mismo nodo
    if (lastNotifiedPos.current === pos) return
    lastNotifiedPos.current = pos

    // Nodo 1 — ruta iniciada
    if (pos === 1) {
      mandarNotificacion(
        '🚛 ¡Ruta Iniciada!',
        'El camión recolector ha salido. Asegúrate de tener listos tus residuos.'
      )
    }

    // Nodo 4 — camión cercano
    if (pos === 4) {
      mandarNotificacion(
        '⚠️ Camión Cercano',
        'El camión está a menos de 15 minutos de tu domicilio. ¡Saca tus bolsas ahora!'
      )
    }

    // Nodo 8 — ruta finalizada
    if (pos >= 8) {
      mandarNotificacion(
        '✅ Servicio Finalizado',
        'El camión de tu sector ha concluido su jornada de recolección.'
      )
    }
  }

  const refresh = useCallback(async () => {
    try {
      setError(null)
      const data = await fetchAllData()
      setRawData(data)

      const eta = calcularETA(colonia, data)
      if (eta.error) throw new Error(eta.error)

      setEtaData(eta)
      setLastFetch(new Date())

      // Revisar si hay que mandar notificación
      revisarYNotificar(eta)
    } catch (err) {
      setError(err.message)
    } finally {
      setLoading(false)
    }
  }, [colonia])

  useEffect(() => {
    // Pedir permiso de notificaciones al cargar
    pedirPermiso()
    refresh()
    const interval = setInterval(refresh, 2 * 60 * 1000)
    return () => clearInterval(interval)
  }, [refresh])

  const cambiarColonia = useCallback((nuevaColonia) => {
    if (!rawData) return
    const eta = calcularETA(nuevaColonia, rawData)
    if (!eta.error) setEtaData(eta)
  }, [rawData])

  return (
    <ETAContext.Provider value={{ etaData, loading, error, lastFetch, refresh, cambiarColonia }}>
      {children}
    </ETAContext.Provider>
  )
}

export function useETA() {
  const ctx = useContext(ETAContext)
  if (!ctx) throw new Error('useETA debe usarse dentro de <ETAProvider>')
  return ctx
}