public ResponseMessageDTO UpdateTraining(UpdateTrainingInputDTO updateTrainingInput)
        {
            try
            {
                if (updateTrainingInput.TrainingID <= 0)
                {
                    return(new ResponseMessageDTO(false, L("UpdateTraining_Fail")));
                }
                else
                {
                    var training = _trainingRepository.Get(updateTrainingInput.TrainingID);

                    if (training.StatusId == _trainingStatusRepository.GetTrainingStatusIdByName(TrainingStatus.CANCELED) ||
                        training.StatusId == _trainingStatusRepository.GetTrainingStatusIdByName(TrainingStatus.COMPLETED))
                    {
                        //training already canceled or completed -> cant update
                        return(new ResponseMessageDTO(false, L("UpdateTraining_CancelOrCompleteFail")));
                    }
                    else if (training.StatusId == _trainingStatusRepository.GetTrainingStatusIdByName(TrainingStatus.ONGOING))
                    {
                        //training already on going -> can update end date, trainees assigned, trainers assigned
                        //modules arrangement

                        int[] arrayOldTraineesIDAssigned = training.ArrayOfAssignedTrainees;
                        int[] arrayNewTraineesIDAssigned = JsonConvert.DeserializeObject <int[]>(updateTrainingInput.AssignedTrainees);

                        #region Remove training targeted from old trainees assigned

                        List <int> listOldTraineesIDAssigned = _compareAppService.GetMissingIntegers(arrayNewTraineesIDAssigned, arrayOldTraineesIDAssigned).ToList();

                        foreach (int oldTraineeIDAssigned in listOldTraineesIDAssigned)
                        {
                            var oldTraineeAssigned = _traineeRepository.Get(oldTraineeIDAssigned);

                            List <int> listTrainingsTargeted = oldTraineeAssigned.ArrayOfTargetedTraining.ToList();

                            var itemToRemove = listTrainingsTargeted.SingleOrDefault(r => r == updateTrainingInput.TrainingID);

                            if (itemToRemove != 0)
                            {
                                //Remove training from trainings targeted of this trainee
                                listTrainingsTargeted.Remove(itemToRemove);
                            }

                            oldTraineeAssigned.ArrayOfTargetedTraining = listTrainingsTargeted.ToArray();

                            var updateOldTrainee = _traineeRepository.Update(oldTraineeAssigned);

                            if (updateOldTrainee.Id == 0)
                            {
                                return(new ResponseMessageDTO(false, L("UpdateTraining_FailError")));
                            }
                        }

                        #endregion

                        #region Add training targeted to new trainees assigned

                        List <int> listNewTraineesIDAssigned = _compareAppService.GetMissingIntegers(arrayOldTraineesIDAssigned, arrayNewTraineesIDAssigned).ToList();

                        foreach (int newTraineeIDAssigned in listNewTraineesIDAssigned)
                        {
                            var newTraineeAssigned = _traineeRepository.Get(newTraineeIDAssigned);

                            List <int> listTrainingsTargeted = newTraineeAssigned.ArrayOfTargetedTraining.ToList();

                            //Add training to trainings targeted of this trainee
                            listTrainingsTargeted.Add(updateTrainingInput.TrainingID);
                            listTrainingsTargeted = listTrainingsTargeted.Distinct().ToList();

                            newTraineeAssigned.ArrayOfTargetedTraining = listTrainingsTargeted.ToArray();

                            var updateNewTrainee = _traineeRepository.Update(newTraineeAssigned);

                            if (updateNewTrainee.Id == 0)
                            {
                                return(new ResponseMessageDTO(false, L("UpdateTraining_FailError")));
                            }
                        }

                        #endregion

                        //Update training information
                        training.EndDate                 = DateCalculator.StringToDate(updateTrainingInput.EndDate);
                        training.TotalDuration           = updateTrainingInput.TotalDuration;
                        training.ArrayOfAssignedTrainees = JsonConvert.DeserializeObject <int[]>(updateTrainingInput.AssignedTrainees);
                        training.ArrayOfAssignedTrainers = JsonConvert.DeserializeObject <int[]>(updateTrainingInput.AssignedTrainers);
                        training.ModuleArrangement       = updateTrainingInput.ModulesArrangement;

                        var updateTraining = _trainingRepository.Update(training);
                    }
                    else
                    {
                        //training just planed -> can update start date, end date, trainees assigned
                        //trainers assigned, modules arrangement

                        if (DateTime.Now >= DateCalculator.StringToDate(updateTrainingInput.StartDate))
                        {
                            //The StartDate is over -> cant update
                            return(new ResponseMessageDTO(false, L("UpdateTraining_StartEndDate")));
                        }
                        else
                        {
                            int[] arrayOldTraineesIDAssigned = training.ArrayOfAssignedTrainees;
                            int[] arrayNewTraineesIDAssigned = JsonConvert.DeserializeObject <int[]>(updateTrainingInput.AssignedTrainees);

                            #region Remove training targeted from old trainees assigned

                            List <int> listOldTraineesIDAssigned = _compareAppService.GetMissingIntegers(arrayNewTraineesIDAssigned, arrayOldTraineesIDAssigned).ToList();

                            foreach (int oldTraineeIDAssigned in listOldTraineesIDAssigned)
                            {
                                var oldTraineeAssigned = _traineeRepository.Get(oldTraineeIDAssigned);

                                List <int> listTrainingsTargeted = oldTraineeAssigned.ArrayOfTargetedTraining.ToList();

                                var itemToRemove = listTrainingsTargeted.SingleOrDefault(r => r == updateTrainingInput.TrainingID);

                                if (itemToRemove != 0)
                                {
                                    //Remove training from trainings targeted of this trainee
                                    listTrainingsTargeted.Remove(itemToRemove);
                                }

                                oldTraineeAssigned.ArrayOfTargetedTraining = listTrainingsTargeted.ToArray();

                                var updateOldTrainee = _traineeRepository.Update(oldTraineeAssigned);

                                if (updateOldTrainee.Id == 0)
                                {
                                    return(new ResponseMessageDTO(false, L("UpdateTraining_FailError")));
                                }
                            }

                            #endregion

                            #region Add training targeted to new trainees assigned

                            List <int> listNewTraineesIDAssigned = _compareAppService.GetMissingIntegers(arrayOldTraineesIDAssigned, arrayNewTraineesIDAssigned).ToList();

                            foreach (int newTraineeIDAssigned in listNewTraineesIDAssigned)
                            {
                                var newTraineeAssigned = _traineeRepository.Get(newTraineeIDAssigned);

                                List <int> listTrainingsTargeted = newTraineeAssigned.ArrayOfTargetedTraining.ToList();

                                //Add training to trainings targeted of this trainee
                                listTrainingsTargeted.Add(updateTrainingInput.TrainingID);
                                listTrainingsTargeted = listTrainingsTargeted.Distinct().ToList();

                                newTraineeAssigned.ArrayOfTargetedTraining = listTrainingsTargeted.ToArray();

                                var updateNewTrainee = _traineeRepository.Update(newTraineeAssigned);

                                if (updateNewTrainee.Id == 0)
                                {
                                    return(new ResponseMessageDTO(false, L("CreateTraining_Fail") + L("UnknownError")));
                                }
                            }

                            #endregion

                            //Update training information
                            training.StartDate               = DateCalculator.StringToDate(updateTrainingInput.StartDate);
                            training.EndDate                 = DateCalculator.StringToDate(updateTrainingInput.EndDate);
                            training.TotalDuration           = updateTrainingInput.TotalDuration;
                            training.ArrayOfAssignedTrainees = JsonConvert.DeserializeObject <int[]>(updateTrainingInput.AssignedTrainees);
                            training.ArrayOfAssignedTrainers = JsonConvert.DeserializeObject <int[]>(updateTrainingInput.AssignedTrainers);
                            training.ModuleArrangement       = updateTrainingInput.ModulesArrangement;

                            var updateTraining = _trainingRepository.Update(training);
                        }
                    }

                    return(new ResponseMessageDTO(true, L("UpdateTraining_Success")));
                }
            }
            catch
            {
                return(new ResponseMessageDTO(false, L("CreateTraining_Fail") + L("UnknownError")));
            }
        }