import 'dart:convert'; import 'package:fl_chart/fl_chart.dart'; import 'package:get/get.dart'; import '../../constant/links.dart'; import '../../models/model/passengers_model.dart'; import '../../print.dart'; import '../functions/crud.dart'; class StaticController extends GetxController { Map jsonData1 = {}; Map jsonData2 = {}; List staticList = []; var chartDataPassengers; var chartDataDrivers; var chartDataDriversCalling; var chartDataRides; var chartDataEmployee; var chartDataEmployeeMaryam; var chartDataEmployeeRawda; var chartDataEmployeeMena; var chartDataEmployeeSefer4; var chartDataDriversMatchingNotes; bool isLoading = false; String totalMonthlyPassengers = ''; String totalMonthlyRides = ''; String totalMonthlyEmployee = ''; String totalMonthlyDrivers = ''; late List passengersData; late List ridesData; late List employeeData; late List driversData; Future fetch() async { isLoading = true; update(); // Notify the observers about the loading state change var res = await CRUD().get( link: AppLink.getPassengersStatic, payload: {}, ); jsonData1 = jsonDecode(res); var jsonResponse = jsonDecode(res) as Map; isLoading = false; final List jsonData = jsonResponse['message']; totalMonthlyPassengers = jsonData[0]['totalMonthly'].toString(); passengersData = jsonData.map((item) { return MonthlyPassengerInstall.fromJson(item); }).toList(); final List spots = passengersData .map((data) => FlSpot( data.day.toDouble(), data.totalPassengers.toDouble(), )) .toList(); chartDataPassengers = spots; update(); // Notify the observers about the data and loading state change } Future fetchRides() async { isLoading = true; update(); // Notify the observers about the loading state change var res = await CRUD().get( link: AppLink.getRidesStatic, payload: {}, ); jsonData1 = jsonDecode(res); var jsonResponse = jsonDecode(res) as Map; isLoading = false; final List jsonData = jsonResponse['message']; totalMonthlyRides = jsonData[0]['totalMonthly'].toString(); ridesData = jsonData.map((item) { return MonthlyRidesInstall.fromJson(item); }).toList(); final List spots = ridesData .map((data) => FlSpot( data.day.toDouble(), data.totalRides.toDouble(), )) .toList(); chartDataRides = spots; update(); // Notify the observers about the data and loading state change } Future fetchEmployee() async { try { isLoading = true; update(); var res = await CRUD().get(link: AppLink.getEmployeeStatic, payload: {}); // First check if the response is valid JSON if (res == 'failure') { throw FormatException('Invalid response: $res'); } var jsonResponse = jsonDecode(res) as Map; // Initialize empty lists for all chart data chartDataEmployeeMaryam = []; chartDataEmployeeRawda = []; chartDataEmployeeMena = []; chartDataEmployeeSefer4 = []; totalMonthlyRides = '0'; // Check for error response if (jsonResponse['status'] == 'failure') { isLoading = false; update(); return; } final List jsonData = jsonResponse['message']; if (jsonData.isEmpty) { isLoading = false; update(); return; } totalMonthlyRides = jsonData[0]['totalMonthly']?.toString() ?? '0'; // Group data by employee Map> employeeDataMap = {}; for (var item in jsonData) { var employeeData = MonthlyEmployeeData.fromJson(item); if (!employeeDataMap.containsKey(employeeData.name)) { employeeDataMap[employeeData.name] = []; } employeeDataMap[employeeData.name]!.add(employeeData); } final today = DateTime.now().day; // Create data for each employee final employeeNames = { 'maryam': chartDataEmployeeMaryam, 'yasmine': chartDataEmployeeRawda, 'mena': chartDataEmployeeMena, 'ashjan': chartDataEmployeeSefer4, }; employeeNames.forEach((name, chartData) { var spots = []; for (int day = 1; day <= today; day++) { spots.add(FlSpot( day.toDouble(), employeeDataMap[name] ?.firstWhere( (e) => e.day == day, orElse: () => MonthlyEmployeeData( day: day, totalEmployees: 0, name: name, ), ) .totalEmployees .toDouble() ?? 0, )); } // Explicitly cast to List if (name == 'maryam') chartDataEmployeeMaryam = List.from(spots); if (name == 'yasmine') chartDataEmployeeRawda = List.from(spots); if (name == 'mena') chartDataEmployeeMena = List.from(spots); if (name == 'ashjan') chartDataEmployeeSefer4 = List.from(spots); }); } catch (e) { Log.print('Error in fetchEmployee: $e'); // Set empty FlSpot lists in case of error chartDataEmployeeMaryam = []; chartDataEmployeeRawda = []; chartDataEmployeeMena = []; chartDataEmployeeSefer4 = []; totalMonthlyRides = '0'; } finally { isLoading = false; update(); } } Future fetchDrivers() async { isLoading = true; update(); // Notify the observers about the loading state change var res = await CRUD().get( link: AppLink.getdriverstotalMonthly, payload: {}, ); jsonData2 = jsonDecode(res); var jsonResponse = jsonDecode(res) as Map; isLoading = false; final List jsonData = jsonResponse['message']; staticList = jsonData; totalMonthlyDrivers = jsonData[0]['totalDrivers'].toString(); driversData = jsonData.map((item) { return MonthlyDriverInstall.fromJson(item); }).toList(); final List spots = driversData .map((data) => FlSpot( data.day.toDouble(), data.dailyTotalDrivers.toDouble(), )) .toList(); chartDataDrivers = spots; final List spotsCalling = driversData .map((data) => FlSpot( data.day.toDouble(), data.dailyTotalCallingDrivers.toDouble(), )) .toList(); chartDataDriversCalling = spotsCalling; final List spotsTotalMatchingNotes = driversData .map((data) => FlSpot( data.day.toDouble(), data.dailyMatchingNotes.toDouble(), )) .toList(); chartDataDriversMatchingNotes = spotsTotalMatchingNotes; update(); // Notify the observers about the data and loading state change } Future getAll() async { await fetch(); await fetchRides(); await fetchDrivers(); await fetchEmployee(); } }