import 'package:flutter/services.dart'; import 'package:url_strategy/url_strategy.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:on_field_work/helpers/services/storage/local_storage.dart'; import 'package:on_field_work/helpers/services/app_logger.dart'; import 'package:on_field_work/helpers/services/auth_service.dart'; import 'package:on_field_work/helpers/services/firebase/firebase_messaging_service.dart'; import 'package:on_field_work/helpers/services/device_info_service.dart'; import 'package:on_field_work/helpers/theme/theme_customizer.dart'; import 'package:on_field_work/helpers/theme/app_theme.dart'; import 'package:on_field_work/helpers/services/gemini_service.dart'; Future initializeApp() async { try { logSafe("💡 Starting app initialization..."); await Future.wait([ _setupUI(), _setupFirebase(), _setupLocalStorage(), ]); await _setupDeviceInfo(); await _handleAuthTokens(); await _setupTheme(); await _setupFirebaseMessaging(); _finalizeAppStyle(); logSafe("✅ App initialization completed successfully."); } catch (e, stacktrace) { logSafe( "⛔ Error during app initialization", level: LogLevel.error, error: e, stackTrace: stacktrace, ); rethrow; } } /// --------------------------------------------------------------------------- /// 🔹 AUTH TOKEN HANDLER /// --------------------------------------------------------------------------- Future _handleAuthTokens() async { final refreshToken = await LocalStorage.getRefreshToken(); if (refreshToken?.isNotEmpty ?? false) { logSafe("🔁 Refresh token found. Attempting to refresh JWT..."); final success = await AuthService.refreshToken(); if (!success) { logSafe("âš ī¸ Refresh token invalid or expired. User must login again."); } } else { logSafe("❌ No refresh token found. Skipping refresh."); } } /// --------------------------------------------------------------------------- /// 🔹 UI SETUP /// --------------------------------------------------------------------------- Future _setupUI() async { setPathUrlStrategy(); await SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); logSafe("💡 UI setup completed."); } /// --------------------------------------------------------------------------- /// 🔹 FIREBASE + GEMINI SETUP /// --------------------------------------------------------------------------- Future _setupFirebase() async { // Firebase Core await Firebase.initializeApp(); logSafe("đŸ”Ĩ Firebase initialized."); await GeminiService.initialize(); logSafe("✨ Gemini service initialized (Gemini 2.5 Flash)."); } /// --------------------------------------------------------------------------- /// 🔹 LOCAL STORAGE SETUP /// --------------------------------------------------------------------------- Future _setupLocalStorage() async { if (!LocalStorage.isInitialized) { await LocalStorage.init(); logSafe("💾 Local storage initialized."); } else { logSafe("â„šī¸ Local storage already initialized. Skipping."); } } /// --------------------------------------------------------------------------- /// 🔹 DEVICE INFO /// --------------------------------------------------------------------------- Future _setupDeviceInfo() async { final deviceInfoService = DeviceInfoService(); await deviceInfoService.init(); logSafe("📱 Device Info Loaded: ${deviceInfoService.deviceData}"); } /// --------------------------------------------------------------------------- /// 🔹 THEME SETUP /// --------------------------------------------------------------------------- Future _setupTheme() async { await ThemeCustomizer.init(); logSafe("🎨 Theme customizer initialized."); } /// --------------------------------------------------------------------------- /// 🔹 FIREBASE CLOUD MESSAGING (PUSH) /// --------------------------------------------------------------------------- Future _setupFirebaseMessaging() async { await FirebaseNotificationService().initialize(); logSafe("📨 Firebase Messaging initialized."); } /// --------------------------------------------------------------------------- /// 🔹 FINAL APP STYLE /// --------------------------------------------------------------------------- void _finalizeAppStyle() { AppStyle.init(); logSafe("đŸŽ¯ AppStyle initialized."); }