Files
hackathon-heavy-gears-7cc00…/lib/camion_estado.dart

112 lines
4.0 KiB
Dart

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<int, String> 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<int, Map<String, dynamic>> 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();