ProductsUserControlModel.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using Microsoft.EntityFrameworkCore;
  2. using OOO_WriteAndClear.DBModels;
  3. using OOO_WriteAndClear.MVP.MVPInterfaces;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.DirectoryServices;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.RegularExpressions;
  10. using System.Threading.Tasks;
  11. namespace OOO_WriteAndClear.MVP.Models.ProductsUserControlModel
  12. {
  13. public class ProductsUserControlModel : IProductsUserControlContract.IModel
  14. {
  15. public ProductsUserControlModel()
  16. {
  17. _products = new List<Product>();
  18. _immutableProducts = new List<Product>();
  19. _orderFormerer = new OrderFormerer.OrderFormerer();
  20. }
  21. #region Реализация IProductsUserControlContract.IModel
  22. public ICollection<Product> Products => _products;
  23. public int GetAllProductsCount() => _immutableProducts.Count;
  24. public void FilterSearchSortProducts(FilterSearchSortParameters parameters)
  25. {
  26. _products = SortProductsCollection(parameters.SortDirection, SearchByProductName(parameters.SearchQuerry, FilterByDiscount(parameters.FilterBy, _immutableProducts)));
  27. }
  28. public async Task UpdateProductsList(FilterSearchSortParameters parameters)
  29. {
  30. using (VorobiewTradeContext db = new VorobiewTradeContext())
  31. _immutableProducts = await db.Products.Include(a => a.ProductManufacturer).ToListAsync();
  32. FilterSearchSortProducts(parameters);
  33. }
  34. public void AddProductIntoOrder(Product product, Action<Order> CallbackIfAddedInOrder)
  35. {
  36. bool isAdded = _orderFormerer.AddProductIntoOrder(product);
  37. if (!isAdded) return;
  38. CallbackIfAddedInOrder?.Invoke(_orderFormerer.Order);
  39. }
  40. public void RemoveProductFromOrder(Product product, Action<Order> CallBackIfProductRemovedInOrder)
  41. {
  42. bool isRemoved = _orderFormerer.RemoveProductFromOrder(product);
  43. if (!isRemoved) return;
  44. CallBackIfProductRemovedInOrder?.Invoke(_orderFormerer.Order);
  45. }
  46. public OrderFormerer.OrderFormerer GetCurrentOrderFormerer()
  47. => _orderFormerer;
  48. #endregion
  49. private ICollection<Product> _products;
  50. private ICollection<Product> _immutableProducts;
  51. private OrderFormerer.OrderFormerer _orderFormerer;
  52. public ICollection<Product> SortProductsCollection(SortDirection sortDirection, ICollection<Product> products)
  53. {
  54. switch (sortDirection)
  55. {
  56. case SortDirection.Ascending:
  57. return products.OrderBy(a => a.CurrentPrice).ToList();
  58. case SortDirection.Descending:
  59. return products.OrderByDescending(a => a.CurrentPrice).ToList();
  60. default: return products;
  61. }
  62. }
  63. private ICollection<Product> FilterByDiscount(FilterByDiscountParameters discountParameters
  64. , ICollection<Product> unfilteredCollection)
  65. {
  66. List<Product> filtredProducts = new List<Product>();
  67. filtredProducts.AddRange(unfilteredCollection.Where
  68. (product =>
  69. decimal.ToDouble((product.ProductDiscountMax is null)? 0m : (decimal)product.ProductDiscountMax)
  70. >= discountParameters.From
  71. && decimal.ToDouble((product.ProductDiscountMax is null) ? 0m : (decimal)product.ProductDiscountMax)
  72. <= discountParameters.Before));
  73. return filtredProducts;
  74. }
  75. private ICollection<Product> SearchByProductName(string query, ICollection<Product> unfilteredCollection)
  76. {
  77. List<Product> filtredProducts = new List<Product>();
  78. filtredProducts.AddRange(unfilteredCollection.Where(product => Regex.IsMatch(product.ProductName, query)));
  79. return filtredProducts;
  80. }
  81. }
  82. }