using BankContracts.BindingModels;
using BankContracts.ViewModels;
using BankDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BankDataBaseImplement.Models
{
    public class Room : IRoomModel
    {
        [Required]
        public string RoomName { get; set; } = string.Empty;
        [Required]
        public string RoomFrame { get; set; } = string.Empty;
        [Required]
        public double RoomPrice { get; set; } 
        public int ClientId { get; private set; }
        public int AdditionsId { get; private set; }
        public int Id { get; private set; }

        public virtual Client Client { get; set; }
        public virtual Additions Additions { get; set; }

        [ForeignKey("RoomId")]
        public virtual List<RoomCredit> Credits { get; set; }

        private Dictionary<int, ICreditModel> _roomDinners = null;
        public Dictionary<int, ICreditModel> RoomDinners
        {
            get
            {
                if (_roomDinners == null)
                {
                    _roomDinners = Credits.ToDictionary(recPC => recPC.DinnerId, recPC => (recPC.Credit as ICreditModel));
                }
                return _roomDinners;
            }
        }

        public static Room Create(BankDataBase context, RoomBindingModel model)
        {
            return new Room()
            {
                Id = model.Id,
                RoomName = model.RoomName,
                RoomFrame = model.RoomFrame,
                RoomPrice = model.RoomPrice,
                Credits = model.RoomCredits.Select(x => new RoomCredit
                {
                    Credit = context.Credits.First(y => y.Id == x.Key),
                }).ToList()
            };
        }

        public void Update(RoomBindingModel model)
        {
            RoomName = model.RoomName;
            RoomFrame = model.RoomFrame;
            RoomPrice = model.RoomPrice;
        }

        public RoomViewModel GetViewModel => new()
        {
            Id = Id,
            RoomName = RoomName,
            RoomFrame = RoomFrame,
            RoomPrice = RoomPrice,
            RoomDinners = RoomDinners
        };

        public void UpdateDinners(BankDataBase context, RoomBindingModel model)
        {
            var roomDinners = context.RoomCredits.Where(rec => rec.RoomId == model.Id).ToList();

            if (roomDinners != null)
            {
                context.RoomCredits.RemoveRange(roomDinners.Where(rec => !model.RoomCredits.ContainsKey(rec.DinnerId)));
                context.SaveChanges();
            }

            var room = context.Rooms.First(x => x.Id == Id);

            foreach (var cm in model.RoomCredits)
            {
                context.RoomCredits.Add(new RoomCredit
                {
                    Room = room,
                    Credit = context.Credits.First(x => x.Id == cm.Key)
                });
                context.SaveChanges();
            }
            _roomDinners = null;
        }
    }
}