import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:latlong2/latlong.dart'; class EventModel { final String id; final String name; final String description; final DateTime startDateTime; final DateTime endDateTime; final double basePrice; final int installationTime; final int disassemblyTime; final String eventTypeId; final String customerId; final String address; final double latitude; final double longitude; final List workforce; final List> documents; final List> options; EventModel({ required this.id, required this.name, required this.description, required this.startDateTime, required this.endDateTime, required this.basePrice, required this.installationTime, required this.disassemblyTime, required this.eventTypeId, required this.customerId, required this.address, required this.latitude, required this.longitude, required this.workforce, required this.documents, this.options = const [], }); factory EventModel.fromMap(Map map, String id) { final List workforceRefs = map['workforce'] ?? []; final Timestamp? startTimestamp = map['StartDateTime'] as Timestamp?; final Timestamp? endTimestamp = map['EndDateTime'] as Timestamp?; final docsRaw = map['documents'] ?? []; final docs = docsRaw is List ? docsRaw.map>((e) { if (e is Map) { return Map.from(e as Map); } else if (e is String) { final fileName = Uri.decodeComponent(e.split('/').last.split('?').first); return {'name': fileName, 'url': e}; } else { return {}; } }).toList() : >[]; final optionsRaw = map['options'] ?? []; final options = optionsRaw is List ? optionsRaw.map>((e) { if (e is Map) { return Map.from(e as Map); } else { return {}; } }).toList() : >[]; return EventModel( id: id, name: map['Name'] ?? '', description: map['Description'] ?? '', startDateTime: startTimestamp?.toDate() ?? DateTime.now(), endDateTime: endTimestamp?.toDate() ?? DateTime.now().add(const Duration(hours: 1)), basePrice: (map['BasePrice'] ?? map['Price'] ?? 0.0).toDouble(), installationTime: map['InstallationTime'] ?? 0, disassemblyTime: map['DisassemblyTime'] ?? 0, eventTypeId: map['EventType'] is DocumentReference ? (map['EventType'] as DocumentReference).id : '', customerId: map['customer'] is DocumentReference ? (map['customer'] as DocumentReference).id : '', address: map['Address'] ?? '', latitude: (map['Latitude'] ?? 0.0).toDouble(), longitude: (map['Longitude'] ?? 0.0).toDouble(), workforce: workforceRefs.whereType().toList(), documents: docs, options: options, ); } Map toMap() { return { 'Name': name, 'Description': description, 'StartDateTime': Timestamp.fromDate(startDateTime), 'EndDateTime': Timestamp.fromDate(endDateTime), 'BasePrice': basePrice, 'InstallationTime': installationTime, 'DisassemblyTime': disassemblyTime, 'EventType': eventTypeId, 'customer': customerId, 'Address': address, 'Position': GeoPoint(latitude, longitude), 'Latitude': latitude, 'Longitude': longitude, 'workforce': workforce, 'documents': documents, 'options': options, }; } }