import 'package:get/get.dart'; import 'package:sefer_driver/controller/auth/captin/login_captin_controller.dart'; import 'package:sefer_driver/controller/functions/crud.dart'; import 'package:sefer_driver/print.dart'; import 'package:sefer_driver/views/widgets/error_snakbar.dart'; import '../../../constant/box_name.dart'; import '../../../constant/links.dart'; import '../../../main.dart'; // تأكد من تعديل هذا المسار لصفحة التسجيل الحالية class PhoneAuthHelper { // --- New Endpoints for Egypt Market --- // تم تحديث المسارات بناءً على طلبك لتعمل مع ملفات الكابتن الجديدة static final String _baseUrl = '${AppLink.server}/auth/captin/'; static final String _sendOtpUrl = '${_baseUrl}sendOtpMessageDriver.php'; static final String _verifyOtpUrl = '${_baseUrl}verifyOtpDriver.php'; /// دالة تنسيق الرقم للسوق المصري والعالمي static String formatPhoneNumber(String phone) { // 1. إزالة المسافات والرموز الزائدة String cleanPhone = phone.replaceAll(RegExp(r'[ \-\(\)]'), '').trim(); // 2. التحقق إذا كان الرقم مصرياً (يبدأ بـ 010, 011, 012, 015 أو +20) // إذا بدأ بـ +20، نتركه كما هو (صيغة دولية صحيحة) if (cleanPhone.startsWith('+20')) { return cleanPhone; } // إذا بدأ بـ 01 (مثل 010xxxx...)، نحذف الصفر ونضيف +20 if (cleanPhone.startsWith('01')) { return '+20${cleanPhone.substring(1)}'; } // إذا بدأ بـ 1 مباشرة (مثل 10xxxx...) وكان الطول 10 أرقام، نضيف +20 if (cleanPhone.startsWith('1') && cleanPhone.length == 10) { return '+20$cleanPhone'; } // 3. للأرقام الدولية الأخرى (غير مصر): // يجب التأكد من وجود علامة + في البداية ليعرف السيرفر أنه رقم دولي (للواتساب) if (!cleanPhone.startsWith('+')) { return '+$cleanPhone'; } return cleanPhone; } /// إرسال الرمز (SMS للمصريين، واتساب للأجانب - يتم التعامل معه في السيرفر) static Future sendOtp(String phoneNumber, {String? email}) async { try { final fixedPhone = formatPhoneNumber(phoneNumber); Log.print('Sending OTP to: $fixedPhone'); // نجهز الإيميل والآيدي الحاليين String currentDriverId = box.read(BoxName.driverID)?.toString() ?? ''; String currentEmail = email ?? box.read(BoxName.emailDriver)?.toString() ?? ''; // إرسال الطلب للسيرفر final response = await CRUD().post( link: _sendOtpUrl, payload: { 'phone_number': fixedPhone, 'driverId': currentDriverId, 'email': currentEmail, }, ); Log.print('Send OTP Response: $response'); if (response != 'failure') { // فك الترميز في حال كان الرد نصاً final data = response; if (data['status'] == 'success') { // ----------------------------------------------------------- // هام جداً: حفظ البيانات التي ولدها السيرفر (ID & Email) // ----------------------------------------------------------- if (data['driverId'] != null && data['driverId'].toString().isNotEmpty) { String newId = data['driverId'].toString(); Log.print("New Driver ID Generated by Server: $newId"); box.write(BoxName.driverID, newId); } if (data['email'] != null && data['email'].toString().isNotEmpty) { String newEmail = data['email'].toString(); Log.print("New Email Generated by Server: $newEmail"); box.write(BoxName.emailDriver, newEmail); } mySnackbarSuccess('Verification code sent successfully'.tr); return true; } else { mySnackeBarError(data['message'] ?? 'Failed to send code'.tr); return false; } } else { mySnackeBarError('Server Error, please try again'.tr); return false; } } catch (e) { Log.print('Error sending OTP: $e'); return false; } } /// التحقق من الرمز المدخل /// ملاحظة هامة: دالة PHP الجديدة للتحقق لا ترجع بيانات السائق، فقط تقول "تم التحقق". /// لذا نحتاج لمنطق إضافي هنا لتسجيل الدخول أو التسجيل. static Future verifyOtp(String phoneNumber, [String? otpCode]) async { try { if (otpCode == null || otpCode.isEmpty) { mySnackeBarError('يرجى إدخال الكود'.tr); return; } final fixedPhone = formatPhoneNumber(phoneNumber); Log.print('Verifying OTP for: $fixedPhone with code: $otpCode'); final response = await CRUD().post( link: _verifyOtpUrl, payload: { 'phone_number': fixedPhone, 'token_code': otpCode, // ملف PHP الجديد يطلب token_code }, ); if (response != 'failure') { final data = response; if (data['status'] == 'success') { // 1. التحقق تم بنجاح في قاعدة بيانات الهاتف // بما أن ملف verifyOtpDriver.php الجديد لا يرجع بيانات السائق، // يجب علينا الآن محاولة تسجيل الدخول بهذا الرقم لمعرفة هل هو مسجل أم لا. box.write(BoxName.firstTimeLoadKey, 'true'); box.write(BoxName.phoneDriver, fixedPhone); var driverId = box.read(BoxName.driverID); Log.print('driverId: ${driverId}'); var email = box.read(BoxName.emailDriver); Log.print('email: ${email}'); await Get.put(LoginDriverController()).loginWithGoogleCredential( driverId, email, ); } else { mySnackeBarError(data['message'] ?? 'كود التحقق غير صحيح'.tr); } } else { mySnackeBarError('خطأ في الاتصال بالسيرفر'.tr); } } catch (e) { mySnackeBarError('حدث خطأ: $e'); } } /// دالة مساعدة لمحاولة تسجيل الدخول أو التوجيه للتسجيل /// هذه الدالة ضرورية لأن ملف التحقق الجديد فصل عملية التحقق عن جلب البيانات static Future _checkUserAndLogin() async {} }