using PolyclinicContracts.BindingModels;
using PolyclinicContracts.ViewModels;
using PolyclinicDataModels.Models;
using SecuritySystemDatabaseImplement;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace PolyclinicDatabaseImplement.Models
{
    public class Course : ICourseModel
    {
        public int Id { get; set; }
        [Required]
        public int DaysCount { get; set; }
        [Required]
        public int PillsPerDay { get; set; }
        public string? Comment { get; set; } = string.Empty;
        [ForeignKey("CourseId")]
        public virtual List<CourseDiagnose> Diagnoses { get; set; } = new();
        private Dictionary<int, IDiagnoseModel>? _courseDiagnoses = null;
        [NotMapped]
        public Dictionary<int, IDiagnoseModel> CourseDiagnoses
        {
            get
            {
                if (_courseDiagnoses == null)
                {
                    _courseDiagnoses = Diagnoses.ToDictionary(
                        courseDiagnose => courseDiagnose.DiagnoseId,
                        courseDiagnose => courseDiagnose.Diagnose as IDiagnoseModel
                    );
                }
                return _courseDiagnoses;
            }
        }

        public static Course? Create(PolyclinicDatabase context, CourseBindingModel model)
        {
            return new Course()
            {
                Id = model.Id,
                DaysCount = model.DaysCount,
                PillsPerDay = model.PillsPerDay,
                Comment = model.Comment,
                Diagnoses = model.CourseDiagnoses.Select(courseDiagnose => new CourseDiagnose
                {
                    Diagnose = context.Diagnoses.First(diagnose => diagnose.Id == courseDiagnose.Key)
                }).ToList()
            };
        }

        public void Update(CourseBindingModel model)
        {
            DaysCount = model.DaysCount;
            PillsPerDay = model.PillsPerDay;
            Comment = model.Comment;
        }

        public CourseViewModel GetViewModel => new()
        {
            Id = Id,
            DaysCount = DaysCount,
            PillsPerDay = PillsPerDay,
            Comment = Comment,
            CourseDiagnoses = CourseDiagnoses
        };

        public void UpdateDiagnoses(PolyclinicDatabase context, CourseBindingModel model)
        {
            var courseDiagnoses = context.CourseDiagnoses.Where(rec => rec.CourseId == model.Id).ToList();
            if (courseDiagnoses != null && courseDiagnoses.Count > 0)
            {
                // удалили те, которых нет в модели
                context.CourseDiagnoses.RemoveRange(courseDiagnoses);
                context.SaveChanges();
            }
            var course = context.Courses.First(x => x.Id == Id);
            foreach (var pc in model.CourseDiagnoses)
            {
                context.CourseDiagnoses.Add(new CourseDiagnose
                {
                    Course = course,
                    Diagnose = context.Diagnoses.First(x => x.Id == pc.Key),
                });
                context.SaveChanges();
            }
            _courseDiagnoses = null;
        }
    }
}