import 'dart:developer'; import 'package:wanisdriver/services/passwordService.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:provider/provider.dart'; import '../config/AppSnackbar.dart'; import '../config/language/language_enum.dart'; import '../models/OTPMessages.dart'; import '../utils/connection.dart'; import 'language_provider.dart'; class PasswordProvider extends ChangeNotifier { final TextEditingController codeController = TextEditingController(); final TextEditingController emailController = TextEditingController(); final TextEditingController passwordController = TextEditingController(); final TextEditingController phoneController = TextEditingController(); bool _loader = false; String _email = ''; String _resetCode = ''; String _password = ''; bool get loader => _loader; @override void dispose() { print('[PasswordProvider] dispose() called.'); codeController.dispose(); emailController.dispose(); passwordController.dispose(); super.dispose(); } void clean() { print('[PasswordProvider] clean() called — resetting all fields.'); _loader = false; _email = ''; _resetCode = ''; _password = ''; emailController.clear(); codeController.clear(); passwordController.clear(); notifyListeners(); } void setEmail(String text) { _email = text; emailController.text = text; print('[PasswordProvider] setEmail() -> $_email'); notifyListeners(); } void setResetCode(String text) { _resetCode = text; codeController.text = text; print('[PasswordProvider] setResetCode() -> $_resetCode'); notifyListeners(); } void setPassword(String text) { _password = text; passwordController.text = text; print('[PasswordProvider] setPassword() -> $_password'); notifyListeners(); } Future changePasswordFinalStep() async { print('[PasswordProvider] changePasswordFinalStep() called.'); _loader = true; notifyListeners(); try { final Map textFields = { 'email': _email.toLowerCase().trim(), 'password': _password, 'reset_code': _resetCode, }; print('[PasswordProvider] Sending data: $textFields'); final response = await PasswordServices().changePasswordFinalStep( queryParams: textFields, ); print('[PasswordProvider] Response: ${response.statusCode} - ${response.body}'); if (response.statusCode == 200 || response.statusCode == 201) { AppSnackbar.showSuccess("SUCCESS", "Password change successfully"); clean(); Get.offNamed('/login'); } else { print("ERROR ${response.statusCode}: ${response.body}"); AppSnackbar.showError("ERROR", response.body); _handleErrorResponse(response); } } catch (e) { print('[PasswordProvider] Exception during changePasswordFinalStep(): $e'); } finally { _loader = false; notifyListeners(); } } Future changePasswordFirstStep() async { print('[PasswordProvider] changePasswordFirstStep() called.'); _loader = true; notifyListeners(); try { final Map textFields = { 'email': _email.toLowerCase().trim(), }; print('[PasswordProvider] Sending data: $textFields'); final response = await PasswordServices().changePasswordFirstStep( queryParams: textFields, ); print('[PasswordProvider] Response: ${response.statusCode} - ${response.body}'); if (response.statusCode == 200 || response.statusCode == 201) { AppSnackbar.showSuccess("SUCCESS", "You will receive a validation code soon"); Get.toNamed('/validateEmailCode'); } else { print("ERROR ${response.statusCode}: ${response.body}"); AppSnackbar.showError("ERROR", response.body); _handleErrorResponse(response); } } catch (e) { print('[PasswordProvider] Exception during changePasswordFirstStep(): $e'); } finally { _loader = false; notifyListeners(); } } Future validateResetCodeSecondStep() async { print('[PasswordProvider] validateResetCodeSecondStep() called.'); _loader = true; notifyListeners(); try { final Map textFields = { 'email': _email.toLowerCase().trim(), 'reset_code': _resetCode, }; print('[PasswordProvider] Sending data: $textFields'); final response = await PasswordServices().validateResetCodeSecondStep( queryParams: textFields, ); print('[PasswordProvider] Response: ${response.statusCode} - ${response.body}'); if (response.statusCode == 200 || response.statusCode == 201) { AppSnackbar.showSuccess("SUCCESS", "Code checked successfully"); Get.toNamed('/changePasswordLastStepScreen'); } else { print("***************************ERROR ${response.statusCode}: ${response.body}"); AppSnackbar.showError("ERROR", response.body); _handleErrorResponse(response); } } catch (e) { print('[PasswordProvider] Exception during validateResetCodeSecondStep(): $e'); } finally { _loader = false; notifyListeners(); } } void _handleErrorResponse(response) { print('[PasswordProvider] Handling error response...'); switch (response.statusCode) { case 400: print('[PasswordProvider] Bad Request - Check your input data format'); break; case 404: print('[PasswordProvider] User not found or endpoint missing'); break; case 500: print('[PasswordProvider] Server error - Please try again later'); break; default: print('[PasswordProvider] Unexpected error: ${response.statusCode}'); } } Future phoneForgetPassword(String phoneNumber) async { log("phoneForgetPassword -- phoneNumber: $phoneNumber"); _loader=true; ChangeNotifier(); if (!await Connection.checkConnection()) { AppSnackbar.showError("Error", 'No Internet Connection'); log("-----> No Internet Connection"); return false; } try { final sendCodeResult = await PasswordServices().phoneForgetPassword(phoneNumber); log("Status Code: ${sendCodeResult.statusCode}"); log("data: ${sendCodeResult.data}"); log("error Message: ${sendCodeResult.errorMessage}"); if (sendCodeResult.statusCode == 200 || sendCodeResult.statusCode == 201) { return true; } else { AppSnackbar.showError("Error",'Error happen when trying to reset password with OTP please try again later'); return false; } } catch (e, stackTrace) { log("Error: $e"); log("StackTrace: $stackTrace"); AppSnackbar.showError("Error", 'Error happen when trying to reset password with OTP please try again later'); return false; } finally { _loader=false; } } }