using Contracts.BindingModels;
using Contracts.ViewModels;
using DataModels.Models;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;

namespace DatabaseImplement.Models
{
	public class Workshop : IWorkshopModel
	{
		public int Id { get; set; }
		[Required]
		public string Title { get; set; } = string.Empty;
		[Required]
		public string Address { get; set; } = string.Empty;
		[Required]
		public string Director { get; set; } = string.Empty;
        [Required]
        public DateTime DateCreate { get; set; } = DateTime.Now;
        [Required]
		public int UserId { get; set; }
		public int? ProductionId { get; set; }
		public virtual Production? Production { get; set; }
		private Dictionary<int, IWorkerModel>? _workerWorkshops = null;
		[NotMapped]
		public Dictionary<int, IWorkerModel> WorkerWorkshops 
		{
			get
			{
				if(_workerWorkshops == null)
				{
					_workerWorkshops = Workers.ToDictionary(recDP => recDP.WorkerId, recDp => (recDp.Worker as IWorkerModel));
				}
				return _workerWorkshops;
			}
		}
		[ForeignKey("WorkshopId")]
		public List<WorkerWorkshop> Workers { get; set; } = new();
		public static Workshop? Create(FactoryGoWorkDatabase context, WorkshopBindingModel model)
		{
			if(model == null)
			{
				return null;
			}
			return new Workshop
			{
				Id = model.Id,
				Title = model.Title,
				Address = model.Address,
				Director = model.Director,
				ProductionId = model.ProductionId,
				Production = model.ProductionId.HasValue ? context.Productions.FirstOrDefault(x => x.Id == model.ProductionId) : null,
				UserId = model.UserId,
				Workers = model.WorkshopWorker.Select(x => new WorkerWorkshop
				{
					Worker = context.Workers.First(y => y.Id == x.Key),
				}).ToList(),
			};
		}
		public static Workshop Create(WorkshopViewModel model)
		{
			return new Workshop
			{
				Id = model.Id,
				Title = model.Title,
				Address = model.Address,
				Director = model.Director,
				ProductionId = model.ProductionId,
				UserId = model.UserId,
			};
		}
		public void Update(WorkshopBindingModel model)
		{
			if (model == null)
				return;
			Title = model.Title;
			Address = model.Address;
			Director = model.Director;
			ProductionId = model.ProductionId == null ? ProductionId : model.ProductionId;
		}
		public WorkshopViewModel GetViewModel => new()
		{
			Id = Id,
			Title = Title,
			Address = Address,
			Director = Director,
			ProductionId = ProductionId,
			ProductionName = Production == null ? null : Production.Name,
			UserId = UserId,
			WorkerWorkshops = WorkerWorkshops
		};
		public void UpdateWorkers(FactoryGoWorkDatabase context, WorkshopBindingModel model)
		{
			var workshopWorkers = context.WorkerWorkshops.Where(rec => rec.WorkshopId == model.Id).ToList();
			if (workshopWorkers != null && workshopWorkers.Count > 0)
			{
				context.WorkerWorkshops.RemoveRange(workshopWorkers.Where(rec => !model.WorkshopWorker.ContainsKey(rec.WorkerId)));
				context.SaveChanges();
				foreach (var upWorker in workshopWorkers)
				{
                    if (model.WorkshopWorker.ContainsKey(upWorker.WorkerId))
                    {
                       model.WorkshopWorker.Remove(upWorker.WorkerId);
                    }
                }
				context.SaveChanges();
			}
			var workshop = context.Workshops.FirstOrDefault(x => x.Id == model.Id);
			foreach (var dp in model.WorkshopWorker)
			{
				context.WorkerWorkshops.Add(new WorkerWorkshop
				{
					Workshop = workshop,
					Worker = context.Workers.First(x => x.Id == dp.Key)
				});
				context.SaveChanges();
			}
			_workerWorkshops = null;
		}
	}
}
