using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using VeterinaryContracts.BindingModels;
using VeterinaryContracts.ViewModels;
using VeterinaryDataModels.Models;
using System.ComponentModel;

namespace VeterinaryDatabaseImplement.Models
{
    public class Pet : IPetModel
	{
		public int Id { get; private set; }
		[Required]
		public int OwnerId { get; private set; }
		public virtual Owner? Owner { get; private set; }
		[Required]
		public string PetName { get; private set; } = string.Empty;
		[Required]
		public string PetType { get; private set; } = string.Empty;
		[Required]
		public string PetBreed { get; private set; } = string.Empty;
		[Required]
		public string PetGender { get; private set; } = string.Empty;
		[ForeignKey("PetId")]
		public virtual List<VisitPet> Visits { get; set; } = new();
		[ForeignKey("PetId")]
		public virtual List<PurchasePet> Purchases { get; set; } = new();
		public Dictionary<int, IVisitModel>? _visitPets = null;
		[NotMapped]
		public Dictionary<int, IVisitModel> VisitPets
		{
			get
			{
				if (_visitPets == null)
				{
					_visitPets = Visits.ToDictionary(recPC => recPC.VisitId, recPC =>
				   recPC.Visit as IVisitModel);
				}
				return _visitPets;
			}
		}
		public Dictionary<int, IPurchaseModel>? _purchasePets = null;
		[NotMapped]
		public Dictionary<int, IPurchaseModel> PurchasePets
		{
			get
			{
				if (_purchasePets == null)
				{
					_purchasePets = Purchases.ToDictionary(recPC => recPC.PurchaseId, recPC =>
				   recPC.Purchase as IPurchaseModel);
				}
				return _purchasePets;
			}
		}
		public static Pet? Create(PetBindingModel model)
		{
			if (model == null)
			{
				return null;
			}
			return new Pet()
			{
				Id = model.Id,
				PetName = model.PetName,
				PetType = model.PetType,
				PetBreed = model.PetBreed,
				PetGender = model.PetGender,
				OwnerId = model.OwnerId,
			};
		}
		public void Update(PetBindingModel? model)
		{
			if (model == null)
			{
				return;
			}
			PetName = model.PetName;
			PetType = model.PetType;
			PetBreed = model.PetBreed;
			PetGender = model.PetGender;
		}
		public PetViewModel GetViewModel => new()
		{
			Id = Id,
			PetName = PetName,
			PetType = PetType,
			PetBreed = PetBreed,
			PetGender = PetGender,
			OwnerId = OwnerId,
		};
		public void UpdateVisits(VeterinaryDatabase context, PetBindingModel model)
		{
			var visitPets = context.VisitPets.Where(rec => rec.PetId == model.Id).ToList();
			if (visitPets != null)
			{
				context.VisitPets.RemoveRange(visitPets.Where(rec => !model.VisitPets.ContainsKey(rec.VisitId)));
				context.SaveChanges();
				foreach (var visit in visitPets)
				{
					model.VisitPets.Remove(visit.VisitId);
				}
				context.SaveChanges();
			}
			var pet = context.Pets.First(x => x.Id == Id);
			foreach (var pc in model.VisitPets)
			{
				context.VisitPets.Add(new VisitPet
				{
					Pet = pet,
					Visit = context.Visits.First(x => x.Id == pc.Key),

				});
				context.SaveChanges();
			}
			_visitPets = null;
		}
	}
}
