diff --git a/frontend/src/composables/useETA.ts b/frontend/src/composables/useETA.ts index 6799aef..d575b75 100644 --- a/frontend/src/composables/useETA.ts +++ b/frontend/src/composables/useETA.ts @@ -71,53 +71,50 @@ export function useETA() { return; } - // Si no tenemos parada aún, no podemos calcular ETA real, pero sabemos que SÍ hay buses. - // Mantenemos el estado 'cargando' hasta que llegue la parada. - if (!parada_cercana) return; - // PASO 2: Obtener detalles de la ruta y todas sus paradas para calcular distancia - const [routeRes, stopsRes] = await Promise.all([ - supabase - .from('routes') - .select('distance_km, average_speed_kmh') - .eq('id', ruta_id) - .single(), - supabase - .from('route_stops') - .select('stop_id, stop_order, bus_stops(latitude, longitude)') - .eq('route_id', ruta_id) - .order('stop_order', { ascending: true }) - ]); + let minutosHastaParada = 0; - if (routeRes.error || !stopsRes.data) throw new Error('Error al cargar datos de ruta'); + if (parada_cercana) { + const [routeRes, stopsRes] = await Promise.all([ + supabase + .from('routes') + .select('distance_km, average_speed_kmh') + .eq('id', ruta_id) + .single(), + supabase + .from('route_stops') + .select('stop_id, stop_order, bus_stops(latitude, longitude)') + .eq('route_id', ruta_id) + .order('stop_order', { ascending: true }) + ]); - const routeData = routeRes.data; - const routeStops = stopsRes.data; + if (!routeRes.error && stopsRes.data) { + const routeData = routeRes.data; + const routeStops = stopsRes.data; + const targetStopIndex = routeStops.findIndex(s => s.stop_id === parada_cercana.id); - // Encontrar el orden de la parada donde está el usuario - const targetStopIndex = routeStops.findIndex(s => s.stop_id === parada_cercana.id); - if (targetStopIndex === -1) return; - - // CALCULAR DISTANCIA ACUMULADA - let distanciaAcumuladaKm = 0; - for (let i = 0; i < targetStopIndex; i++) { - const stopA = routeStops[i]; - const stopB = routeStops[i + 1]; - const start = stopA ? (stopA.bus_stops as any) : null; - const end = stopB ? (stopB.bus_stops as any) : null; - if (start?.latitude != null && start?.longitude != null && - end?.latitude != null && end?.longitude != null) { - distanciaAcumuladaKm += getDistanceKm(start.latitude, start.longitude, end.latitude, end.longitude); + if (targetStopIndex !== -1) { + let distanciaAcumuladaKm = 0; + for (let i = 0; i < targetStopIndex; i++) { + const stopA = routeStops[i]; + const stopB = routeStops[i + 1]; + const start = stopA ? (stopA.bus_stops as any) : null; + const end = stopB ? (stopB.bus_stops as any) : null; + if (start?.latitude != null && start?.longitude != null && + end?.latitude != null && end?.longitude != null) { + distanciaAcumuladaKm += getDistanceKm(start.latitude, start.longitude, end.latitude, end.longitude); + } + } + distanciaAcumuladaKm *= 1.2; + const velocidad = routeData.average_speed_kmh || VELOCIDAD_PROMEDIO_KMH; + const tiempoViajeMinutos = (distanciaAcumuladaKm / velocidad) * 60; + const numeroParadas = targetStopIndex; + const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60; + minutosHastaParada = tiempoViajeMinutos + tiempoParadasMinutos; + } } } - distanciaAcumuladaKm *= 1.2; - const velocidad = routeData.average_speed_kmh || VELOCIDAD_PROMEDIO_KMH; - const tiempoViajeMinutos = (distanciaAcumuladaKm / velocidad) * 60; - const numeroParadas = targetStopIndex; - const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60; - const minutosHastaParada = tiempoViajeMinutos + tiempoParadasMinutos; - // PASO 3: Calcular ETA para cada salida const ahora = new Date(); const minutosAhora = ahora.getHours() * 60 + ahora.getMinutes();