using AbstractLawFirmContracts.BindingModels; using AbstractLawFirmContracts.SearchModels; using AbstractLawFirmContracts.StoragesContracts; using AbstractLawFirmContracts.ViewModels; using AbstractLawFirmDataModels.Models; using AbstractLawFirmFileImplement.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractLawFirmFileImplement.Implements { public class ShopStorage : IShopStorage { private readonly DataFileSingleton source; public ShopStorage() { source = DataFileSingleton.GetInstance(); } public ShopViewModel? GetElement(ShopSearchModel model) { if (!model.Id.HasValue) { return null; } return source.Shops.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)?.GetViewModel; } public List GetFilteredList(ShopSearchModel model) { if (string.IsNullOrEmpty(model.ShopName)) { return new(); } return source.Shops .Select(x => x.GetViewModel) .Where(x => x.ShopName.Contains(model.ShopName ?? string.Empty)) .ToList(); } public List GetFullList() { return source.Shops.Select(shop => shop.GetViewModel).ToList(); } public ShopViewModel? Insert(ShopBindingModel model) { model.Id = source.Shops.Count > 0 ? source.Shops.Max(x => x.Id) + 1 : 1; var newShop = Shop.Create(model); if (newShop == null) { return null; } source.Shops.Add(newShop); source.SaveShops(); return newShop.GetViewModel; } public ShopViewModel? Update(ShopBindingModel model) { var shop = source.Shops.FirstOrDefault(x => x.Id == model.Id); if (shop == null) { return null; } shop.Update(model); source.SaveShops(); return shop.GetViewModel; } public ShopViewModel? Delete(ShopBindingModel model) { var shop = source.Shops.FirstOrDefault(x => x.Id == model.Id); if (shop == null) { return null; } source.Shops.Remove(shop); source.SaveShops(); return shop.GetViewModel; } public bool SellDocument(IDocumentModel model, int count) { var document = source.Documents.FirstOrDefault(x => x.Id == model.Id); if (document == null) { return false; } var shopDocuments = source.Shops.SelectMany(shop => shop.ShopDocuments.Where(c => c.Value.Item1.Id == document.Id)); int countStore = 0; foreach (var it in shopDocuments) countStore += it.Value.Item2; if (count > countStore) return false; foreach (var shop in source.Shops) { var documents = shop.ShopDocuments; foreach (var c in documents.Where(x => x.Value.Item1.Id == document.Id)) { int min = Math.Min(c.Value.Item2, count); documents[c.Value.Item1.Id] = (c.Value.Item1, c.Value.Item2 - min); count -= min; if (count <= 0) break; } shop.Update(new ShopBindingModel { Id = shop.Id, ShopName = shop.ShopName, Address = shop.Address, MaxCountDocuments = shop.MaxCountDocuments, OpeningDate = shop.OpeningDate, ShopDocuments = documents }); source.SaveShops(); if (count <= 0) return true; } return true; } } }