using SewingDressesContracts.BindingModels;
using SewingDressesContracts.StoragesContracts;
using SewingDressesContracts.SearchModels;
using SewingDressesContracts.ViewModels;
using SewingDressesDatabaseImplement.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SewingDressesDatabaseImplement.Implements
{
	public class ImplementStorage : IImplementStorage
	{
		public ImplementViewModel? Insert(ImplementBindingModel? model)
		{
			using var context = new SewingDressesDatabase();
			var newImplement = Implement.Create(model);
			if (newImplement == null)
				return null;
			context.Implements.Add(newImplement);
			context.SaveChanges();
			return newImplement.GetViewModel;
		}
		public ImplementViewModel? Update(ImplementBindingModel? model)
		{
			using var context = new SewingDressesDatabase();
			if (model == null)
				return null;
			var implement = context.Implements.FirstOrDefault(x => x.Id == model.Id);
			if (implement == null) return null;
			implement.Update(model);
			context.SaveChanges();
			return implement.GetViewModel;
		}
		public ImplementViewModel? Delete(ImplementBindingModel? model)
		{
			using var context = new SewingDressesDatabase();
			var implement = context.Implements.FirstOrDefault(x => x.Id == model.Id);
			if (implement == null) return null;
			context.Implements.Remove(implement);
			context.SaveChanges();
			return implement.GetViewModel;
		}
		public ImplementViewModel? GetElement(ImplementSearchModel model)
		{
			if (string.IsNullOrEmpty(model.ImplementFIO) && !model.Id.HasValue)
				return null;
			using var context = new SewingDressesDatabase();
			return context.Implements.FirstOrDefault(x => (string.IsNullOrEmpty(model.ImplementFIO) || x.ImplementFIO.Equals(model.ImplementFIO)) && (!model.Id.HasValue || model.Id == x.Id))?.GetViewModel;
		}
		public List<ImplementViewModel> GetFullList()
		{
			using var context = new SewingDressesDatabase();
			return context.Implements.Select(x => x.GetViewModel).ToList();
		}
		public List<ImplementViewModel> GetFilteredList(ImplementSearchModel model)
		{
			if (string.IsNullOrEmpty(model.ImplementFIO)) return new();
			using var context = new SewingDressesDatabase();
			return context.Implements.Where(x => x.ImplementFIO.Equals(model.ImplementFIO)).Select(x => x.GetViewModel).ToList();
		}
	}
}
