using HospitalContracts.BindingModels; using HospitalContracts.ViewModels; using HospitalDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HospitalDataBaseImplements.Models { public class Procedures: IProceduresModel { public int Id { get; private set; } [Required] public int ClientId { get; private set; } [Required] public string ProceduresName { get; private set; } = string.Empty; [Required] public string Type { get; private set; } = string.Empty; public virtual Client Client { get; set; } private Dictionary? _procedureMedicine = null; [NotMapped] public Dictionary ProcedureMedicine { get { if (_procedureMedicine == null) { _procedureMedicine = Medicines .ToDictionary(rec => rec.MedicineId, rec => rec.Medicine as IMedicinesModel); } return _procedureMedicine; } } [ForeignKey("ProcedureId")] public virtual List Medicines { get; set; } = new(); public static Procedures? Create(ProceduresBindingModel model) { if (model == null) { return null; } return new Procedures() { Id = model.Id, ClientId = model.ClientId, ProceduresName = model.ProceduresName, Type = model.Type }; } public static Procedures Create(HospitalDatabase context, ProceduresViewModel model) { return new Procedures { Id = model.Id, ClientId = model.ClientId, ProceduresName = model.ProceduresName, Type = model.Type, Medicines = model.ProcedureMedicine.Select(x => new ProcedureMedicine { Medicine = context.Medicines.First(y => y.Id == x.Key), }).ToList() }; } public void Update(ProceduresBindingModel model) { if (model == null) { return; } ProceduresName = model.ProceduresName; Type = model.Type; } public ProceduresViewModel GetViewModel => new() { Id = Id, ClientId = ClientId, ProceduresName = ProceduresName, Type = Type, ProcedureMedicine = ProcedureMedicine }; public void UpdateMedicines(HospitalDatabase context, ProceduresBindingModel model) { var procedureMedicine = context.ProcedureMedicine.Where(rec => rec.ProcedureId == model.Id).ToList(); if (procedureMedicine != null && procedureMedicine.Count > 0) { context.ProcedureMedicine.RemoveRange(procedureMedicine.Where(rec => !model.ProcedureMedicine.ContainsKey(rec.MedicineId))); context.SaveChanges(); } var procedure = context.Procedures.First(x => x.Id == Id); var existingMedicineIds = procedureMedicine?.Select(x => x.MedicineId).ToList(); foreach (var rec in model.ProcedureMedicine) { context.ProcedureMedicine.Add(new ProcedureMedicine { Procedure = procedure, Medicine = context.Medicines.First(x => x.Id == rec.Key), }); } context.SaveChanges(); _procedureMedicine = null; } } }