public JsonResult SaveInstanceWithExercises(WorkoutInstance workoutInstance, List <WorkoutInstanceExercise> vIExercises)
        {
            //, User.Identity.Name
            var message = cService.SaveWorkoutInstanceWithExercises(workoutInstance, vIExercises, User.Identity.Name);

            return(new JsonResult()
            {
                Data = message, ContentEncoding = Encoding.UTF8
            });
        }
        public IActionResult Post([FromBody] WorkoutInstance workoutInstance)
        {
            if (workoutInstance == null)
            {
                return(BadRequest());
            }
            this.db.WorkoutInstances.Add(workoutInstance);
            this.db.SaveChanges();

            return(CreatedAtRoute("GetWorkoutInstance", new { id = workoutInstance.Id }, workoutInstance));
        }
        public List <WorkoutInstance> GetCompletedWorkoutInstances_DatePercentageList(string userName)
        {
            var cmpList            = ctx.WorkoutInstances.Include("Workout").Where(wie => wie.Status == Entities.Enums.StatusType.Completed && wie.UserId == userName).ToList();
            var datePercentageList = new List <WorkoutInstance> ();

            foreach (var wI in cmpList)
            {
                //dateList: all the entities with the date of wI.Date
                var dateList   = cmpList.Where(w => w.Date == wI.Date).ToList();
                var percentage = 0.0;
                foreach (var i in dateList)
                {
                    percentage += i.Percentage;
                }
                percentage = percentage / (dateList.Count());
                var workoutInstance = new WorkoutInstance();
                workoutInstance.Id         = Guid.NewGuid().ToString();
                workoutInstance.Date       = wI.Date;
                workoutInstance.Percentage = percentage;
                workoutInstance.Status     = StatusType.Planned;
                workoutInstance.Workout    = wI.Workout;
                workoutInstance.WorkoutId  = wI.WorkoutId;
                datePercentageList.Add(workoutInstance);
            }
            //eliminate duplicates by Date field
            for (var i = 0; i < datePercentageList.Count(); i++)
            {
                for (var j = i + 1; j < datePercentageList.Count(); j++)
                {
                    if (datePercentageList[j].Date == datePercentageList[i].Date)
                    {
                        datePercentageList.RemoveAt(j);
                    }
                }
            }
            //order by date
            datePercentageList = datePercentageList.OrderBy(w => w.Date).ToList();
            return(datePercentageList);
        }
        public IActionResult Put(int id, [FromBody] WorkoutInstance newWorkoutInstance)
        {
            if (newWorkoutInstance == null || newWorkoutInstance.Id != id)
            {
                return(BadRequest());
            }
            var currentWorkoutInstance = this.db.WorkoutInstances.FirstOrDefault(x => x.Id == id);

            if (currentWorkoutInstance == null)
            {
                return(NotFound());
            }

            currentWorkoutInstance.date      = newWorkoutInstance.date;
            currentWorkoutInstance.userId    = newWorkoutInstance.userId;
            currentWorkoutInstance.workout   = newWorkoutInstance.workout;
            currentWorkoutInstance.exercises = newWorkoutInstance.exercises;

            this.db.WorkoutInstances.Update(currentWorkoutInstance);
            this.db.SaveChanges();

            return(NoContent());
        }
        public string SaveWorkoutInstanceWithExercises(WorkoutInstance workoutInstance, List <WorkoutInstanceExercise> workoutInstanceExercises, string UserName) //, string userName
        {
            try
            {
                var oldWorkoutInstance = ctx.WorkoutInstances.FirstOrDefault(f => f.Id == workoutInstance.Id);


                if (oldWorkoutInstance == null)
                {
                    workoutInstance.Id     = Guid.NewGuid().ToString();
                    workoutInstance.Active = true;
                    workoutInstance.UserId = UserName;

                    ctx.WorkoutInstances.Add(workoutInstance);

                    //create log for Adding
                    var log = new Log();
                    log.LogId             = Guid.NewGuid().ToString();
                    log.Entity            = Entities.Enums.Entity.WorkoutInstance;
                    log.PrimaryEntityId   = workoutInstance.Id;
                    log.SecondaryEntityId = "-";
                    log.LogDate           = DateTime.Now;
                    log.Type     = Entities.Enums.Operations.Add;
                    log.Property = "-";
                    log.OldValue = "-";
                    log.NewValue = "-";
                    log.UserId   = workoutInstance.UserId;
                    ctx.Logs.Add(log);
                }
                else
                {
                    oldWorkoutInstance.WorkoutId = workoutInstance.WorkoutId;
                    if (workoutInstance.Status == Entities.Enums.StatusType.Planned)
                    {
                        if (workoutInstance.Date != DateTime.MinValue)
                        {
                            if (oldWorkoutInstance.Date != workoutInstance.Date)
                            {
                                //date has been changed => create new log
                                var log = new Log();
                                log.LogId             = Guid.NewGuid().ToString();
                                log.Entity            = Entities.Enums.Entity.WorkoutInstance;
                                log.PrimaryEntityId   = oldWorkoutInstance.Id;
                                log.SecondaryEntityId = "-";
                                log.Type     = Entities.Enums.Operations.Modify;
                                log.LogDate  = DateTime.Now;
                                log.Property = "Date";
                                log.OldValue = oldWorkoutInstance.Date.ToString("yyyy-MM-dd");
                                log.NewValue = workoutInstance.Date.ToString("yyyy-MM-dd");
                                log.UserId   = workoutInstance.UserId;
                                ctx.Logs.Add(log);
                            }
                            oldWorkoutInstance.Date = workoutInstance.Date;
                        }
                    }
                    ;
                    oldWorkoutInstance.Status = workoutInstance.Status;
                    oldWorkoutInstance.UserId = workoutInstance.UserId;
                    oldWorkoutInstance.Active = workoutInstance.Active;
                    if (oldWorkoutInstance.Rounds != workoutInstance.Rounds)
                    {
                        //Rounds have been changed = create new log
                        var log = new Log();
                        log.LogId             = Guid.NewGuid().ToString();
                        log.Entity            = Entities.Enums.Entity.WorkoutInstance;
                        log.PrimaryEntityId   = oldWorkoutInstance.Id;
                        log.SecondaryEntityId = "-";
                        log.Type     = Entities.Enums.Operations.Modify;
                        log.LogDate  = DateTime.Now;
                        log.Property = "Rounds";
                        log.OldValue = oldWorkoutInstance.Rounds.ToString();
                        log.NewValue = workoutInstance.Rounds.ToString();
                        log.UserId   = workoutInstance.UserId;
                        ctx.Logs.Add(log);
                    }
                    oldWorkoutInstance.Rounds = workoutInstance.Rounds;

                    if (workoutInstance.Status == Entities.Enums.StatusType.Completed)
                    {
                        //complete workout instance
                        var log = new Log();
                        log.LogId             = Guid.NewGuid().ToString();
                        log.Entity            = Entities.Enums.Entity.WorkoutInstance;
                        log.PrimaryEntityId   = oldWorkoutInstance.Id;
                        log.SecondaryEntityId = "-";
                        log.Type     = Entities.Enums.Operations.Compleat;
                        log.LogDate  = DateTime.Now;
                        log.Property = "Status";
                        log.OldValue = oldWorkoutInstance.Status.ToString();
                        log.NewValue = workoutInstance.Status.ToString();
                        log.UserId   = workoutInstance.UserId;
                        ctx.Logs.Add(log);
                    }
                }

                var TotalSum          = 0.0;
                var numberOfExercises = 0;
                foreach (var wIE in workoutInstanceExercises)
                {
                    var oldWorkoutInstanceExercise = ctx.WorkoutInstanceExercises.FirstOrDefault(f => f.Id == wIE.Id);
                    if (oldWorkoutInstanceExercise == null)
                    {
                        wIE.Id = Guid.NewGuid().ToString();
                        wIE.WorkoutInstanceId = workoutInstance.Id;
                        ctx.WorkoutInstanceExercises.Add(wIE);
                    }
                    else
                    {
                        if (oldWorkoutInstanceExercise.PlannedRepetitions != wIE.PlannedRepetitions)
                        {
                            //modify planned repetitions = new log for this inctance exercise
                            var log = new Log();
                            log.LogId             = Guid.NewGuid().ToString();
                            log.Entity            = Entities.Enums.Entity.WorkoutInstanceExercise;
                            log.PrimaryEntityId   = wIE.WorkoutInstanceId;
                            log.SecondaryEntityId = wIE.Id;
                            log.LogDate           = DateTime.Now;
                            log.Type     = Entities.Enums.Operations.Modify;
                            log.Property = "Planned Repetitions";
                            log.OldValue = oldWorkoutInstanceExercise.PlannedRepetitions.ToString();
                            log.NewValue = wIE.PlannedRepetitions.ToString();
                            log.UserId   = workoutInstance.UserId;
                            ctx.Logs.Add(log);
                        }
                        oldWorkoutInstanceExercise.PlannedRepetitions = wIE.PlannedRepetitions;

                        if (oldWorkoutInstanceExercise.ActualRepetitions != wIE.ActualRepetitions)
                        {
                            //complete => new log for completion of instance exercie
                            var log = new Log();
                            log.LogId             = Guid.NewGuid().ToString();
                            log.Entity            = Entities.Enums.Entity.WorkoutInstanceExercise;
                            log.PrimaryEntityId   = wIE.WorkoutInstanceId;
                            log.SecondaryEntityId = wIE.Id;
                            log.LogDate           = DateTime.Now;
                            log.Type     = Entities.Enums.Operations.Compleat;
                            log.Property = "Actual Repetitions";
                            log.OldValue = oldWorkoutInstanceExercise.ActualRepetitions.ToString();
                            log.NewValue = wIE.ActualRepetitions.ToString();
                            log.UserId   = workoutInstance.UserId;
                            ctx.Logs.Add(log);
                        }
                        oldWorkoutInstanceExercise.ActualRepetitions = wIE.ActualRepetitions;

                        if (oldWorkoutInstance.Status == Entities.Enums.StatusType.Completed)
                        {
                            numberOfExercises++;
                            TotalSum = Math.Round(TotalSum + ((oldWorkoutInstanceExercise.ActualRepetitions * 100) / oldWorkoutInstanceExercise.PlannedRepetitions), 2);
                        }
                    }
                }
                if (oldWorkoutInstance != null && oldWorkoutInstance.Status == Entities.Enums.StatusType.Completed)
                {
                    oldWorkoutInstance.Percentage = Math.Round(TotalSum / numberOfExercises, 2);
                    if (oldWorkoutInstance.Percentage <= 100.00)
                    {
                        oldWorkoutInstance.Points = Math.Round(oldWorkoutInstance.Percentage / 10, 2);
                    }
                    else
                    {
                        if (oldWorkoutInstance.Percentage <= 150.00)
                        {
                            oldWorkoutInstance.Points = 15;                                            //10+5
                        }
                        else
                        if (oldWorkoutInstance.Percentage <= 200.00)
                        {
                            oldWorkoutInstance.Points = 20;                                            //10+10
                        }
                        else
                        {
                            oldWorkoutInstance.Points = 30;  //10+20
                        }
                    }
                }
                ctx.SaveChanges();
                return(SuccessMessage);
            }
            catch (Exception ex)
            {
                return(ErrorMessage);
            }
        }