private ResultOfType <RendezVousResultDataModel> ValidateNewRendezVousProperties(RendezVousDataModel rendezVousToAdd)
        {
            if (string.IsNullOrEmpty(rendezVousToAdd.PatientEmail))
            {
                return(new Return <RendezVousResultDataModel>()
                       .Error().AsValidationFailure(null, "Veuillez introduire votre Patient Cin.", "PatientEmail")
                       .WithDefaultResult());
            }

            if (string.IsNullOrEmpty(rendezVousToAdd.PraticienCin))
            {
                return(new Return <RendezVousResultDataModel>()
                       .Error().AsValidationFailure(null, "Veuillez introduire votre Praticien Cin.", "PraticienCin")
                       .WithDefaultResult());
            }

            if (string.IsNullOrEmpty(rendezVousToAdd.Statut))
            {
                return(new Return <RendezVousResultDataModel>()
                       .Error().AsValidationFailure(null, "Veuillez introduire votre Statut.", "Statut")
                       .WithDefaultResult());
            }



            return(null);
        }
        public ResultOfType <RendezVousResultDataModel> PostNewRendezVous(RendezVousDataModel rendezVousToAdd)
        {
            try
            {
                Logger.LogInfo("PostNewRendezVous : Start.");
                if (rendezVousToAdd == null)
                {
                    return(new Return <RendezVousResultDataModel>().Error().As(EStatusDetail.BadRequest).AddingGenericError(
                               null, "Les données sont vides.").WithDefaultResult());
                }

                Logger.LogInfo(string.Format("Post New rendez vous : Start --- PatientEmail = {0}, PatientEmail = {1}",
                                             rendezVousToAdd.PatientEmail, rendezVousToAdd.PatientEmail));

                var validationResult = ValidateNewRendezVousProperties(rendezVousToAdd);

                if (validationResult != null)
                {
                    Logger.LogInfo(string.Format("Post New rendez vous : End --- Status = {0}, Message= {1}",
                                                 validationResult.Status, validationResult.Errors[0].Message));
                    return(validationResult);
                }

                var rdv = _rendezVousRepository.GetAll().FirstOrDefault(r => r.Creneaux.CurrentDate.Equals(rendezVousToAdd.CurrentDate) && r.Creneaux.HeureDebut.Equals(rendezVousToAdd.HeureDebut) && r.Praticien.Cin.Equals(rendezVousToAdd.PraticienCin));

                if (rdv != null)
                {
                    return(new Return <RendezVousResultDataModel>().Error().As(EStatusDetail.BadRequest).AddingGenericError(
                               null, "Un rendez vous à cette date et à cette heure pour  ce praticien a été pris déjà.").WithDefaultResult());
                }
                //vérifier si le patient a pris déjà un rendez dans ce jour pour le même médecin ! bloquer ça pour ne pas abuser et garder tjr horaire pour le reste
                var rdvthatday = _rendezVousRepository.GetAll().FirstOrDefault(r => r.Creneaux.CurrentDate.Equals(rendezVousToAdd.CurrentDate) && r.Praticien.Cin.Equals(rendezVousToAdd.PraticienCin) && r.Patient.Email.Equals(rendezVousToAdd.PatientEmail));

                if (rdvthatday != null)
                {
                    return(new Return <RendezVousResultDataModel>().Error().As(EStatusDetail.BadRequest).AddingGenericError(
                               null, "Vous avez pris déjà un rendez à cette date pour  ce praticien, vous ne pouvez pas prendre plus qu'un rendez vous à une date donnée.").WithDefaultResult());
                }

                if (rendezVousToAdd.NoteConsultation == null)
                {
                    rendezVousToAdd.NoteConsultation = string.Empty;
                }


                var patient   = _userAccountRepository.GetAll().FirstOrDefault(p => p.Email == rendezVousToAdd.PatientEmail);
                var praticien = _praticienRepository.GetAll().FirstOrDefault(p => p.Cin == rendezVousToAdd.PraticienCin);

                if (patient == null)
                {
                    return(new Return <RendezVousResultDataModel>()
                           .Error().AsValidationFailure(null, "Pas de patient en cours.", "patient")
                           .WithDefaultResult());
                }

                if (praticien == null)
                {
                    return(new Return <RendezVousResultDataModel>()
                           .Error().AsValidationFailure(null, "Pas de praticien en cours.", "praticien")
                           .WithDefaultResult());
                }

                //add a new creneau before
                var creneau = new Creneaux
                {
                    CurrentDate = rendezVousToAdd.CurrentDate,
                    HeureDebut  = rendezVousToAdd.HeureDebut,
                    HeureFin    = rendezVousToAdd.HeureDebut,
                    Status      = "ND", //Sera confirmé soit on supprime tout l'élément
                    Praticien   = praticien
                };

                _creneauRepository.Add(creneau);

                //récupérer le créneau
                //var cren =
                //    _creneauRepository.GetAll()
                //        .FirstOrDefault(
                //            c =>
                //                c.CurrentDate.Equals(creneau.CurrentDate) && c.HeureDebut.Equals(creneau.HeureDebut) &&
                //                c.Praticien.Cin.Equals(praticien.Cin));
                //if (cren == null)
                //{
                //    cren = creneau;
                //}
                var rendezvous = new RendezVous
                {
                    Creneaux         = creneau,
                    Praticien        = praticien,
                    Patient          = patient,
                    Statut           = "NC",
                    NoteConsultation = rendezVousToAdd.NoteConsultation
                };

                _rendezVousRepository.Add(rendezvous);

                Logger.LogInfo("PostNewRendezVous : End. ");
                return
                    (new Return <RendezVousResultDataModel>().OK()
                     .WithResult(new RendezVousResultDataModel
                {
                    NoteConsultation = rendezvous.Statut,
                    PraticienEmail = rendezvous.Praticien.Email,
                    PatientCin = rendezvous.Patient.Email,
                    Statut = rendezvous.Statut,
                    CurrentDate = creneau.CurrentDate,
                    HeureFin = creneau.HeureDebut,
                    HeureDebut = creneau.HeureFin
                }));
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        public ResultOfType <RendezVousResultDataModel> PatchNewRendezVous(RendezVousDataModel rendezVousToAdd)
        {
            try
            {
                Logger.LogInfo("PatchNewRendezVous : Start.");
                if (rendezVousToAdd == null)
                {
                    return(new Return <RendezVousResultDataModel>().Error().As(EStatusDetail.BadRequest).AddingGenericError(
                               null, "Les données sont vides.").WithDefaultResult());
                }

                Logger.LogInfo(string.Format("Patch New rendez vous : Start --- PatientEmail = {0}, PatientEmail = {1}",
                                             rendezVousToAdd.PatientEmail, rendezVousToAdd.PatientEmail));

                var validationResult = ValidateNewRendezVousProperties(rendezVousToAdd);

                if (validationResult != null)
                {
                    Logger.LogInfo(string.Format("Patch New rendez vous : End --- Status = {0}, Message= {1}",
                                                 validationResult.Status, validationResult.Errors[0].Message));
                    return(validationResult);
                }

                if (string.IsNullOrEmpty(rendezVousToAdd.HeureDebut))
                {
                    return(new Return <RendezVousResultDataModel>()
                           .Error().AsValidationFailure(null, "Veuillez introduire heure début.", "HeureDebut")
                           .WithDefaultResult());
                }

                if (string.IsNullOrEmpty(rendezVousToAdd.CurrentDate))
                {
                    return(new Return <RendezVousResultDataModel>()
                           .Error().AsValidationFailure(null, "Veuillez introduire date courrante.", "CurrentDate")
                           .WithDefaultResult());
                }

                //var validationId = IsValidGuidIdAndGeneratedByRendezVousApi(rendezVousToAdd.Id);
                //if (validationId != null)
                //{
                //    Logger.LogInfo(string.Format("Patch New rendez vous : End --- Status = {0}, Message= {1}",
                //                                validationId.Status, validationId.Errors[0].Message));
                //    return validationId;
                //}

                var rdv = _rendezVousRepository.GetAll().FirstOrDefault(r => r.Creneaux.CurrentDate.Equals(rendezVousToAdd.CurrentDate) && r.Creneaux.HeureDebut.Equals(rendezVousToAdd.HeureDebut) && r.Praticien.Email.Equals(rendezVousToAdd.PraticienCin));

                if (rdv == null)
                {
                    return(new Return <RendezVousResultDataModel>().Error().As(EStatusDetail.BadRequest).AddingGenericError(
                               null, "Un rendez vous à cette date et à cette heure pour  ce praticien a été pris déjà.").WithDefaultResult());
                }

                var cren = _creneauRepository.GetAll().FirstOrDefault(cr => cr.CurrentDate.Equals(rendezVousToAdd.CurrentDate) && cr.HeureDebut.Equals(rendezVousToAdd.HeureDebut));
                if (cren == null)
                {
                    return(new Return <RendezVousResultDataModel>()
                           .Error().AsValidationFailure(null, "Le creneau n'existe pas pour ce rendez vous.", "validationCreneauId")
                           .WithDefaultResult());
                }


                var patient   = _userAccountRepository.GetAll().FirstOrDefault(p => p.Email == rendezVousToAdd.PatientEmail);
                var praticien = _praticienRepository.GetAll().FirstOrDefault(p => p.Email == rendezVousToAdd.PraticienCin);


                if (patient != null)
                {
                    rdv.Patient = patient;
                }
                if (praticien != null)
                {
                    rdv.Praticien = praticien;
                }
                RendezVousResultDataModel data;
                //Dans le cas de rejet supprimer créneau lié et garder le RDV en tant que trace
                if (rendezVousToAdd.Statut.Equals("R"))
                {
                    //Ajouter ce rdv dans l'historique
                    var historique = new HistoriqueRendezVous
                    {
                        CreneauxHeureDebut = cren.HeureDebut,
                        CurrentDate        = cren.CurrentDate,
                        Patient            = rdv.Patient,
                        Praticien          = rdv.Praticien,
                        Statut             = rdv.Statut
                    };

                    _historiqueRdvRepository.Add(historique);
                    //on doit supprimer les rendez vous ainsi que les créneau non disponible
                    _creneauRepository.Delete(cren.Id);
                    _rendezVousRepository.Delete(rdv.Id);


                    data = new RendezVousResultDataModel
                    {
                        NoteConsultation         = historique.Statut,
                        PraticienEmail           = historique.Praticien.Email,
                        PatientCin               = historique.Patient.Email,
                        Statut                   = historique.Statut,
                        CurrentDate              = historique.CurrentDate,
                        PraticienAdresseDetaille = String.Format("{0} {1} {2}", rdv.Praticien.Adresse, rdv.Praticien.Delegation, rdv.Praticien.Gouvernerat),
                        PraticienSpecialite      = rdv.Praticien.Specialite,
                        PraticienTelephone       = rdv.Praticien.Telephone,
                        PraticinNomPrenom        = rdv.Praticien.NomPrenom,
                        HeureDebut               = historique.CreneauxHeureDebut
                    };
                }
                else
                {
                    rdv.Statut = rendezVousToAdd.Statut;
                    //juste on affecte le créneau
                    rdv.Creneaux = cren;

                    if (rendezVousToAdd.NoteConsultation != null)
                    {
                        rdv.NoteConsultation = rdv.NoteConsultation;
                    }

                    _rendezVousRepository.Update(rdv);
                    data = new RendezVousResultDataModel
                    {
                        NoteConsultation         = rdv.Statut,
                        PraticienEmail           = rdv.Praticien.Email,
                        PatientCin               = rdv.Patient.Email,
                        Statut                   = rdv.Statut,
                        CurrentDate              = rdv.Creneaux.CurrentDate,
                        HeureFin                 = rdv.Creneaux.HeureDebut,
                        HeureDebut               = rdv.Creneaux.HeureFin,
                        PraticienAdresseDetaille = String.Format("{0} {1} {2}", rdv.Praticien.Adresse, rdv.Praticien.Delegation, rdv.Praticien.Gouvernerat),
                        PraticienSpecialite      = rdv.Praticien.Specialite,
                        PraticienTelephone       = rdv.Praticien.Telephone,
                        PraticinNomPrenom        = rdv.Praticien.NomPrenom
                    };
                }


                return
                    (new Return <RendezVousResultDataModel>().OK()
                     .WithResult(data));
            }
            catch (Exception)
            {
                throw;
            }
        }