private void MarkSecondDelivery(ScoreCardFrame scoreCardFrame, DeliveryInputViewModel deliveryInputViewModel)
 {
     if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.OpenFrame)
     {
         scoreCardFrame.SecondDeliveryMark  = UserDeliveryMessages.OPEN_FRAME_DELIVERY_CODE;
         scoreCardFrame.SecondDeliveryScore = 0;
     }
     else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Foul)
     {
         scoreCardFrame.SecondDeliveryScore = 0;
         scoreCardFrame.SecondDeliveryMark  = UserDeliveryMessages.FOUL_DELIVERY_CODE;
     }
     else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Spare)
     {
         //score the next time mark as /
         scoreCardFrame.SecondDeliveryMark = UserDeliveryMessages.SPARE_DELIVERY_CODE;
         int firstScore = scoreCardFrame.FirstDeliveryScore;
         scoreCardFrame.SecondDeliveryScore = 10 - firstScore;
     }
     else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Split)
     {
         //simply save the score and prepend pins down with S
         scoreCardFrame.SecondDeliveryMark =
             UserDeliveryMessages.SPLIT_DELIVERY_CODE + deliveryInputViewModel.SelectedPinsDownCount;
         scoreCardFrame.SecondDeliveryScore = deliveryInputViewModel.SelectedPinsDownCount;
     }
     else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.StandardRoll)
     {
         scoreCardFrame.SecondDeliveryScore = deliveryInputViewModel.SelectedPinsDownCount;
         scoreCardFrame.SecondDeliveryMark  = deliveryInputViewModel.SelectedPinsDownCount.ToString();
     }
 }
        public void SaveDelivery(ScoreCardViewModel scoreCardViewModel, DeliveryInputViewModel deliveryInputViewModel)
        {
            ScoreCardFrame currentFrame = scoreCardViewModel.ScoreCardRows[scoreCardViewModel.CurrentScoreCardRowIndex]
                                          .ScoreCardFrames[scoreCardViewModel.CurrentFrameId];

            ScoreCardFrame previousFrame = new ScoreCardFrame();

            if (scoreCardViewModel.CurrentFrameId > 0)
            {
                previousFrame = scoreCardViewModel.ScoreCardRows[scoreCardViewModel.CurrentScoreCardRowIndex]
                                .ScoreCardFrames[scoreCardViewModel.CurrentFrameId - 1];
            }

            ScoreCardFrame twoFramesBackFrame = new ScoreCardFrame();

            if (scoreCardViewModel.CurrentFrameId > 1)
            {
                twoFramesBackFrame = scoreCardViewModel.ScoreCardRows[scoreCardViewModel.CurrentScoreCardRowIndex]
                                     .ScoreCardFrames[scoreCardViewModel.CurrentFrameId - 2];
            }

            if (deliveryInputViewModel.CurrDeliveryInFrameIndex == 0 &&
                deliveryInputViewModel.FrameIndex < 9)
            {
                MarkFirstDelivery(currentFrame, deliveryInputViewModel);
            }
            else if (deliveryInputViewModel.CurrDeliveryInFrameIndex == 1 &&
                     deliveryInputViewModel.FrameIndex < 9)
            {
                MarkSecondDelivery(currentFrame, deliveryInputViewModel);
                ScorePrevFrameForStrikesAndSpares(twoFramesBackFrame, previousFrame, currentFrame, deliveryInputViewModel);
                ScoreRegularFrames(previousFrame, currentFrame, deliveryInputViewModel);
            }

            if (deliveryInputViewModel.FrameIndex == 9 &&
                deliveryInputViewModel.CurrDeliveryInFrameIndex == 0)
            {
                MarkFirstDelivery(currentFrame, deliveryInputViewModel);
            }
            else if (deliveryInputViewModel.FrameIndex == 9 &&
                     deliveryInputViewModel.CurrDeliveryInFrameIndex == 1)
            {
                MarkSecondDelivery(currentFrame, deliveryInputViewModel);
                if (deliveryInputViewModel.FrameIndex == 9 &&
                    deliveryInputViewModel.SelectedDeliveryCode != (int)FrameStatusEnum.Strike &&
                    deliveryInputViewModel.SelectedDeliveryCode != (int)FrameStatusEnum.Spare)
                {
                    ScoreTenthFrame(previousFrame, currentFrame, deliveryInputViewModel);
                    scoreCardViewModel.IsUserGameComplete = true;
                }
            }
            else if (deliveryInputViewModel.FrameIndex == 9 &&
                     deliveryInputViewModel.CurrDeliveryInFrameIndex == 2)
            {
                MarkTenthFrameBonusDeliveries(currentFrame, deliveryInputViewModel);
                ScoreTenthFrame(previousFrame, currentFrame, deliveryInputViewModel);
                scoreCardViewModel.IsUserGameComplete = true;
            }
        }
        public IActionResult BowlingDeliveryInput(DeliveryInputViewModel deliveryInputViewModel)
        {
            //using session state in place of database for small demo and persistence between pages.
            ScoreCardViewModel scoreCardViewModel = JsonConvert.DeserializeObject <ScoreCardViewModel>(HttpContext.Session.GetString("GameFullData"));

            //validation failed, selection and field info persists, dpdn collections must be reloaded...
            if (!ModelState.IsValid)
            {
                DeliveryInputViewModel invalidViewModel = LoadDeliveryInputViewModel(deliveryInputViewModel.CurrentRowIndex,
                                                                                     deliveryInputViewModel.FrameIndex,
                                                                                     deliveryInputViewModel.CurrDeliveryInFrameIndex,
                                                                                     deliveryInputViewModel.PreviousDeliveryTypeCode,
                                                                                     deliveryInputViewModel.PreviousDeliveryPinsDown);
                return(View(invalidViewModel));
            }

            _deliveryService.SaveDelivery(scoreCardViewModel, deliveryInputViewModel);


            //for non10th frames where first roll is not a strike
            //hand off values to cache collection and increment delivery/roll index to never exceed 0 or 1
            if (scoreCardViewModel.CurrentFrameId < 9 &&
                deliveryInputViewModel.CurrDeliveryInFrameIndex == 0 &&
                deliveryInputViewModel.SelectedDeliveryCode != (int)FrameStatusEnum.Strike)
            {
                scoreCardViewModel.PreviousPinDownCount        = deliveryInputViewModel.SelectedPinsDownCount;
                scoreCardViewModel.PreviousDeliveryType        = deliveryInputViewModel.SelectedDeliveryCode;
                scoreCardViewModel.CurrentDeliveryInFrameIndex =
                    deliveryInputViewModel.CurrDeliveryInFrameIndex == 1
                        ? 0
                        : ++deliveryInputViewModel.CurrDeliveryInFrameIndex;
            }//strike or second roll for non10th frames, zero out roll data and increment frame index;
            else if (scoreCardViewModel.CurrentFrameId < 9 &&
                     (deliveryInputViewModel.CurrDeliveryInFrameIndex == 1 ||
                      deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Strike))
            {
                scoreCardViewModel.PreviousPinDownCount        = 0;
                scoreCardViewModel.PreviousDeliveryType        = 0;
                scoreCardViewModel.CurrentDeliveryInFrameIndex = 0;
                ++scoreCardViewModel.CurrentFrameId;
            }
            else//handle 10th frame, never exceed 2 in roll index and pass selections to cache
            {
                scoreCardViewModel.PreviousPinDownCount        = deliveryInputViewModel.SelectedPinsDownCount;
                scoreCardViewModel.PreviousDeliveryType        = deliveryInputViewModel.SelectedDeliveryCode;
                scoreCardViewModel.CurrentDeliveryInFrameIndex =
                    deliveryInputViewModel.CurrDeliveryInFrameIndex == 3
                        ? 0
                        : ++deliveryInputViewModel.CurrDeliveryInFrameIndex;
            }

            HttpContext.Session.SetString("GameFullData", JsonConvert.SerializeObject(scoreCardViewModel));

            return(RedirectToAction("BowlingGame"));
        }
 private void ScorePrevFrameForStrikesAndSpares(ScoreCardFrame twoFramesBackFrame,
                                                ScoreCardFrame prevScoreCardFrame,
                                                ScoreCardFrame currScoreCardFrame,
                                                DeliveryInputViewModel deliveryInputViewModel)
 {
     if (prevScoreCardFrame.SecondDeliveryMark.Equals(UserDeliveryMessages.STRIKE_DELIVERY_CODE))
     {
         prevScoreCardFrame.FrameCumulativeScore = twoFramesBackFrame.FrameCumulativeScore
                                                   + 10
                                                   + currScoreCardFrame.FirstDeliveryScore
                                                   + currScoreCardFrame.SecondDeliveryScore;
     }
     else if (prevScoreCardFrame.SecondDeliveryMark.Equals(UserDeliveryMessages.SPARE_DELIVERY_CODE))
     {
         prevScoreCardFrame.FrameCumulativeScore = twoFramesBackFrame.FrameCumulativeScore +
                                                   10 + currScoreCardFrame.FirstDeliveryScore;
     }
 }
 private void MarkFirstDelivery(ScoreCardFrame cardFrame, DeliveryInputViewModel deliveryInputViewModel)
 {
     if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.OpenFrame)
     {
         cardFrame.FirstDeliveryMark  = UserDeliveryMessages.OPEN_FRAME_DELIVERY_CODE;
         cardFrame.FirstDeliveryScore = 0;
     }
     else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Foul)
     {
         cardFrame.FirstDeliveryScore = 0;
         cardFrame.FirstDeliveryMark  = UserDeliveryMessages.FOUL_DELIVERY_CODE;
     }
     else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Split)
     {
         cardFrame.FirstDeliveryMark =
             UserDeliveryMessages.SPLIT_DELIVERY_CODE + deliveryInputViewModel.SelectedPinsDownCount;
         cardFrame.FirstDeliveryScore = deliveryInputViewModel.SelectedPinsDownCount;
     }
     else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Strike)
     {
         if (deliveryInputViewModel.FrameIndex == 9)
         {
             cardFrame.FirstDeliveryScore = 10;
             cardFrame.FirstDeliveryMark  = UserDeliveryMessages.STRIKE_DELIVERY_CODE;
         }
         else
         {
             cardFrame.SecondDeliveryScore = 10;
             cardFrame.SecondDeliveryMark  = UserDeliveryMessages.STRIKE_DELIVERY_CODE;
         }
     }
     else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.StandardRoll)
     {
         cardFrame.FirstDeliveryScore = deliveryInputViewModel.SelectedPinsDownCount;
         cardFrame.FirstDeliveryMark  = deliveryInputViewModel.SelectedPinsDownCount.ToString();
     }
 }
        private DeliveryInputViewModel LoadDeliveryInputViewModel(int currRowIndex, int currFrameId, int currDeliveryInFrameIndex,
                                                                  int prevDeliveryType, int prevPinsDown)
        {
            ScoreCardViewModel scoreCardViewModel = JsonConvert.DeserializeObject <ScoreCardViewModel>(HttpContext.Session.GetString("GameFullData"));

            DeliveryInputViewModel deliveryInputViewModel = new DeliveryInputViewModel();

            deliveryInputViewModel.FrameIndex = currFrameId;
            deliveryInputViewModel.PreviousDeliveryPinsDown = prevPinsDown;
            deliveryInputViewModel.PreviousDeliveryTypeText = _deliveryService.GetDeliveryStatusText(prevDeliveryType);
            deliveryInputViewModel.FirstName                = scoreCardViewModel.ScoreCardRows[currRowIndex].FirstName;
            deliveryInputViewModel.LastName                 = scoreCardViewModel.ScoreCardRows[currRowIndex].LastName;
            deliveryInputViewModel.CurrentRowIndex          = currRowIndex;
            deliveryInputViewModel.PreviousDeliveryTypeCode = prevDeliveryType;

            if (currFrameId < 10)
            {
                deliveryInputViewModel.CurrDeliveryInFrameIndex = currDeliveryInFrameIndex;
            }
            deliveryInputViewModel.DeliveryTypes = new List <SelectListItem>()
            {
                new SelectListItem()
                {
                    Text = "Split", Value = ((int)FrameStatusEnum.Split).ToString()
                },
                new SelectListItem()
                {
                    Text = "Missed Pins", Value = ((int)FrameStatusEnum.OpenFrame).ToString()
                },
                new SelectListItem()
                {
                    Text = "Foul", Value = ((int)FrameStatusEnum.Foul).ToString()
                },
                new SelectListItem()
                {
                    Text = "Standard Roll", Value = ((int)FrameStatusEnum.StandardRoll).ToString()
                }
            };

            //first 9 frames should offer a strike only on first roll/delivery, as that ends the frame
            if (prevDeliveryType == 0 && currFrameId < 9)
            {
                deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem()
                {
                    Text = "Strike", Value = ((int)FrameStatusEnum.Strike).ToString()
                });
            }//tenth frame should provide option for all strikes
            else if (prevDeliveryType != 0 && currFrameId < 9)//only 2nd roll should provide a spare option
            {
                deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem()
                {
                    Text = "Spare", Value = ((int)FrameStatusEnum.Spare).ToString()
                });
            }
            else if (currFrameId == 9)
            {//
                if (currDeliveryInFrameIndex == 0)
                {
                    deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem()
                    {
                        Text = "Strike", Value = ((int)FrameStatusEnum.Strike).ToString()
                    });
                }
                else
                {
                    if (prevDeliveryType == (int)FrameStatusEnum.Strike ||
                        prevDeliveryType == (int)FrameStatusEnum.Spare)
                    {
                        deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem()
                        {
                            Text = "Strike", Value = ((int)FrameStatusEnum.Strike).ToString()
                        });
                    }
                    else
                    {
                        deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem()
                        {
                            Text = "Spare", Value = ((int)FrameStatusEnum.Spare).ToString()
                        });
                    }
                }
            }

            deliveryInputViewModel.CountOfPinsAvailable = new List <SelectListItem>();
            //can't be null, but not sure if populating is needed given js manipulation
            for (int i = 1; i < 10 - prevPinsDown; i++)
            {
                deliveryInputViewModel.CountOfPinsAvailable.Add(
                    new SelectListItem()
                {
                    Text = i.ToString(), Value = i.ToString()
                });
            }

            return(deliveryInputViewModel);
        }
        private void ScoreRegularFrames(ScoreCardFrame prevScoreCardFrame, ScoreCardFrame currScoreCardFrame, DeliveryInputViewModel deliveryInputViewModel)
        {
            if (currScoreCardFrame.FrameId == 0 &
                !currScoreCardFrame.FirstDeliveryMark.Equals(UserDeliveryMessages.STRIKE_DELIVERY_CODE) &&
                !currScoreCardFrame.SecondDeliveryMark.Equals(UserDeliveryMessages.SPARE_DELIVERY_CODE))
            {
                currScoreCardFrame.FrameCumulativeScore =
                    currScoreCardFrame.FirstDeliveryScore + currScoreCardFrame.SecondDeliveryScore;
                //return;
            }
            else if (!currScoreCardFrame.FirstDeliveryMark.Equals(UserDeliveryMessages.STRIKE_DELIVERY_CODE) &&
                     !currScoreCardFrame.SecondDeliveryMark.Equals(UserDeliveryMessages.SPARE_DELIVERY_CODE))
            {
                currScoreCardFrame.FrameCumulativeScore = prevScoreCardFrame.FrameCumulativeScore +
                                                          currScoreCardFrame.FirstDeliveryScore +
                                                          currScoreCardFrame.SecondDeliveryScore;
            }

            //if (prevScoreCardFrame.FirstDeliveryMark.Equals(UserDeliveryMessages.STRIKE_DELIVERY_CODE))
            //{
            //    prevScoreCardFrame.FrameCumulativeScore = prevScoreCardFrame.FirstDeliveryScore +
            //                                              currScoreCardFrame.FirstDeliveryScore +
            //                                              currScoreCardFrame.SecondDeliveryScore;
            //}
            //else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Spare)
            //{
            //    prevScoreCardFrame.FrameCumulativeScore = prevScoreCardFrame.FirstDeliveryScore +
            //                                              currScoreCardFrame.FirstDeliveryScore;
            //}
        }
 private void ScoreTenthFrame(ScoreCardFrame prevFrame, ScoreCardFrame tenthFrame, DeliveryInputViewModel deliveryInputViewModel)
 {
     tenthFrame.FrameCumulativeScore = prevFrame.FrameCumulativeScore +
                                       tenthFrame.FirstDeliveryScore +
                                       tenthFrame.SecondDeliveryScore +
                                       tenthFrame.BonusDeliveryScore;
 }