//validate cart in case of invalid return to check cart again or pay
        //in case of error make order cancel
        public async Task <IActionResult> CheckOut()
        {
            int initCount = cartServices.GetCartList(UserName).Count;
            int resCount  = orderServices.ValidatingCartBeforAddingToCart(UserName);

            if (initCount != resCount)
            {
                return(RedirectToAction(nameof(Index), "Cart"));
            }

            var order = orderServices.GetOrder(UserName);
            int count = orderServices.AddProductToCart(UserName);


            var totalPrice = orderServices.GetOrder(UserName)?.AmountBuy;

            if (!totalPrice.HasValue)
            {
                return(View("Error"));
            }
            if (initCount != orderServices.GetOrder(UserName, null, true).OrderDetails.Count)
            {
                if (orderServices.CancelingOpenOrder(UserName))
                {
                    return(View("Error", new ErrorViewModel()
                    {
                        RequestId = "Something wrong"
                    }));
                }

                return(View("Error"));
            }

            var payment = await new Payment(totalPrice.Value)
                          .PaymentRequest("متن تست موقع خرید",
                                          Url.Action(nameof(CheckOutCallback), "Orders", new { amount = totalPrice }, Request.Scheme));

            if (payment.Status == 100)
            {
                if (orderServices.AddAuthorityToOrder(UserName, payment.Authority))
                {
                    return((IActionResult)Redirect(payment.Link));
                }
                orderServices.CancelingOpenOrder(UserName);
                return(BadRequest("خطا در پرداخت"));
            }
            else
            {
                orderServices.CancelingOpenOrder(UserName);
                return(BadRequest($"خطا در پرداخت. کد خطا:{payment.Status}"));
            }
        }