import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/controller/home/captin/map_driver_controller.dart'; import 'dart:async'; import '../../../constant/links.dart'; import '../../../constant/style.dart'; import '../../../constant/table_names.dart'; import '../../../main.dart'; import '../../../views/home/my_wallet/walet_captain.dart'; import '../../../views/widgets/elevated_btn.dart'; import '../../functions/crud.dart'; import '../../functions/location_controller.dart'; import '../payment/captain_wallet_controller.dart'; class HomeCaptainController extends GetxController { bool isActive = false; DateTime? activeStartTime; Duration activeDuration = Duration.zero; Timer? activeTimer; Map data = {}; bool isLoading = true; bool isCallOn = false; String totalMoneyToday = '0'; String totalMoneyInSEFER = '0'; String totalDurationToday = '0'; Timer? timer; late LatLng myLocation = const LatLng(32, 36); String totalPoints = '0'; String countRefuse = '0'; bool mapType = false; bool mapTrafficON = false; double widthMapTypeAndTraffic = 50; // Inject the LocationController class final locationController = Get.put(LocationController()); String formatDuration(Duration duration) { String twoDigits(int n) => n.toString().padLeft(2, "0"); String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60)); String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60)); return "${duration.inHours}:$twoDigitMinutes:$twoDigitSeconds"; } void goToWalletFromConnect() { Get.back(); Get.back(); Get.to(() => WaletCaptain()); } String stringActiveDuration = ''; void onButtonSelected() { // totalPoints = Get.find().totalPoints; isActive = !isActive; if (isActive) { if (double.parse(totalPoints) > -500) { locationController.startLocationUpdates(); activeStartTime = DateTime.now(); activeTimer = Timer.periodic(const Duration(seconds: 1), (timer) { activeDuration = DateTime.now().difference(activeStartTime!); stringActiveDuration = formatDuration(activeDuration); update(); }); } else { locationController.stopLocationUpdates(); activeStartTime = null; activeTimer?.cancel(); savePeriod(activeDuration); activeDuration = Duration.zero; update(); } } else { locationController.stopLocationUpdates(); activeStartTime = null; activeTimer?.cancel(); savePeriod(activeDuration); activeDuration = Duration.zero; update(); } // } } void getRefusedOrderByCaptain() async { DateTime today = DateTime.now(); int todayDay = today.day; String driverId = box.read(BoxName.driverID).toString(); String customQuery = ''' SELECT COUNT(*) AS count FROM ${TableName.driverOrdersRefuse} WHERE driver_id = '$driverId' AND created_at LIKE '%$todayDay%' '''; try { List> results = await sql.getCustomQuery(customQuery); countRefuse = results[0]['count'].toString(); update(); if (int.parse(countRefuse) > 3 || double.parse(totalPoints) < -100) { print('total point is $totalPoints'); locationController.stopLocationUpdates(); activeStartTime = null; activeTimer?.cancel(); savePeriod(activeDuration); activeDuration = Duration.zero; update(); Get.defaultDialog( // backgroundColor: CupertinoColors.destructiveRed, barrierDismissible: false, title: 'You Are Stopped For this Day !'.tr, content: Text( 'You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!' .tr, style: AppStyle.title, ), confirm: MyElevatedButton( title: 'Ok , See you Tomorrow'.tr, onPressed: () { Get.back(); Get.back(); })); } } catch (e) { print('Error executing custom query: $e'); } } void changeMapType() { mapType = !mapType; // heightButtomSheetShown = isButtomSheetShown == true ? 240 : 0; update(); } void changeMapTraffic() { mapTrafficON = !mapTrafficON; update(); } GoogleMapController? mapHomeCaptaiController; void onMapCreated(GoogleMapController controller) { mapHomeCaptaiController = controller; controller.getVisibleRegion(); controller.animateCamera( CameraUpdate.newLatLng(Get.find().myLocation), ); update(); } void savePeriod(Duration period) { final periods = box.read>(BoxName.periods) ?? []; periods.add(period.inSeconds); box.write(BoxName.periods, periods); } Duration calculateTotalDuration() { final periods = box.read>(BoxName.periods) ?? []; Duration totalDuration = Duration.zero; for (dynamic periodInSeconds in periods) { final periodDuration = Duration(seconds: periodInSeconds); totalDuration += periodDuration; } return totalDuration; } void startPeriodicExecution() { Timer.periodic(const Duration(seconds: 30), (timer) async { await getCaptainDurationOnToday(); }); } void stopTimer() { print('Stopping timer'); timer?.cancel(); } getlocation() async { isLoading = true; print('isLoading $isLoading'); update(); await Get.find().getLocation(); isLoading = false; update(); } @override void onInit() async { await addToken(); await getlocation(); onButtonSelected(); getPaymentToday(); getAllPayment(); startPeriodicExecution(); onMapCreated(mapHomeCaptaiController!); getRefusedOrderByCaptain(); totalPoints = Get.find().totalPoints; // LocationController().getLocation(); super.onInit(); } addToken() async { await CRUD().post(link: AppLink.addTokensDriver, payload: { 'token': box.read(BoxName.tokenDriver), 'captain_id': box.read(BoxName.driverID).toString() }).then((value) => print('Token Added')); MapDriverController().driverCallPassenger(); // box.write(BoxName.statusDriverLocation, 'off'); } getPaymentToday() async { var res = await CRUD().get( link: AppLink.getDriverpaymentToday, payload: {'driverID': box.read(BoxName.driverID).toString()}); data = jsonDecode(res); totalMoneyToday = data['message'][0]['todayAmount']; update(); } getAllPayment() async { var res = await CRUD().get( link: AppLink.getAllPaymentFromRide, payload: {'driverID': box.read(BoxName.driverID).toString()}); data = jsonDecode(res); totalMoneyInSEFER = data['message'][0]['total_amount']; update(); } Future getCaptainDurationOnToday() async { var res = await CRUD().get( link: AppLink.getTotalDriverDurationToday, payload: {'driver_id': box.read(BoxName.driverID).toString()}); data = jsonDecode(res); totalDurationToday = data['message'][0]['total_duration']; update(); } @override void dispose() { activeTimer?.cancel(); stopTimer(); super.dispose(); } }