using Avalonia.Markup.Xaml.Templates; using demo_trade.Data.RemoteData.Entity; using demo_trade.Data.Repository; using demo_trade.Domain; using demo_trade.Models; using demo_trade.UI.Presenters; using ReactiveUI; using System; using System.Collections.Generic; using System.Linq; using System.Reactive; using System.Reactive.Linq; using System.Text; using System.Threading.Tasks; using Tmds.DBus.Protocol; namespace demo_trade.ViewModels { public class ClientProductViewModel : ViewModelBase, IRoutableViewModel { private GuestProductUseCase _guestProductUseCase; public string? UrlPathSegment => Guid.NewGuid().ToString(); private User _user = new(); private bool _isManager = false; public bool IsManager { get => _isManager; set => this.RaiseAndSetIfChanged(ref _isManager, value); } private Dictionary _productOrder = new(); public Dictionary ProductOrder { get => _productOrder; set => this.RaiseAndSetIfChanged(ref _productOrder, value); } public User AutorizedUser { get => _user; set => this.RaiseAndSetIfChanged(ref _user, value); } private List _productOrderList = new(); public List ProductOrderList { get => _productOrderList; set => this.RaiseAndSetIfChanged(ref _productOrderList, value); } private bool _thereItemsInOrder = false; public bool ThereItemsInOrder { get => _thereItemsInOrder; set => this.RaiseAndSetIfChanged(ref _thereItemsInOrder, value); } private Dictionary _filterValues = new Dictionary() { {0, (0, null)}, {1, (0, 10)}, {2, (10, 15)}, {3, (15, null)} }; public ReactiveCommand AddToOrderCommand { get; } public ReactiveCommand AttachToOrderCommand { get; } public ReactiveCommand AttachToOrderManagerCommand { get; } private int _selectedFilterValue = 0; private int _selectedSortValue = 0; public int SelectedFilterValue { get => _selectedFilterValue; set => this.RaiseAndSetIfChanged(ref _selectedFilterValue, value); } public int SelectedSortValue { get => _selectedSortValue; set => this.RaiseAndSetIfChanged(ref _selectedSortValue, value); } private string _searchWord = string.Empty; public string SearchWord { get => _searchWord; set => this.RaiseAndSetIfChanged(ref _searchWord, value); } private string _statisticText = string.Empty; public string StatisticText { get => _statisticText; set => this.RaiseAndSetIfChanged(ref _statisticText, value); } private List _dataSource = new(); private List _products = new(); public List Products { get => _products; set => this.RaiseAndSetIfChanged(ref _products, value); } public IScreen HostScreen { get; } public ClientProductViewModel(IScreen home, IProductRepository productRepository, User user) { AutorizedUser = user; HostScreen = home; if (AutorizedUser.Userrole == 1 || AutorizedUser.Userrole == 3) IsManager = true; _guestProductUseCase = new GuestProductUseCase(productRepository); _dataSource = _guestProductUseCase.GetProducts(); this.WhenAnyValue(search => search.SearchWord).Subscribe(_ => { DisplayList(); }); this.WhenAnyValue(selectedFilter => selectedFilter.SelectedFilterValue).Subscribe(_ => { DisplayList(); }); this.WhenAnyValue(selectedSort => selectedSort.SelectedSortValue).Subscribe(_ => { DisplayList(); }); DisplayList(); AddToOrderCommand = ReactiveCommand.Create(product => { if (ProductOrder.ContainsKey(product.ArticleNumber)) { var values = ProductOrder[product.ArticleNumber]; ProductOrder[product.ArticleNumber] = (product, values.Item2 + 1); } else { ProductOrder.Add(product.ArticleNumber, (product, 1)); } ThereItemsInOrder = ProductOrder.Keys.Count > 0; }); AttachToOrderManagerCommand = ReactiveCommand.Create( () => { var orderManagerUseCase = new OrderManagerUseCase(new SQLOrderManagerRepository()); HostScreen.Router.Navigate.Execute(new OrderManagerViewModel(HostScreen, orderManagerUseCase)); } ); ShowDialog = new Interaction(); AttachToOrderCommand = ReactiveCommand.CreateFromTask(async () => { var userOrderCase = new OrderClientUseCase(new SQLOrderClientRepository(), new SQLPickupRepository()); var order = new OrderShowDialogViewModel(ProductOrder, userOrderCase, user); var result = await ShowDialog.Handle(order); } ); } public Interaction ShowDialog { get; } private bool FilterByDiscount(short? discount) { if (discount == null) return false; (int leftBound, int? rightBound) = _filterValues[SelectedFilterValue]; if (rightBound == null) return leftBound <= discount; return leftBound <= discount && discount < rightBound; } private void DisplayList() { var temp = _dataSource; if (SelectedFilterValue > 0) { temp = temp.Where(it => FilterByDiscount(it.DiscountAmount)).ToList(); } if (!String.IsNullOrEmpty(SearchWord)) { temp = temp.Where(it => it.Name.Contains(SearchWord, StringComparison.CurrentCultureIgnoreCase)).ToList(); } if (SelectedSortValue == 1) { temp = temp.OrderByDescending(it => it.Cost).ToList(); } else if (SelectedSortValue == 2) { temp = temp.OrderBy(it => it.Cost).ToList(); } this.Products = temp; StatisticText = String.Format("{0} из {1}", temp.Count, _dataSource.Count); } } }