import 'dart:async'; import 'dart:convert'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:marco/helpers/services/app_logger.dart'; import 'package:marco/helpers/services/permission_service.dart'; import 'package:marco/model/user_permission.dart'; import 'package:marco/model/employee_info.dart'; import 'package:marco/model/projects_model.dart'; class PermissionController extends GetxController { var permissions = [].obs; var employeeInfo = Rxn(); var projectsInfo = [].obs; Timer? _refreshTimer; @override void onInit() { super.onInit(); _initialize(); } Future _initialize() async { final token = await _getAuthToken(); if (token?.isNotEmpty ?? false) { await loadData(token!); _startAutoRefresh(); } else { logSafe("Token is null or empty. Skipping API load and auto-refresh.", level: LogLevel.warning); } } Future _getAuthToken() async { try { final prefs = await SharedPreferences.getInstance(); final token = prefs.getString('jwt_token'); logSafe("Auth token retrieved: $token", level: LogLevel.debug); return token; } catch (e, stacktrace) { logSafe("Error retrieving auth token", level: LogLevel.error, error: e, stackTrace: stacktrace); return null; } } Future loadData(String token) async { try { final userData = await PermissionService.fetchAllUserData(token); _updateState(userData); await _storeData(); logSafe("Data loaded and state updated successfully."); } catch (e, stacktrace) { logSafe("Error loading data from API", level: LogLevel.error, error: e, stackTrace: stacktrace); } } void _updateState(Map userData) { try { permissions.assignAll(userData['permissions']); employeeInfo.value = userData['employeeInfo']; projectsInfo.assignAll(userData['projects']); logSafe("State updated with user data."); } catch (e, stacktrace) { logSafe("Error updating state", level: LogLevel.error, error: e, stackTrace: stacktrace); } } Future _storeData() async { try { final prefs = await SharedPreferences.getInstance(); await prefs.setString( 'user_permissions', jsonEncode(permissions.map((e) => e.toJson()).toList()), ); if (employeeInfo.value != null) { await prefs.setString( 'employee_info', jsonEncode(employeeInfo.value!.toJson()), ); } if (projectsInfo.isNotEmpty) { await prefs.setString( 'projects_info', jsonEncode(projectsInfo.map((e) => e.toJson()).toList()), ); } logSafe("User data successfully stored in SharedPreferences."); } catch (e, stacktrace) { logSafe("Error storing data", level: LogLevel.error, error: e, stackTrace: stacktrace); } } void _startAutoRefresh() { _refreshTimer = Timer.periodic(Duration(minutes: 30), (timer) async { logSafe("Auto-refresh triggered."); final token = await _getAuthToken(); if (token?.isNotEmpty ?? false) { await loadData(token!); } else { logSafe("Token missing during auto-refresh. Skipping.", level: LogLevel.warning); } }); } bool hasPermission(String permissionId) { final hasPerm = permissions.any((p) => p.id == permissionId); logSafe("Checking permission $permissionId: $hasPerm", level: LogLevel.debug); return hasPerm; } bool isUserAssignedToProject(String projectId) { final assigned = projectsInfo.any((project) => project.id == projectId); logSafe("Checking project assignment for $projectId: $assigned", level: LogLevel.debug); return assigned; } @override void onClose() { _refreshTimer?.cancel(); logSafe("PermissionController disposed and auto-refresh timer cancelled."); super.onClose(); } }