import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:prosapp_web_app/models/pro_state.dart'; import 'package:prosapp_web_app/models/service.dart'; import 'package:prosapp_web_app/models/service_status.dart'; import 'package:prosapp_web_app/models/servicio_profesional.dart'; import 'package:prosapp_web_app/models/usuario.dart'; class ServicesProvider extends ChangeNotifier { List services = []; ServicioProfesional? service; bool isLoading = true; final _servicesCollection = FirebaseFirestore.instance.collection('services'); final _usersCollection = FirebaseFirestore.instance.collection('users'); void logout() { services = []; service = null; isLoading = false; notifyListeners(); } Future changeServiceStatus( String serviceId, ServiceStatus newStatus) async { try { final statusValue = enumToIntService(newStatus); await FirebaseFirestore.instance .collection('services') .doc(serviceId) .update({'status': statusValue}); notifyListeners(); } catch (e) { print('Error al actualizar el estado: $e'); } } // cambiar el user_scored a true Future changeUserScored(String serviceId) async { try { await FirebaseFirestore.instance .collection('services') .doc(serviceId) .update({'user_scored': true}); notifyListeners(); } catch (e) { print('Error al actualizar el estado: $e'); } } // cambiar el professional_scored a true Future changeProfessionalScored(String serviceId) async { try { await FirebaseFirestore.instance .collection('services') .doc(serviceId) .update({'professional_scored': true}); notifyListeners(); } catch (e) { print('Error al actualizar el estado: $e'); } } void clearServices() { services.clear(); notifyListeners(); } getServiceForUser(String serviceId) async { try { isLoading = true; final queryService = await _servicesCollection.doc(serviceId).get(); final servicio = Service.fromDocument(queryService); final queryUsers = await _usersCollection.doc(servicio.professionalId).get(); final user = Usuario.fromDocument(queryUsers.data()!); service = ServicioProfesional( user: user, service: servicio, ); } catch (e) { service = null; } finally { isLoading = false; notifyListeners(); } } getServiceForProfessional(String serviceId) async { try { isLoading = true; final queryService = await _servicesCollection.doc(serviceId).get(); final servicio = Service.fromDocument(queryService); final queryUsers = await _usersCollection.doc(servicio.userId).get(); final user = Usuario.fromDocument(queryUsers.data()!); service = ServicioProfesional( user: user, service: servicio, ); } catch (e) { service = null; } finally { isLoading = false; notifyListeners(); } } getServicesForUser(String userId) async { try { isLoading = true; final queryServices = await _servicesCollection .where('user_id', isEqualTo: userId) .where('status', whereIn: [0, 1, 3]).get(); final servicios = queryServices.docs.map(Service.fromDocument).toList(); final professionalIds = servicios.map((service) => service.professionalId).toList(); final queryUsers = await _usersCollection .where('professional_state', isEqualTo: ProState.active.index) .where(FieldPath.documentId, whereIn: professionalIds) .get(); final professionalUsers = queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList(); final professionalUsersMap = { for (var user in professionalUsers) user.id: user }; final servicesMap = (servicios.map((service) { final user = professionalUsersMap[service.professionalId]; return ServicioProfesional( user: user!, service: service, ); }).toList()); services = servicesMap ..sort((a, b) { final dateA = DateTime.parse(a.service.day); final dateB = DateTime.parse(b.service.day); final range1A = a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute; final range1B = b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute; if (dateA.compareTo(dateB) != 0) { return dateA.compareTo(dateB); } else { return range1A.compareTo(range1B); } }); } catch (e) { print('Error obteniendo servicios: $e'); } finally { isLoading = false; notifyListeners(); } } getServicesRequestsForProfessional(String userId) async { try { isLoading = true; final queryServices = await _servicesCollection .where('professional_id', isEqualTo: userId) .where('status', whereIn: [0]).get(); final servicios = queryServices.docs.map(Service.fromDocument).toList(); final userIds = servicios.map((service) => service.userId).toList(); final queryUsers = await _usersCollection .where(FieldPath.documentId, whereIn: userIds) .get(); final users = queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList(); final usersMap = {for (var doc in users) doc.id: doc}; final servicesMap = (servicios.map((service) { final user = usersMap[service.userId]; return ServicioProfesional( user: user!, service: service, ); }).toList()); services = servicesMap ..sort((a, b) { final dateA = DateTime.parse(a.service.day); final dateB = DateTime.parse(b.service.day); final range1A = a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute; final range1B = b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute; if (dateA.compareTo(dateB) != 0) { return dateA.compareTo(dateB); } else { return range1A.compareTo(range1B); } }); } catch (e) { print('Error obteniendo servicios: $e'); } finally { isLoading = false; notifyListeners(); } } getServicesForProfessional(String userId) async { try { isLoading = true; final queryServices = await _servicesCollection .where('professional_id', isEqualTo: userId) .where('status', whereIn: [1, 3]).get(); final servicios = queryServices.docs.map(Service.fromDocument).toList(); final userIds = servicios.map((service) => service.userId).toList(); final queryUsers = await _usersCollection .where(FieldPath.documentId, whereIn: userIds) .get(); final users = queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList(); final usersMap = {for (var doc in users) doc.id: doc}; final servicesMap = (servicios.map((service) { final user = usersMap[service.userId]; return ServicioProfesional( user: user!, service: service, ); }).toList()); services = servicesMap ..sort((a, b) { final dateA = DateTime.parse(a.service.day); final dateB = DateTime.parse(b.service.day); final range1A = a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute; final range1B = b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute; if (dateA.compareTo(dateB) != 0) { return dateA.compareTo(dateB); } else { return range1A.compareTo(range1B); } }); } catch (e) { print('Error obteniendo servicios: $e'); } finally { isLoading = false; notifyListeners(); } } getServicesHistoryForUser(String userId) async { try { isLoading = true; final queryServices = await _servicesCollection .where('user_id', isEqualTo: userId) .where('status', whereIn: [2, 4, 5]).get(); final servicios = queryServices.docs.map(Service.fromDocument).toList(); final professionalIds = servicios.map((service) => service.professionalId).toList(); final queryUsers = await _usersCollection .where('professional_state', isEqualTo: ProState.active.index) .where(FieldPath.documentId, whereIn: professionalIds) .get(); final professionalUsers = queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList(); final professionalUsersMap = { for (var user in professionalUsers) user.id: user }; final servicesMap = (servicios.map((service) { final user = professionalUsersMap[service.professionalId]; return ServicioProfesional( user: user!, service: service, ); }).toList()); services = servicesMap ..sort((a, b) { final dateA = DateTime.parse(a.service.day); final dateB = DateTime.parse(b.service.day); final range1A = a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute; final range1B = b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute; if (dateA.compareTo(dateB) != 0) { return dateA.compareTo(dateB); } else { return range1A.compareTo(range1B); } }); } catch (e) { print('Error obteniendo servicios: $e'); } finally { isLoading = false; notifyListeners(); } } getServicesHistoryForProfessional(String userId) async { try { isLoading = true; final queryServices = await _servicesCollection .where('professional_id', isEqualTo: userId) .where('status', whereIn: [2, 4, 5]).get(); final servicios = queryServices.docs.map(Service.fromDocument).toList(); final userIds = servicios.map((service) => service.userId).toList(); final queryUsers = await _usersCollection .where(FieldPath.documentId, whereIn: userIds) .get(); final users = queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList(); final usersMap = {for (var doc in users) doc.id: doc}; final servicesMap = (servicios.map((service) { final user = usersMap[service.userId]; return ServicioProfesional( user: user!, service: service, ); }).toList()); services = servicesMap ..sort((a, b) { final dateA = DateTime.parse(a.service.day); final dateB = DateTime.parse(b.service.day); final range1A = a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute; final range1B = b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute; if (dateA.compareTo(dateB) != 0) { return dateA.compareTo(dateB); } else { return range1A.compareTo(range1B); } }); } catch (e) { print('Error obteniendo servicios: $e'); } finally { isLoading = false; notifyListeners(); } } }