/// <summary>
        /// Add new Case to System
        /// and reserve a date for it
        /// </summary>
        /// <param name="Case">All Case MetaData</param>
        /// <returns>Response if Saved or Not with error codes</returns>
        public Response AddNewCase(NewCase Case)
        {
            try
            {
                //Validate Pros Data
                //This will Be our big player
                //if any thing passes this validation
                //Data could be wrong
                if (!caseValidator.CValidate(Case, out List <int> ErrorCodes))
                {
                    return(ReturnErrorResponse(ErrorCodes));
                }
                using (var Transaction = databaseRepository.BeginTransaction())
                {
                    //Save Basic Data First
                    Base.Views.vw_FaultCaseBasicData caseBasicData = Case.MapToBasicData();
                    var caseSaveStatus = caseService.AddBasicData(caseBasicData);
                    if (caseSaveStatus != CaseSaveStatus.Saved)
                    {
                        return(ReturnErrorResponse(caseSaveStatus));
                    }

                    if (!prosecutionCaseService.LinkProsCase(Case.Business_Case_Id, caseBasicData.CaseID))
                    {
                        return(Response.Failed);
                    }

                    //Save Case Description
                    if (!caseService.AddCaseDescription(Case.MapCaseDescription(caseBasicData.CaseID)))
                    {
                        return(Response.Failed);
                    }

                    //Save First Session Date
                    long SessionID = GetSessionID(Case.First_Session);
                    if (!CaseConfiguration.AddCaseConfiguration(Case.MapCaseSessionConfiguration(SessionID, caseBasicData.CaseID)))
                    {
                        return(Response.Failed);
                    }

                    //Todo Save CaseParty Data
                    foreach (var CaseParty in Case.CaseParties)
                    {
                        //this will check if the nationalityExist or not and if not create it
                        CaseParty.NationalityID = lookupService.GetNationalityIDOrCreate(CaseParty.Nationality);
                        var PersonSaveStatus = personService.AddPerson(CaseParty.MapPersonData(), out long PersonID);
                        if (PersonSaveStatus != PersonStatus.SuccefullSave)
                        {
                            return(ReturnErrorResponse(PersonSaveStatus));
                        }

                        SaveDefectsStatus caseDefectSaveStatus = this.defectsService.AddCaseDefect(CaseParty.MapCaseDefectData(caseBasicData.CaseID, PersonID));
                        if (caseDefectSaveStatus != SaveDefectsStatus.Saved)
                        {
                            return(ReturnErrorResponse(caseDefectSaveStatus));
                        }

                        var Defects = defectsService.GetDefectsByCaseID(caseBasicData.CaseID)
                                      .Where(caseDefect => caseDefect.PersonID == PersonID);

                        foreach (var caseDefect in Defects)
                        {
                            if (!prosecutionCaseService.LinkProsCaseParty(CaseParty.ID, caseDefect.ID, caseDefect.DefectType))
                            {
                                return(Response.Failed);
                            }
                        }
                    }
                    //Todo Save Attachments
                    if (Transaction != null)
                    {
                        Transaction.Commit();
                    }
                    return(Response.Success);
                }
            }
            catch (Exception ex)
            {
                logger.LogException(ex);
                return(Response.Failed);
            }
        }
        /// <summary>
        /// Save a complete Case to the System
        /// </summary>
        /// <param name="Case">All Case MetaData</param>
        /// <returns>Response if Saved or Not with error codes</returns>
        public Response AddCompleteCase(CompleteCase Case)
        {
            try
            {
                using (var Transaction = databaseRepository.BeginTransaction())
                {
                    //Validate Pros Data
                    //This will Be our big player
                    //if any thing passes this validation
                    //Data could be wrong
                    if (!completeCaseValidator.CValidate(Case, out List <int> ErrorCodes))
                    {
                        return(ReturnErrorResponse(ErrorCodes));
                    }

                    //Save Basic Data First
                    Base.Views.vw_FaultCaseBasicData vw_FaultCaseBasicData = Case.MapToBasicData();
                    var caseSaveStatus = caseService.AddBasicData(vw_FaultCaseBasicData);
                    if (caseSaveStatus != CaseSaveStatus.Saved)
                    {
                        return(ReturnErrorResponse(caseSaveStatus));
                    }

                    //Save Case Description
                    if (!caseService.AddCaseDescription(Case.MapCaseDescription(vw_FaultCaseBasicData.CaseID)))
                    {
                        return(Response.Failed);
                    }

                    //Save First Session Date
                    long SessionID = GetSessionID(Case.FinalSession);
                    if (!CaseConfiguration.AddCaseConfiguration(Case.MapCaseSessionConfiguration(SessionID, vw_FaultCaseBasicData.CaseID)))
                    {
                        return(Response.Failed);
                    }

                    //Todo Save CaseParty Data
                    foreach (var CaseParty in Case.CaseParties)
                    {
                        var PersonSaveStatus = personService.AddPerson(CaseParty.MapPersonData(), out long PersonID);
                        if (PersonSaveStatus != PersonStatus.SuccefullSave)
                        {
                            return(ReturnErrorResponse(PersonSaveStatus));
                        }

                        SaveDefectsStatus caseDefectSaveStatus = this.defectsService.AddCaseDefect(CaseParty.MapCaseDefectData(vw_FaultCaseBasicData.CaseID, PersonID));
                        if (caseDefectSaveStatus != SaveDefectsStatus.Saved)
                        {
                            return(ReturnErrorResponse(caseDefectSaveStatus));
                        }

                        //Todo Save Decision
                    }
                    //Todo Save Attachments

                    Transaction.Commit();
                    return(Response.Success);
                }
            }
            catch (Exception ex)
            {
                logger.LogException(ex);
                return(Response.Failed);
            }
        }