import 'package:Intaleq/constant/links.dart'; import 'package:Intaleq/views/home/map_page_passenger.dart'; import 'package:get/get.dart'; import '../../../constant/box_name.dart'; import '../../../main.dart'; import '../../../print.dart'; import '../../views/auth/otp_page.dart'; import '../../views/widgets/error_snakbar.dart'; import '../functions/crud.dart'; import '../functions/package_info.dart'; import 'login_controller.dart'; // --- Helper Class for Phone Authentication --- class PhoneAuthHelper { // Define your server URLs static final String _baseUrl = '${AppLink.server}/auth/syria/'; static final String _sendOtpUrl = '${_baseUrl}sendWhatsOpt.php'; static final String _verifyOtpUrl = '${_baseUrl}verifyOtp.php'; static final String _registerUrl = '${_baseUrl}register_passenger.php'; static String formatSyrianPhone(String phone) { // Remove spaces, symbols, +, -, () phone = phone.replaceAll(RegExp(r'[ \-\(\)\+]'), '').trim(); // Normalize 00963 → 963 if (phone.startsWith('00963')) { phone = phone.replaceFirst('00963', '963'); } // Normalize 0963 → 963 if (phone.startsWith('0963')) { phone = phone.replaceFirst('0963', '963'); } // NEW: Fix 96309xxxx → 9639xxxx if (phone.startsWith('96309')) { phone = '9639' + phone.substring(5); // remove the "0" after 963 } // If starts with 9630 → correct to 9639 if (phone.startsWith('9630')) { phone = '9639' + phone.substring(4); } // If already in correct format: 9639xxxxxxxx if (phone.startsWith('9639') && phone.length == 12) { return phone; } // If starts with 963 but missing the 9 if (phone.startsWith('963') && phone.length > 3) { // Ensure it begins with 9639 if (!phone.startsWith('9639')) { phone = '9639' + phone.substring(3); } return phone; } // If starts with 09xxxxxxxx → 9639xxxxxxxx if (phone.startsWith('09')) { return '963' + phone.substring(1); } // If 9xxxxxxxx (9 digits) if (phone.startsWith('9') && phone.length == 9) { return '963' + phone; } // If starts with incorrect 0xxxxxxx → assume Syrian and fix if (phone.startsWith('0') && phone.length == 10) { return '963' + phone.substring(1); } return phone; } /// Sends an OTP to the provided phone number. static Future sendOtp(String phoneNumber) async { try { // إصلاح الرقم قبل الإرسال final fixedPhone = formatSyrianPhone(phoneNumber); final response = await CRUD().post( link: _sendOtpUrl, payload: {'receiver': fixedPhone}, // ← ← استخدام الرقم المُعدّل ); if (response != 'failure') { final data = response; if (data['status'] == 'success') { mySnackbarSuccess('An OTP has been sent to your number.'.tr); return true; } else { mySnackeBarError(data['message'] ?? 'Failed to send OTP.'); return false; } } else { mySnackeBarError('Server error. Please try again.'.tr); return false; } } catch (e) { return false; } } /// Verifies the OTP and logs the user in. static Future verifyOtp(String phoneNumber) async { try { final fixedPhone = formatSyrianPhone(phoneNumber); final response = await CRUD().post( link: _verifyOtpUrl, payload: { 'phone_number': fixedPhone, }, ); if (response != 'failure') { final data = (response); // Log.print('data: ${data}'); if (data['status'] == 'success') { final isRegistered = data['message']['isRegistered'] ?? false; // Log.print('isRegistered: ${isRegistered}'); if (isRegistered) { // ✅ المستخدم موجود مسبقاً -> تسجيل دخول مباشر await _handleSuccessfulLogin(data['message']['passenger']); } else { // ✅ مستخدم جديد -> الذهاب لصفحة التسجيل mySnackbarSuccess( 'Phone verified. Please complete registration.'.tr); Get.to(() => RegistrationScreen(phoneNumber: phoneNumber)); } } else { mySnackeBarError(data['message']); } } else { mySnackeBarError('Server error. Please try again.'.tr); } } catch (e) { mySnackeBarError('An error occurred: $e'); } } static Future _addTokens() async { String fingerPrint = await DeviceHelper.getDeviceFingerprint(); await CRUD() .post(link: "${AppLink.server}/ride/firebase/add.php", payload: { 'token': (box.read(BoxName.tokenFCM.toString())), 'passengerID': box.read(BoxName.passengerID).toString(), "fingerPrint": fingerPrint }); await CRUD() .post(link: "${AppLink.paymentServer}/ride/firebase/add.php", payload: { 'token': (box.read(BoxName.tokenFCM.toString())), 'passengerID': box.read(BoxName.passengerID).toString(), "fingerPrint": fingerPrint }); } static Future registerUser({ required String phoneNumber, required String firstName, required String lastName, String? email, }) async { try { final response = await CRUD().post( link: _registerUrl, payload: { 'phone_number': phoneNumber, 'first_name': firstName, 'last_name': lastName, 'email': email ?? '', // Send empty string if null }, ); final data = (response); if (data != 'failure') { // Registration successful, log user in await _handleSuccessfulLogin(data['message']['data']); } else { mySnackeBarError( "User with this phone number or email already exists.".tr); } } catch (e) { Log.print('e: ${e}'); mySnackeBarError('An error occurred: $e'); } } static Future _handleSuccessfulLogin( Map userData) async { mySnackbarSuccess('Welcome, ${userData['first_name']}!'); // Save user data to local storage (Hive box) using new keys box.write(BoxName.passengerID, userData['id']); box.write(BoxName.name, userData['first_name']); box.write(BoxName.lastName, userData['last_name']); box.write(BoxName.email, userData['email']); box.write(BoxName.phone, userData['phone']); box.write(BoxName.isVerified, '1'); await _addTokens(); await Get.put(LoginController()).loginUsingCredentials( box.read(BoxName.passengerID).toString(), box.read(BoxName.email).toString(), ); // Navigate to home } }