import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; import 'package:rasadyar_chicken/presentation/pages/steward/root/logic.dart'; import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; class SegmentationLogic extends GetxController { StewardRootLogic rootLogic = Get.find(); RxBool isLoadingMoreAllocationsMade = false.obs; RxInt currentPage = 1.obs; late List routesName; RxInt selectedSegmentIndex = 0.obs; RxBool isExpanded = false.obs; RxInt expandedListIndex = (-1).obs; Rx fromDateFilter = Jalali.now().obs; Rx toDateFilter = Jalali.now().obs; RxnString searchedValue = RxnString(); RxInt segmentType = 1.obs; RxInt saleType = 2.obs; RxInt quotaType = 1.obs; GlobalKey formKey = GlobalKey(); TextEditingController weightController = TextEditingController(text: '0'); RxBool isSubmitButtonEnabled = false.obs; Rxn selectedGuildModel = Rxn(); Rxn selectedProduct = Rxn(); Rxn selectedSegment = Rxn(); Rx>> segmentationList = Resource>.loading().obs; RxList guildsModel = [].obs; Rxn productionData = Rxn(); Rx saleDate = Jalali.now().obs; @override void onInit() { super.onInit(); routesName = ['قطعه‌بندی'].toList(); once(rootLogic.rolesProductsModel, (callback) => selectedProduct.value = callback.first); getAllSegmentation(); getGuilds(); } @override void onReady() { super.onReady(); setUpListener(); } @override void onClose() { // TODO: implement onClose super.onClose(); } void setSearchValue(String? value) { searchedValue.value = value?.trim(); } void setUpListener() { debounce( searchedValue, (callback) => getAllSegmentation(), time: Duration(milliseconds: timeDebounce), ); ever(selectedSegment, (_) { validateForm(); }); weightController.addListener(() => validateForm()); } void setEditData(SegmentationModel item) { selectedSegment.value = item; weightController.text = item.weight.toString(); } void clearForm() { weightController.text = '0'; selectedSegment.value = null; selectedGuildModel.value = null; productionData.value = null; segmentType.value = 1; saleType.value = 1; quotaType.value = 1; } void validateForm() { var weight = int.tryParse(weightController.text.trim().clearComma); isSubmitButtonEnabled.value = selectedProduct.value != null && weightController.text.isNotEmpty && weight! > 0 && (segmentType.value == 1 || (segmentType.value == 2 && selectedGuildModel.value != null)); } Future getAllSegmentation([bool isLoadingMore = false]) async { if (isLoadingMore) { isLoadingMoreAllocationsMade.value = true; } else { segmentationList.value = Resource>.loading(); } if (searchedValue.value != null && searchedValue.value!.trim().isNotEmpty && currentPage.value > 1) { currentPage.value = 1; // Reset to first page if search value is set } await safeCall( showError: true, showSuccess: true, call: () async => await rootLogic.chickenRepository.getSegmentation( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( pageSize: 20, page: currentPage.value, search: 'filter', role: 'Steward', value: searchedValue.value, fromDate: fromDateFilter.value.toDateTime(), toDate: toDateFilter.value.toDateTime(), ), ), onSuccess: (result) { if ((result?.count ?? 0) == 0) { segmentationList.value = Resource>.empty(); } else { segmentationList.value = Resource>.success( PaginationModel( count: result?.count ?? 0, next: result?.next, previous: result?.previous, results: [ ...(segmentationList.value.data?.results ?? []), ...(result?.results ?? []), ], ), ); isLoadingMoreAllocationsMade.value = false; } }, ); } Future deleteSegmentation(String key) async { await safeCall( showError: true, showSuccess: true, call: () => rootLogic.chickenRepository.deleteSegmentation( token: rootLogic.tokenService.accessToken.value!, key: key, ), ); } Future editSegment() async { var res = true; safeCall( showError: true, call: () async => await rootLogic.chickenRepository.editSegmentation( token: rootLogic.tokenService.accessToken.value!, model: SegmentationModel( key: selectedSegment.value?.key, weight: int.tryParse(weightController.text.clearComma) ?? 0, productionDate: productionData.value?.toDateTime().formattedDashedGregorian, ), ), onSuccess: (result) { res = true; onRefresh(); }, onError: (error, stacktrace) { res = false; }, ); return res; } Future createSegment() async { var res = true; SegmentationModel segmentationModel = SegmentationModel( productKey: selectedProduct.value?.key, weight: int.tryParse(weightController.text.clearComma) ?? 0, saleType: saleType.value == 1 ? 'governmental' : 'free', quota: quotaType.value == 1 ? 'governmental' : 'free', ); if (segmentType.value == 2) { segmentationModel = segmentationModel.copyWith(guildKey: selectedGuildModel.value?.key); } if (productionData.value != null) { segmentationModel = segmentationModel.copyWith( productionDate: productionData.value?.toDateTime().formattedDashedGregorian, ); } await safeCall( showError: true, showSuccess: true, call: () async => await rootLogic.chickenRepository.createSegmentation( token: rootLogic.tokenService.accessToken.value!, model: segmentationModel, ), onSuccess: (result) { res = true; isSubmitButtonEnabled.value = true; onRefresh(); }, onError: (error, stacktrace) { res = false; }, ); return res; } Future getGuilds() async { safeCall( call: () async => await rootLogic.chickenRepository.getGuilds( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams(queryParams: {'all': true}, role: 'Steward'), ), onSuccess: (result) { if (result != null) { guildsModel.clear(); guildsModel.addAll(result); } }, onError: (error, stacktrace) {}, ); } Future onRefresh() async { toggleExpansion(); currentPage.value = 1; await rootLogic.onRefresh(); await getAllSegmentation(); } void toggleExpansion({int? index}) { if (expandedListIndex.value == index || index == null) { expandedListIndex.value = -1; } else { expandedListIndex.value = index; } } }