import 'package:relationship_saver/features/ai_digest/domain/ai_digest_models.dart'; import 'package:url_launcher/url_launcher.dart'; class CalendarEventLauncher { const CalendarEventLauncher(); Future addSuggestionToCalendar(AiSuggestionDraft draft) async { final Uri? uri = calendarUriForSuggestion(draft); if (uri == null) { return false; } if (await launchUrl(uri, mode: LaunchMode.externalApplication)) { return true; } return launchUrl(uri); } } Uri? calendarUriForSuggestion(AiSuggestionDraft draft) { final DateTime? startsAt = draft.suggestedFor; if (draft.kind != AiSuggestionKind.eventIdea || startsAt == null) { return null; } final DateTime endsAt = draft.eventEndsAt ?? startsAt.add(const Duration(hours: 2)); final String details = [ draft.details, if (draft.reason != null && draft.reason!.trim().isNotEmpty) 'Why: ${draft.reason!.trim()}', if (draft.eventUrl != null && draft.eventUrl!.trim().isNotEmpty) draft.eventUrl!.trim(), if (draft.sourceUrls.isNotEmpty) 'Sources: ${draft.sourceUrls.join(', ')}', ].where((String value) => value.trim().isNotEmpty).join('\n\n'); return Uri.https('calendar.google.com', '/calendar/render', { 'action': 'TEMPLATE', 'text': draft.title, 'dates': '${_calendarTimestamp(startsAt)}/${_calendarTimestamp(endsAt)}', if (details.isNotEmpty) 'details': details, if (draft.eventLocation != null && draft.eventLocation!.trim().isNotEmpty) 'location': draft.eventLocation!.trim(), }); } String _calendarTimestamp(DateTime value) { final DateTime utc = value.toUtc(); return '${utc.year.toString().padLeft(4, '0')}' '${utc.month.toString().padLeft(2, '0')}' '${utc.day.toString().padLeft(2, '0')}T' '${utc.hour.toString().padLeft(2, '0')}' '${utc.minute.toString().padLeft(2, '0')}' '${utc.second.toString().padLeft(2, '0')}Z'; }