import 'dart:convert'; import 'dart:developer'; import 'dart:io'; import 'package:http/http.dart' as http; import 'package:wanisdriver/config/constants/app_constant.dart'; import '../config/api_response.dart'; class SignUpDriverService { int statusCode = -1; Future verifyphonenumber(String phonenumber,String otp) async { // Create request headers final Map headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', }; print('*-*-*-*-*-*--------------------------------$phonenumber'); // Create URI final uri = Uri.https(url, '/api/v1/public/verify-otp',{ 'phoneNumber': phonenumber, 'otp': otp, },); try { // Send PATCH request final response = await http.post( uri, headers: headers, ); // Handle response if (response.statusCode == 200 || response.statusCode == 201) { log("Update profile response: ${response.body}"); return APIResponse( statusCode: response.statusCode, data: true, ); } else { log("Error: ${response.statusCode}"); return APIResponse( statusCode: response.statusCode, data: false, errorMessage: 'Please check your info', ); } } catch (e) { log("Exception: $e"); return APIResponse( statusCode: 500, data: false, errorMessage: 'An unexpected error occurred', ); } } Future phoneSignUP(String inPhoneNumber) async { try { final uri = Uri.https( url, '/api/v1/public/send-otp', {'phoneNumber': inPhoneNumber,}, ); final response = await http.post( uri, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, ); if (response.statusCode == 200 || response.statusCode == 201) { return APIResponse(statusCode: response.statusCode, data: response); } else { return APIResponse( statusCode: response.statusCode, errorMessage: 'Please check your info', ); } } catch (e, stackTrace) { log("Error: $e"); log("StackTrace: $stackTrace"); return APIResponse( statusCode: 500, errorMessage: 'No internet connection', ); } } Future signUpDriver({ required Map textFields, required Map fileFields, required List taxPictures, }) async { final uri = Uri.https(url, '/api/v1/auth/signup-driver'); final request = http.MultipartRequest('POST', uri); request.headers.addAll({ 'Accept': 'application/json', }); // Add headers to match Postman // request.headers.addAll({ // 'Content-type': 'application/json', // 'Accept': 'application/json', // }); // Add all text fields (taxiAllowedItems is already handled as comma-separated string) request.fields.addAll(textFields); // Add single file fields with exact field names from Postman for (final entry in fileFields.entries) { final file = entry.value; if (file != null) { request.files.add(await http.MultipartFile.fromPath(entry.key, file.path)); } } // Add multiple taxPicture files (same field name 'taxPicture' for all) for (int i = 0; i < taxPictures.length; i++) { final file = taxPictures[i]; if (file != null && file.existsSync()) { try { request.files.add(await http.MultipartFile.fromPath('taxPicture', file.path)); print('✅ Added taxPicture $i: ${file.path}'); } catch (e) { print('❌ Error adding tax picture $i: $e'); } } } // Debug info print('=== Request Debug Info ==='); print('URI: $uri'); print('Headers: ${request.headers}'); print('Form Fields: ${request.fields}'); print('Files: ${request.files.map((f) => '${f.field}: ${f.filename}').toList()}'); print('==========================='); try { final streamedResponse = await request.send().timeout( const Duration(seconds: 30), onTimeout: () { throw Exception('Request timeout'); }, ); final response = await http.Response.fromStream(streamedResponse); print('=== Response ==='); print('Status: ${response.statusCode}'); print('Headers: ${response.headers}'); print('Body: ${response.body}'); print('==============='); return response; } catch (e) { print('❌ Network error: $e'); rethrow; } } Future> validateResetPasswordOTP( String inPhone, String inOTPCode, ) async { log("phonenumber validateResetPasswordOTP $inPhone"); log("inOTPCode validateResetPasswordOTP $inOTPCode"); try { final uri = Uri.https( url, 'api/auth_otp/validate_reset_code_second_step', { "phonenumber": inPhone, "reset_code": inOTPCode, }, ); final response = await http.post( uri, headers: { 'Content-type': 'application/json', 'Accept': 'application/json' }, ); statusCode = response.statusCode; log("Status code: $statusCode"); if (statusCode == 200) { final jsonData = json.decode(response.body); log("Verification result: \n $jsonData"); return APIResponse(statusCode: statusCode, data: jsonData); } return APIResponse( statusCode: statusCode, errorMessage: 'Invalid reset code or phone number', ); } catch (e, stack) { log("Error: $e\n$stack"); return APIResponse(statusCode: statusCode); } } Future resetPassword(String newPassword, String phonenumber, String code) async { try { final response = await http.post( Uri.https( url, '/api/auth_otp/change_password_final_step', { 'newPassword': newPassword, 'code': code, 'phonenumber': phonenumber, }, ), headers: { 'Accept': 'application/json', }, ); log("response : ${response.body}"); if (response.statusCode == 200 || response.statusCode == 201) { return APIResponse( statusCode: response.statusCode, data: response.body, ); } else { return APIResponse( statusCode: response.statusCode, errorMessage: response.body.isNotEmpty ? response.body : 'Please check your info', ); } } catch (e, stackTrace) { log("Error: $e"); log("StackTrace: $stackTrace"); return APIResponse( statusCode: 500, errorMessage: 'No internet connection', ); } } }