import 'dart:convert'; import 'package:get/get.dart'; import 'package:marco/helpers/services/app_logger.dart'; import 'package:marco/helpers/services/tenant_service.dart'; import 'package:marco/helpers/services/storage/local_storage.dart'; import 'package:marco/model/tenant/tenant_list_model.dart'; import 'package:marco/helpers/widgets/my_snackbar.dart'; class TenantSelectionController extends GetxController { final TenantService _tenantService = TenantService(); var tenants = [].obs; var isLoading = false.obs; @override void onInit() { super.onInit(); _checkExistingTenant(); } /// Check if a tenant was previously selected Future _checkExistingTenant() async { try { final savedTenant = await TenantService.loadSavedTenant(); if (savedTenant != null) { // Tenant already selected → go to dashboard Get.offAllNamed('/dashboard'); } else { // No tenant saved → load from API await loadTenants(); } } catch (e, st) { logSafe("❌ Error checking saved tenant", level: LogLevel.error, error: e, stackTrace: st); await loadTenants(); } } /// Load tenants from API Future loadTenants() async { isLoading.value = true; try { final data = await _tenantService.getTenants(); if (data != null && data.isNotEmpty) { tenants.value = data.map((e) => Tenant.fromJson(e)).toList(); // Auto-select if only one tenant if (tenants.length == 1) { await onTenantSelected(tenants.first.id); } } else { tenants.clear(); logSafe("⚠️ No tenants found for the user.", level: LogLevel.warning); } } catch (e, st) { logSafe("❌ Exception in loadTenants", level: LogLevel.error, error: e, stackTrace: st); tenants.clear(); } finally { isLoading.value = false; } } /// Handle tenant selection Future onTenantSelected(String tenantId) async { isLoading.value = true; try { final success = await _tenantService.selectTenant(tenantId); if (success) { final tenant = tenants.firstWhere((t) => t.id == tenantId); // Save selected tenant in TenantService and LocalStorage TenantService.setSelectedTenant(tenant); await LocalStorage.saveString( 'selectedTenant', jsonEncode(tenant.toJson())); // Navigate to dashboard Get.offAllNamed('/dashboard'); showAppSnackbar( title: "Success", message: "Organization selected successfully.", type: SnackbarType.success, ); } else { showAppSnackbar( title: "Error", message: "Unable to select organization. Please try again.", type: SnackbarType.error, ); } } catch (e, st) { logSafe("❌ Exception in onTenantSelected", level: LogLevel.error, error: e, stackTrace: st); showAppSnackbar( title: "Error", message: "An unexpected error occurred while selecting organization.", type: SnackbarType.error, ); } finally { isLoading.value = false; } } }