using BankContracts.BindingModels;
using BankContracts.ViewModels;
using BankDataModels.Models;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace BankDataBaseImplement.Models
{
    public class Additions : IAdditionsModel
    {
        [Required]
        public string AdditionsName { get; set; } = string.Empty;

        [Required]
        public double AdditionsPrice { get; set; }

        public int ClercId { get; private set; }

        public int Id { get; private set; }

        public virtual Clerc Clerc { get; set; }

        [ForeignKey("AdditionId")]
        public virtual List<Room> Rooms { get; set; }

        [ForeignKey("AdditionId")]
        public virtual List<AdditionsMember> Members { get; set; }

        private Dictionary<int, IMemberModel> _AdditionsMembers = null;

        public Dictionary<int, IMemberModel> AdditionsMembers
        {
            get
            {
                if (_AdditionsMembers == null)
                {
                    _AdditionsMembers = Members.ToDictionary(recPC => recPC.MemberId, recPC => (recPC.Member as IMemberModel));
                }
                return _AdditionsMembers;
            }
        }
        public static Additions Create(BankDataBase context, AdditionsBindingModel model)
        {
            return new Additions()
            {
                Id = model.Id,
                AdditionsName = model.AdditionsName,
                AdditionsPrice = model.AdditionsPrice,
                Members = model.AdditionsMembers.Select(x => new AdditionsMember
                {
                    Member = context.Members.First(y => y.Id == x.Key),
                }).ToList()
            };
        }

        public void Update(AdditionsBindingModel model)
        {
            AdditionsName = model.AdditionsName;
            AdditionsPrice = model.AdditionsPrice;
        }

        public AdditionsViewModel GetViewModel => new()
        {
            Id = Id,
            AdditionsName = AdditionsName,
            AdditionsPrice = AdditionsPrice,
            AdditionsMembers = AdditionsMembers
        };

        public void UpdateMembers(BankDataBase context, AdditionsBindingModel model)
        {
            var AdditionMembers = context.AdditionsMembers.Where(rec => rec.AdditionsId == model.Id).ToList();

            if (AdditionMembers != null)
            {
                context.AdditionsMembers.RemoveRange(AdditionMembers.Where(rec => !model.AdditionsMembers.ContainsKey(rec.MemberId)));
                context.SaveChanges();
            }

            var Addition = context.Additions.First(x => x.Id == Id);

            foreach (var cm in model.AdditionsMembers)
            {
                context.AdditionsMembers.Add(new AdditionsMember
                {
                    Additions = Addition,
                    Member = context.Members.First(x => x.Id == cm.Key)
                });
                context.SaveChanges();
            }
            _AdditionsMembers = null;
        }
    }
}