import 'dart:convert'; import 'package:local_auth/local_auth.dart'; import 'package:sefer_driver/constant/style.dart'; import 'package:sefer_driver/controller/firebase/firbase_messge.dart'; import 'package:sefer_driver/controller/firebase/local_notification.dart'; import 'package:sefer_driver/views/widgets/elevated_btn.dart'; import 'package:sefer_driver/views/widgets/error_snakbar.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:sefer_driver/constant/box_name.dart'; import 'package:sefer_driver/constant/links.dart'; import 'package:sefer_driver/controller/functions/crud.dart'; import 'package:sefer_driver/main.dart'; import '../../../views/widgets/mydialoug.dart'; import '../../firebase/notification_service.dart'; class CaptainWalletController extends GetxController { bool isLoading = false; final formKeyTransfer = GlobalKey(); final formKeyAccount = GlobalKey(); Map walletDate = {}; Map walletDateVisa = {}; Map walletDriverPointsDate = {}; final formKey = GlobalKey(); String totalAmount = '0'; double kazan = 0; String totalAmountVisa = '0'; String totalPoints = '0'; final amountFromBudgetController = TextEditingController(); final newDriverPhoneController = TextEditingController(); final phoneWallet = TextEditingController(); final cardBank = TextEditingController(); final bankCode = TextEditingController(); payFromBudget() async { if (formKey.currentState!.validate()) { var pointFromBudget = int.parse((amountFromBudgetController.text)); // await getPaymentId('fromBudgetToPoints', // int.parse((amountFromBudgetController.text)) * -1); var paymentToken3 = await generateToken((pointFromBudget * -1).toString()); var paymentID = await getPaymentId( 'fromBudgetToPoints', (pointFromBudget * -1).toString()); await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { 'amount': (pointFromBudget * -1).toString(), 'rideId': paymentID.toString(), 'payment_method': 'myBudget', 'passengerID': 'myBudgetToPoint', 'token': paymentToken3, 'driverID': box.read(BoxName.driverID).toString(), }); Future.delayed(const Duration(seconds: 1)); await addDriverWallet( 'fromBudget', pointFromBudget.toString(), pointFromBudget.toString()); update(); Get.back(); await refreshCaptainWallet(); NotificationController().showNotification( 'You have successfully charged your account'.tr, '$pointFromBudget ${'has been added to your budget'.tr}', 'tone1', '', ); } } // متغيرات الحالة (تأكد من تعريفها في الـ Controller) bool isError = false; int morningCount = 0; int afternoonCount = 0; String lastWeekIncome = '0'; String bankAccount = ''; Future refreshCaptainWallet() async { // 1. تفعيل حالة التحميل مرة واحدة فقط isLoading = true; isError = false; update(); // تحديث الواجهة لإظهار اللودر try { // 2. طلب واحد فقط للسيرفر الموحد (The Aggregated Endpoint) var response = await CRUD().getWallet( link: "${AppLink.paymentServer}/ride/driverWallet/get_wallet_summary.php", payload: {'driverID': box.read(BoxName.driverID).toString()}, ); isLoading = false; if (response != 'failure') { var body = jsonDecode(response); if (body['status'] == "success") { var data = body['message']; walletDate = data; // تفكيك البيانات من الرد الموحد // التعامل مع القيم كـ String أو num لتجنب مشاكل الـ Parsing totalAmount = (data['cash_balance'] ?? 0).toString(); // الفيزا + التحويلات مدموجة وجاهزة من السيرفر totalAmountVisa = (data['wallet_balance'] ?? 0).toString(); // النقاط double p = double.tryParse(data['points_balance'].toString()) ?? 0.0; totalPoints = p.toStringAsFixed(0); // بيانات الرحلات (تأتي من RID Server) morningCount = int.tryParse(data['morning_count'].toString()) ?? 0; afternoonCount = int.tryParse(data['afternoon_count'].toString()) ?? 0; lastWeekIncome = (data['weekly_income'] ?? 0).toString(); bankAccount = data['bank_account'] ?? ""; // حفظ بيانات البنك لوكالي لاستخدامها لاحقاً دون طلب if (bankAccount.isNotEmpty) { box.write(BoxName.accountIdStripeConnect, bankAccount); } } else { isError = true; mySnackeBarError("Failed to fetch wallet data"); } } else { isError = true; } } catch (e) { isLoading = false; isError = true; print("Wallet Refresh Error: $e"); } // 3. تحديث نهائي واحد للواجهة update(); } List amountToNewDriverMap = []; bool isNewTransfer = false; Future detectNewDriverFromMyBudget() async { if (formKeyTransfer.currentState!.validate()) { if (int.parse(amountFromBudgetController.text) < double.parse(totalAmountVisa) && int.parse(amountFromBudgetController.text) > 10) { //get new driver details isNewTransfer = true; update(); var res = await CRUD().get( link: AppLink.getDriverDetails, payload: {'driver_phone': '+2${newDriverPhoneController.text}'}); isNewTransfer = false; update(); if (res != 'failure') { var d = jsonDecode(res); amountToNewDriverMap = d['data']; // update(); } else { mySnackeBarError("This driver is not registered".tr); } } else { mySnackeBarError('Your Budget less than needed'.tr); } } } String paymentToken = ''; Future generateToken(String amount) async { var res = await CRUD().postWallet(link: AppLink.addPaymentTokenDriver, payload: { 'driverID': box.read(BoxName.driverID).toString(), 'amount': amount.toString(), }); var d = (res); return d['message']; } // late String paymentID; Future getPaymentId(String paymentMethod, amount) async { // paymentToken = await generateToken(amount); var res = await CRUD().postWallet(link: AppLink.addDriverPaymentPoints, payload: { 'driverID': box.read(BoxName.driverID).toString(), 'amount': amount.toString(), 'payment_method': paymentMethod.toString(), }); var d = (res); // paymentID = d['message'].toString(); return d['message']; } Future addDriverWallet(String paymentMethod, point, count) async { paymentToken = await generateToken(count); var paymentID = await getPaymentId(paymentMethod, point.toString()); await CRUD().postWallet(link: AppLink.addDriversWalletPoints, payload: { 'driverID': box.read(BoxName.driverID).toString(), 'paymentID': paymentID.toString(), 'amount': point, 'token': paymentToken, 'paymentMethod': paymentMethod.toString(), }); } Future addDriverPayment(String paymentMethod, point, wayPay) async { paymentToken = await generateToken(point); var paymentID = await getPaymentId(paymentMethod, point.toString()); await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { 'amount': point.toString(), 'rideId': paymentID.toString(), 'payment_method': paymentMethod, 'passengerID': wayPay, 'token': paymentToken, 'driverID': box.read(BoxName.driverID).toString(), }); } Future addDriverWalletFromPromo(String paymentMethod, point) async { var resPromotion = await CRUD().postWallet(link: AppLink.addpromotionDriver, payload: { 'driver_id': box.read(BoxName.driverID).toString(), 'payment_amount': point, 'timePromo': paymentMethod, }); if (resPromotion != 'failure') { paymentToken = await generateToken(point); var paymentID = await getPaymentId(paymentMethod, point.toString()); var res = await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { 'amount': point, 'rideId': paymentID.toString(), 'payment_method': paymentMethod.toString(), 'passengerID': paymentMethod, 'token': paymentToken, 'driverID': box.read(BoxName.driverID).toString(), }); if (res != 'failure') { String title = 'wallet_updated'.tr; // Notification title String message = '${'wallet_credited_message'.tr} $point'; String tone = 'default_tone'.tr; // Notification tone or sound String payLoad = 'wallet_updated'; // Additional data payload for the notification Get.find() .showNotification(title, message, tone, payLoad); } } else { Get.back(); mySnackeBarError( "A promotion record for this driver already exists for today.".tr); } } Future addDriverWalletToInvitor(String paymentMethod, driverID, point) async { paymentToken = await generateToken(point); var paymentID = await getPaymentId(paymentMethod, point.toString()); await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { 'driverID': driverID, 'amount': point, 'token': paymentToken, 'rideId': paymentID.toString(), 'payment_method': paymentMethod.toString(), 'passengerID': paymentMethod, }); await addTripzWallet(paymentMethod, (double.parse(point) * -2).toString()); // deduct 2 from Tripz wallet } Future addTripzWallet(String paymentMethod, String point) async { var TripzToken = await generateToken(point.toString()); await CRUD().postWallet(link: AppLink.addTripzWallet, payload: { 'amount': point.toString(), 'paymentMethod': paymentMethod, 'passengerId': 'driver', 'token': TripzToken, 'driverId': box.read(BoxName.driverID).toString(), }); } Future addTransferDriversWallet(String paymentMethod1, paymentMethod2) async { var paymentID = await getPaymentId(paymentMethod1, amountFromBudgetController.text); paymentToken = await generateToken( (int.parse(amountFromBudgetController.text) * -1).toString()); await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { 'amount': (int.parse(amountFromBudgetController.text) * -1).toString(), 'rideId': paymentID.toString(), 'payment_method': paymentMethod1, 'passengerID': 'To ${amountToNewDriverMap[0]['id']}', 'token': paymentToken, 'driverID': box.read(BoxName.driverID).toString(), }); paymentID = await getPaymentId(paymentMethod2, (int.parse(amountFromBudgetController.text) - 5).toString()); paymentToken = await generateToken(amountFromBudgetController.text); var res1 = await CRUD().postWallet(link: AppLink.addDriversWalletPoints, payload: { 'driverID': amountToNewDriverMap[0]['id'].toString(), 'paymentID': paymentID.toString(), 'amount': ((int.parse(amountFromBudgetController.text) - 5)) // kazan) // double.parse(kazan) .08 for egypt .toStringAsFixed( 0), // this will convert buddget to poitns by kazan .08 'token': paymentToken, 'paymentMethod': paymentMethod2.toString(), }); if (res1 != 'failure') { NotificationService.sendNotification( target: amountToNewDriverMap[0]['token'].toString(), title: 'Transfer'.tr, body: '${'You have transfer to your wallet from'.tr}' '${box.read(BoxName.nameDriver)}', isTopic: false, // Important: this is a token tone: 'ding', driverList: [], category: 'Transfer', ); await addTripzWallet('payout fee', '5'); Get.defaultDialog( title: 'transfer Successful'.tr, middleText: '', titleStyle: AppStyle.title, confirm: MyElevatedButton( title: 'Ok'.tr, onPressed: () async { Get.back(); Get.back(); await refreshCaptainWallet(); })); } } //check if account bank is created or not Future checkAccountCaptainBank() async { isLoading = true; update(); if (box.read(BoxName.accountIdStripeConnect).toString().isEmpty) { var res = await CRUD().get(link: AppLink.getAccount, payload: { 'id': box.read(BoxName.driverID).toString(), }); var d = jsonDecode(res); if (d['status'] != 'failure') { box.write(BoxName.accountIdStripeConnect, d['message'][0]['accountBank'].toString()); } } isLoading = false; update(); } @override void onInit() async { await refreshCaptainWallet(); super.onInit(); } }