public BudgetInsightsViewModel CalculateCategoryInsights(BudgetInsightsViewModel budgetInsights, string user)
        {
            var monthListForUser = _unitOfWork.BudgetItemsRepository.GetBudgetMonthNumbersList(user);

            for (var budgetType = 1; budgetType < 7; budgetType++)
            {
                var insights = new BudgetInsightsByCategory
                {
                    CategoryType               = budgetType,
                    AvgPurchasePrice           = _unitOfWork.BudgetItemsRepository.AveragePurchasePriceByCat(monthListForUser, user, budgetType),
                    AvgSpentPerMonth           = _unitOfWork.BudgetItemsRepository.AverageMonthlySpendingByCat(monthListForUser, user, budgetType),
                    AvgOverUnderPerCategory    = _unitOfWork.BudgetItemsRepository.AvgOverUnderByCat(monthListForUser, user, budgetType),
                    NumMonthsUnderBudgetPerCat = _unitOfWork.BudgetItemsRepository.NumMonthsUnderBudgetByCat(monthListForUser, user, budgetType)
                };
                budgetInsights.BudgetInsightsByCategoryList.Add(insights);
            }

            return(budgetInsights);
        }
        public IActionResult BudgetInsights()
        {
            var user           = User.Identity.Name;
            var highestSavings = _unitOfWork.BudgetItemsRepository.HighestSavings(user).Single();
            var budgetInsights = new BudgetInsightsViewModel
            {
                AvgMonthlySpending    = _unitOfWork.BudgetItemsRepository.AvgMonthlySpending(user),
                AmtOverOrUnder        = _unitOfWork.BudgetItemsRepository.AmtOverOrUnderBudget(user),
                MostCommonCategory    = _unitOfWork.BudgetItemsRepository.MostCommonCategory(user),
                CategoryTimes         = _unitOfWork.BudgetItemsRepository.HowManyTimesCatOccur(_unitOfWork.BudgetItemsRepository.MostCommonCategory(user), user),
                NumMonthsUnderBudget  = _unitOfWork.BudgetItemsRepository.NumMonthsUnderBudget(user),
                TotalMonths           = _unitOfWork.BudgetItemsRepository.GetBudgetMonthsList(user).Count,
                TotalSpentFirstMonth  = _unitOfWork.BudgetItemsRepository.TotalSpentByMonth(DateTime.Now.Month, user),
                TotalSpentSecondMonth = _unitOfWork.BudgetItemsRepository.TotalSpentByMonth((DateTime.Now.Month - 1), user),
                HighSaveCat           = highestSavings.Key,
                HighSaveAmt           = highestSavings.Value
            };

            if (budgetInsights.AmtOverOrUnder == 0)
            {
                ViewBag.NotEnoughInfoMsg = "If multiple insights are showing a 'No Information' message, " +
                                           "there may not be enough budget data to calculate budget insights. This often happens when a new " +
                                           "budget has just been created or if a budget does not have any transactions added.";
            }

            var budgetInsightsWithCategoryInsights = CalculateCategoryInsights(budgetInsights, User.Identity.Name);

            if (budgetInsightsWithCategoryInsights.BudgetInsightsByCategoryList.Count == 0)
            {
                ViewBag.HasCategoryInsights = false;
                return(View(budgetInsightsWithCategoryInsights));
            }

            ViewBag.CategoryList = budgetInsightsWithCategoryInsights.BudgetInsightsByCategoryList.Select(x => x.CategoryType).ToList();
            var listOfCategoryNames = new List <string>();

            foreach (var category in ViewBag.CategoryList)
            {
                switch (category)
                {
                case 1:
                    listOfCategoryNames.Add("Food | Grocery");
                    break;

                case 2:
                    listOfCategoryNames.Add("Housing");
                    break;

                case 3:
                    listOfCategoryNames.Add("Bills | Payments");
                    break;

                case 4:
                    listOfCategoryNames.Add("Entertainment");
                    break;

                case 5:
                    listOfCategoryNames.Add("Gas | Auto");
                    break;

                case 6:
                    listOfCategoryNames.Add("Miscellaneous");
                    break;
                }
            }

            ViewBag.ListOfCategoryNames = listOfCategoryNames;

            return(View(budgetInsightsWithCategoryInsights));
        }