import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:intl/intl.dart'; import 'package:muaawana/models/Promo_code_model.dart'; import 'package:muaawana/models/map/address/AddressResult.dart'; import '../services/service_request_service.dart'; import '../utils/connection.dart'; import '../utils/date_time_utils.dart'; import '../utils/image_picker.dart'; enum Priority { HIGH, MEDIUM, LOW } class ServiceDetailsProvider with ChangeNotifier { ServiceRequestService get service => GetIt.I(); ServiceDetailsProvider(this._selectedRadio); bool loading = false; bool loadingPlaceOrder = false; File? _image; File? get image => _image; int _selectedRadio; bool _isProduct = true; String dateString = ""; String _timeString = ""; Priority priority = Priority.LOW; int priorityInt = 0; String locationString = ""; String commentString = ""; DateTime _pickedDate = DateTime.now(); DateTime _pickedDateTime = DateTime.now(); DateTime _pickedTime = DateTime.now(); String _description = 'Description...'; String _payMethod = 'CASH'; String _phoneNumber = ''; int _quantity = 1; int _serviceId = 0; AddressResult? addressPicked; int serviceProductId = 0; bool? _isTimeAvailable; bool? get isTimeAvailable => _isTimeAvailable; int get serviceId => _serviceId; String get description => _description; String get paymentMethod => _payMethod; int get selectedRadio => _selectedRadio; int get quantity => _quantity; bool get isProduct => _isProduct; DateTime get dateIsPicked => _pickedDateTime; String get phoneNumber => _phoneNumber; init() { _image = null; priorityInt = 0; _pickedDate = DateTime.now(); _pickedDateTime = DateTime.now(); _pickedTime = DateTime.now(); _description = 'description'; _serviceId = 0; _quantity = 0; dateString = Dates.convertDateTimeToDate(DateTime.now()); } setServiceProduct(int id) { serviceProductId = id; } setQuantity(int q) { _quantity = q; } setPayment(String method) { _payMethod = method; } setPhoneNumber(String phoneNumber) { _phoneNumber = phoneNumber; setLoadingPlaceOrder(false); ChangeNotifier(); } void setSelectedRadio(int val) { val == 1 ? _isProduct = true : _isProduct = false; _selectedRadio = val; notifyListeners(); } setDate(DateTime datePicked) { _pickedDate = datePicked; setDateTime(); notifyListeners(); print(_pickedDate); textDateShow(); } setTime(DateTime time) { //_pickedDate.hour= _pickedTime = time; setDateTime(); _timeString = Dates.convertDateTimeToTime(time); notifyListeners(); //print(_timeString); } textDateShow() { dateString = Dates.convertDateTimeToDate(dateIsPicked); notifyListeners(); } setDateTime() { _pickedDateTime = DateTime(_pickedDate.year, _pickedDate.month, _pickedDate.day, _pickedTime.hour, _pickedTime.minute); notifyListeners(); } /// `true`/`false` when the server answered, `null` when availability could /// not be determined. `null` must not be shown to the user as "reserved". Future checkTime() async { try { _isTimeAvailable = await service.checkTimeAvailability( _timeString, dateString, ); } catch (e) { log('errrrorr time $e'); _isTimeAvailable = null; } log('isTimeAvailable : $_isTimeAvailable'); return _isTimeAvailable; } setComment(String desc) { _description = desc; setLoadingPlaceOrder(true); notifyListeners(); } setLoadingPlaceOrder(bool desc) { loadingPlaceOrder = desc; } setData( int serviceId, AddressResult address, ) { _serviceId = serviceId; addressPicked = address; notifyListeners(); } setPriority(int value) { //print(value); priorityInt = value; switch (value) { case 3: priority = Priority.LOW; notifyListeners(); break; case 2: priority = Priority.MEDIUM; notifyListeners(); break; case 1: priority = Priority.HIGH; notifyListeners(); //print(priority.name); break; default: priority = Priority.LOW; notifyListeners(); break; } } bool validateCodeLoading = false; bool validatePromoCode(PromoCodeModel promoCode) { final currentTime = DateTime.now().millisecondsSinceEpoch; return currentTime >= promoCode.soldStartDate! && currentTime <= promoCode.soldEndDate!; } bool? isCodeValid; PromoCodeModel? promoCode; disposePromo() { isCodeValid = null; promoCode = null; } getPromoCode( String code, ) async { if (await Connection.checkConnection()) { validateCodeLoading = true; notifyListeners(); try { final result = await service.getCodePromo(code); if ((result.statusCode == 200 || result.statusCode == 201) && result.data != null) { log("here ------->1"); isCodeValid = validatePromoCode(result.data!); if (isCodeValid!) { promoCode = result.data!; } log(isCodeValid.toString()); validateCodeLoading = false; notifyListeners(); } else { log("here ------->2"); isCodeValid = false; validateCodeLoading = false; notifyListeners(); } } catch (e, stack) { isCodeValid = false; log(e.toString()); log(stack.toString()); validateCodeLoading = false; notifyListeners(); } } else { isCodeValid = false; log("No internet connection."); validateCodeLoading = false; notifyListeners(); } } // Future pickPicture(String source,context) async { // final imagePicker = ImagePick(); // final image = await imagePicker.pick(source); // log("image $image"); // if (image != null) { // log("image ========================= $image"); // _image = image; // notifyListeners(); // Navigator.pop(context); // // await _imageUploadService.uploadServiceRequestPicture(image); // } // } Future pickPicture(String source,context) async { final imagePicker = ImagePick(); final image = await imagePicker.pick(source,context); log("image $image"); if (image != null) { _image = image; notifyListeners(); } } sendServiceRequest() async { if (await Connection.checkConnection()) { log("upload!!!! 1"); loading = true; notifyListeners(); try { List listImage = []; if (_image != null) { listImage.add(_image!); } final result = await service.sendServiceRequest( listImage, 1, DateFormat('E, dd MMM yyyy HH:mm:ss \'GMT\'') .format(_pickedDateTime), _description, priority.name, serviceProductId == 0 ? null : serviceProductId, 30, serviceId, serviceProductId == 0 ? false : true, addressPicked!.formattedAddress!, addressPicked!.geometry!.location!.lat!, addressPicked!.geometry!.location!.lng!, promoCode != null ? promoCode!.id : null, _payMethod, _quantity, _phoneNumber); log("upload!!!! 2"); if ((result.statusCode == 200 || result.statusCode == 201) && result.data != null) { log("upload!!!! 3"); log(result.statusCode.toString()); notifyListeners(); } else { log("upload!!!! 4"); log(result.statusCode.toString()); if (result.statusCode == 409) { log("upload!!!! 5"); loading = false; notifyListeners(); } if (result.statusCode == 400 || result.statusCode == 402 || result.statusCode == 403) { log("upload!!!! 6"); loading = false; notifyListeners(); } if (result.statusCode == 401) { log("upload!!!! 7"); loading = false; notifyListeners(); } if (result.statusCode! >= 500) { log("upload!!!! 8"); loading = false; notifyListeners(); } } loading = false; notifyListeners(); } catch (e, stacktrace) { log(stacktrace.toString()); log("upload!!!!9"); loading = false; notifyListeners(); } } else { log("upload!!!! 10"); loading = false; notifyListeners(); } } updateServiceRequest(int requestId) async { if (await Connection.checkConnection()) { log("upload!!!! 1"); loading = true; notifyListeners(); try { List listImage = []; if (_image != null) { listImage.add(_image!); } final result = await service.updateServiceRequest( requestId, listImage, 1, DateFormat('E, dd MMM yyyy HH:mm:ss \'GMT\'') .format(_pickedDateTime), _description, priority.name, serviceProductId == 0 ? null : serviceProductId, 30, serviceId, serviceProductId == 0 ? false : true, addressPicked!.formattedAddress!, addressPicked!.geometry!.location!.lat!, addressPicked!.geometry!.location!.lng!, promoCode != null ? promoCode!.id : null, _payMethod, _quantity, _phoneNumber); log("upload!!!! 2"); if ((result.statusCode == 200 || result.statusCode == 201) && result.data != null) { log("upload!!!! 3"); log(result.statusCode.toString()); notifyListeners(); } else { log("upload!!!! 4"); log(result.statusCode.toString()); if (result.statusCode == 409) { log("upload!!!! 5"); loading = false; notifyListeners(); } if (result.statusCode == 400 || result.statusCode == 402 || result.statusCode == 403) { log("upload!!!! 6"); loading = false; notifyListeners(); } if (result.statusCode == 401) { log("upload!!!! 7"); loading = false; notifyListeners(); } if (result.statusCode! >= 500) { log("upload!!!! 8"); loading = false; notifyListeners(); } } loading = false; notifyListeners(); } catch (e, stacktrace) { log(stacktrace.toString()); log("upload!!!!9"); loading = false; notifyListeners(); } } else { log("upload!!!! 10"); loading = false; notifyListeners(); } } requestProduct(int productID, AddressResult address) async { if (await Connection.checkConnection()) { //print("upload!!!! 1"); loading = true; notifyListeners(); try { final result = await service.requestProduct( DateFormat('E, dd MMM yyyy HH:mm:ss \'GMT\'') .format(_pickedDateTime), priority.name, productID, 30.0, true, address.formattedAddress!, address.geometry!.location!.lat!, address.geometry!.location!.lng!, _payMethod); //print("upload!!!! 2"); if ((result.statusCode == 200 || result.statusCode == 201) && result.data != null) { //print("upload!!!! 3"); //print(result.statusCode); notifyListeners(); } else { //print("upload!!!! 4"); //print(result.statusCode); if (result.statusCode == 409) { //print("upload!!!! 5"); loading = false; notifyListeners(); } if (result.statusCode == 400 || result.statusCode == 402 || result.statusCode == 403) { //print("upload!!!! 6"); loading = false; notifyListeners(); } if (result.statusCode == 401) { //print("upload!!!! 7"); loading = false; notifyListeners(); } if (result.statusCode! >= 500) { //print("upload!!!! 8"); loading = false; notifyListeners(); } } loading = false; notifyListeners(); } catch (e) { //print(stacktrace); //print("upload!!!!9"); loading = false; notifyListeners(); } } else { //print("upload!!!! 10"); loading = false; notifyListeners(); } } }