import 'dart:io'; import 'package:latlong2/latlong.dart'; import 'package:path_provider/path_provider.dart'; import '../models/stop.dart'; class GpxExportService { /// Export route stops as GPX file with waypoints and optional track. /// Returns the file path of the saved GPX file. static Future exportRoute({ required String routeName, required List stops, List? trackPoints, }) async { final buffer = StringBuffer(); buffer.writeln(''); buffer.writeln( ''); buffer.writeln(' '); buffer.writeln(' ${_escapeXml(routeName)}'); buffer.writeln(' '); buffer.writeln(' '); // Waypoints for (final stop in stops) { buffer.writeln(' '); buffer.writeln(' ${_escapeXml(stop.street)} ${_escapeXml(stop.houseNumber)}'); if (stop.newspapers.isNotEmpty) { buffer.writeln(' ${_escapeXml(stop.newspapers.join(', '))}'); } if (stop.notes.isNotEmpty) { buffer.writeln(' ${_escapeXml(stop.notes)}'); } buffer.writeln(' '); } // Track (if route points available) if (trackPoints != null && trackPoints.isNotEmpty) { buffer.writeln(' '); buffer.writeln(' ${_escapeXml(routeName)} - Route'); buffer.writeln(' '); for (final point in trackPoints) { buffer.writeln( ' '); } buffer.writeln(' '); buffer.writeln(' '); } buffer.writeln(''); // Save to file final directory = await getApplicationDocumentsDirectory(); final sanitized = routeName.replaceAll(RegExp(r'[^\w\s-]'), '').replaceAll(' ', '_'); final fileName = 'route_${sanitized}_${_dateStamp()}.gpx'; final file = File('${directory.path}/$fileName'); await file.writeAsString(buffer.toString()); return file.path; } static String _escapeXml(String text) { return text .replaceAll('&', '&') .replaceAll('<', '<') .replaceAll('>', '>') .replaceAll('"', '"') .replaceAll("'", '''); } static String _dateStamp() { final now = DateTime.now(); return '${now.year}${now.month.toString().padLeft(2, '0')}${now.day.toString().padLeft(2, '0')}_${now.hour.toString().padLeft(2, '0')}${now.minute.toString().padLeft(2, '0')}'; } }