import 'package:get/get.dart'; import 'package:marco/helpers/services/api_service.dart'; import 'package:marco/helpers/services/app_logger.dart'; import 'package:marco/model/expense/expense_list_model.dart'; class ExpenseController extends GetxController { final RxList expenses = [].obs; final RxBool isLoading = false.obs; final RxString errorMessage = ''.obs; /// Fetch all expenses from API Future fetchExpenses() async { isLoading.value = true; errorMessage.value = ''; try { final result = await ApiService.getExpenseListApi(); if (result != null) { try { // Convert the raw result (List) to List final List parsed = List.from( result.map((e) => ExpenseModel.fromJson(e))); expenses.assignAll(parsed); logSafe("Expenses loaded: ${parsed.length}"); } catch (e) { errorMessage.value = 'Failed to parse expenses: $e'; logSafe("Parse error in fetchExpenses: $e", level: LogLevel.error); } } else { errorMessage.value = 'Failed to fetch expenses from server.'; logSafe("fetchExpenses failed: null response", level: LogLevel.error); } } catch (e, stack) { errorMessage.value = 'An unexpected error occurred.'; logSafe("Exception in fetchExpenses: $e", level: LogLevel.error); logSafe("StackTrace: $stack", level: LogLevel.debug); } finally { isLoading.value = false; } } /// Update expense status and refresh the list Future updateExpenseStatus(String expenseId, String statusId) async { isLoading.value = true; errorMessage.value = ''; try { logSafe("Updating status for expense: $expenseId -> $statusId"); final success = await ApiService.updateExpenseStatusApi( expenseId: expenseId, statusId: statusId, ); if (success) { logSafe("Expense status updated successfully."); await fetchExpenses(); return true; } else { errorMessage.value = "Failed to update expense status."; return false; } } catch (e, stack) { errorMessage.value = 'An unexpected error occurred.'; logSafe("Exception in updateExpenseStatus: $e", level: LogLevel.error); logSafe("StackTrace: $stack", level: LogLevel.debug); return false; } finally { isLoading.value = false; } } }