diff --git a/lib/camion_estado.dart b/lib/camion_estado.dart new file mode 100644 index 0000000..ed70209 --- /dev/null +++ b/lib/camion_estado.dart @@ -0,0 +1,112 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'notificaciones_service.dart'; + +// ─── ESTADO GLOBAL DEL CAMIÓN ─────────────────────────────────── +class CamionEstado extends ChangeNotifier { + + int _positionId = 1; + Timer? _timer; + bool _corriendo = false; + + // Configuración de alertas + bool notificarInicioRuta = true; + bool notificarCamionCerca = true; + bool notificarRetrasos = false; + + int get positionId => _positionId; + bool get corriendo => _corriendo; + + // Etiquetas de cada posición + static const Map etapas = { + 1: '🏭 En el Relleno Sanitario', + 2: '🚛 Ruta iniciada', + 3: '📍 En camino a tu sector', + 4: '⚡ Cerca de tu domicilio', + 5: '🏘️ En tu colonia', + 6: '📦 Recolectando residuos', + 7: '↩️ Regresando', + 8: '✅ Servicio finalizado', + }; + + // ETA según posición + static const Map> etaInfo = { + 1: {'horaInicio': '--:--', 'horaFin': '--:--', 'minutos': 0, 'label': 'Sin servicio aún'}, + 2: {'horaInicio': '7:00 p.m.','horaFin': '7:40 p.m.','minutos': 40, 'label': 'Ruta iniciada'}, + 3: {'horaInicio': '7:10 p.m.','horaFin': '7:35 p.m.','minutos': 30, 'label': 'En camino'}, + 4: {'horaInicio': '7:20 p.m.','horaFin': '7:30 p.m.','minutos': 15, 'label': 'Cerca de ti'}, + 5: {'horaInicio': '7:25 p.m.','horaFin': '7:30 p.m.','minutos': 8, 'label': 'En tu colonia'}, + 6: {'horaInicio': '7:28 p.m.','horaFin': '7:30 p.m.','minutos': 2, 'label': '¡Está aquí!'}, + 7: {'horaInicio': '--:--', 'horaFin': '--:--', 'minutos': 0, 'label': 'Regresando'}, + 8: {'horaInicio': '--:--', 'horaFin': '--:--', 'minutos': 0, 'label': 'Servicio completado'}, + }; + + // ── Iniciar timer ─────────────────────────────────────────── + void iniciarTimer() { + if (_corriendo) return; + _corriendo = true; + _positionId = 1; + notifyListeners(); + + // Avanza cada 8 segundos (puedes cambiarlo) + _timer = Timer.periodic(const Duration(seconds: 8), (timer) async { + if (_positionId >= 8) { + detener(); + return; + } + + _positionId++; + notifyListeners(); + + // Notificación automática al iniciar ruta + if (_positionId == 2 && notificarInicioRuta) { + await enviarNotificacion( + id: 1, + titulo: '¡Ruta Iniciada!', + cuerpo: 'El camión recolector ha salido del Relleno Sanitario rumbo a tu sector. Asegúrate de tener listos tus residuos.', + ); + } + + // Notificación automática cuando está cerca + if (_positionId == 4 && notificarCamionCerca) { + await enviarNotificacion( + id: 2, + titulo: 'Camión Cercano 🚛', + cuerpo: 'El camión está a menos de 15 minutos de tu domicilio. Es momento de sacar tus bolsas a la acera.', + ); + } + + // Notificación automática al finalizar + if (_positionId == 8) { + await enviarNotificacion( + id: 3, + titulo: 'Servicio Finalizado ✅', + cuerpo: 'El camión de tu sector ha concluido su jornada de recolección diaria.', + ); + } + }); + } + + // ── Detener timer ─────────────────────────────────────────── + void detener() { + _timer?.cancel(); + _corriendo = false; + notifyListeners(); + } + + // ── Reiniciar ─────────────────────────────────────────────── + void reiniciar() { + detener(); + _positionId = 1; + notifyListeners(); + } + + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } +} + +// Instancia global accesible desde cualquier archivo +final camionEstado = CamionEstado(); \ No newline at end of file