using GiftShopContracts.BindingModels; using GiftShopContracts.SearchModels; using GiftShopContracts.StoragesContracts; using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; using GiftShopFileImplement; using GiftShopFileImplement.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GiftShopFileImplement.Implements { public class ShopStorage : IShopStorage { private readonly DataFileSingleton _source; public ShopStorage() { _source = DataFileSingleton.GetInstance(); } public List GetFullList() { return _source.Shops.Select(x => x.GetViewModel).ToList(); } public List GetFilteredList(ShopSearchModel model) { if (string.IsNullOrEmpty(model.ShopName)) { return new(); } return _source.Shops.Where(x => x.ShopName.Contains(model.ShopName)).Select(x => x.GetViewModel).ToList(); ; } public ShopViewModel? GetElement(ShopSearchModel model) { if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue) { return null; } return _source.Shops.FirstOrDefault(x =>(!string.IsNullOrEmpty(model.ShopName) && x.ShopName ==model.ShopName) || (model.Id.HasValue && x.Id == model.Id)) ?.GetViewModel; } 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 component = _source.Shops.FirstOrDefault(x => x.Id ==model.Id); if (component == null) { return null; } component.Update(model); _source.SaveShops(); return component.GetViewModel; } public ShopViewModel? Delete(ShopBindingModel model) { var element = _source.Shops.FirstOrDefault(x => x.Id == model.Id); if (element != null) { _source.Shops.Remove(element); _source.SaveShops(); return element.GetViewModel; } return null; } public bool CheckAvailability(int giftId, int count) { int minus = _source.Shops.Select(x => x.ShopGifts.Select(y => (y.Value.Item1.Id == giftId ? y.Value.Item2 : 0)).Sum()).Sum(); count -= minus; return count <= 0; } public bool SellGifts(IGiftModel model, int count) { var gift = _source.Gifts.FirstOrDefault(x => x.Id == model.Id); if (gift == null || !CheckAvailability(gift.Id, count)) { return false; } for (int i = 0; i < _source.Shops.Count; i++) { var shop = _source.Shops[i]; var gifts = shop.ShopGifts; foreach (var gifty in gifts.Where(x => x.Value.Item1.Id == gift.Id)) { var min = Math.Min(gifty.Value.Item2, count); gifts[gifty.Value.Item1.Id] = (gifty.Value.Item1, gifty.Value.Item2 - min); count -= min; if (count <= 0) { break; } } shop.Update(new ShopBindingModel { Id = shop.Id, ShopName = shop.ShopName, ShopAdress = shop.ShopAdress, OpeningDate = shop.OpeningDate, MaxCapacity = shop.MaxCapacity, ShopGifts = gifts }); } _source.SaveShops(); return true; } } }