/// <summary>
        /// Send a checkout request with the provided information to AuthorizeNet
        /// </summary>
        /// <returns>Redirect to Checkout Success page if transation successful, show ModelState errors on form if not</returns>
        public async Task <IActionResult> OnPost()
        {
            #region AddressBuilding
            var currentUser = await _userManager.GetUserAsync(User);

            customerAddressType billingAddress = new customerAddressType
            {
                address   = Input.BillingAddress,
                firstName = Input.FirstName,
                lastName  = Input.LastName,
                email     = currentUser.Email,
                state     = Input.BillingState,
                zip       = Input.BillingZip,
                city      = Input.BillingCity,
            };
            customerAddressType shippingAddress = new customerAddressType();
            if (Input.SameBillingAndShipping)
            {
                shippingAddress = billingAddress;
            }
            else
            {
                shippingAddress.address   = Input.ShippingAddress;
                shippingAddress.firstName = Input.FirstName;
                shippingAddress.lastName  = Input.LastName;
                shippingAddress.email     = currentUser.Email;
                shippingAddress.state     = Input.ShippingState;
                shippingAddress.zip       = Input.ShippingZip;
                shippingAddress.city      = Input.ShippingCity;
            }
            #endregion
            if (ModelState.IsValid)
            {
                var cart = await _cart.GetUserCart(currentUser.Id);

                if (cart != null && cart.CartItems != null)
                {
                    creditCardType card = new creditCardType()
                    {
                        cardNumber     = Input.CardNumber,
                        expirationDate = "1220",
                        cardCode       = "555"
                    };

                    TransactionResponse result = _payment.Run(card, billingAddress, cart.CartItems);
                    if (result.Successful)
                    {
                        decimal         total     = 0;
                        List <CartItem> cartItems = new List <CartItem>();
                        foreach (var item in cart.CartItems)
                        {
                            cartItems.Add(item);
                            total += item.Qty * item.Product.Price;
                        }

                        OrderCart order = new OrderCart()
                        {
                            CartId          = cart.Id,
                            UserId          = currentUser.Id,
                            FirstName       = billingAddress.firstName,
                            LastName        = billingAddress.lastName,
                            Date            = DateTime.Now.ToString(),
                            BillingAddress  = billingAddress.address,
                            BillingCity     = billingAddress.city,
                            BillingState    = billingAddress.state,
                            BillingZip      = billingAddress.zip,
                            ShippingAddress = shippingAddress.address,
                            ShippingCity    = shippingAddress.city,
                            ShippingState   = shippingAddress.state,
                            ShippingZip     = shippingAddress.zip
                        };
                        await _order.Create(order);

                        order.CartItems = new List <OrderCartItem>();
                        foreach (var item in cartItems)
                        {
                            OrderCartItem orderItem = new OrderCartItem()
                            {
                                OrderCartId = cart.Id,
                                ProductId   = item.ProductId,
                                Qty         = item.Qty
                            };
                            order.CartItems.Add(orderItem);
                            await _orderItem.Create(orderItem);

                            await _cartItem.Delete(item.CartId, item.ProductId);
                        }

                        await _cart.Delete(currentUser.Id);

                        await BuildCheckoutEmail(currentUser.Email, $"{order.FirstName} {order.LastName}", cartItems, $"{shippingAddress.address} {shippingAddress.city}, {shippingAddress.state} {shippingAddress.zip}", total);

                        if (Input.SaveBillingAddress)
                        {
                            currentUser.Address = Input.BillingAddress;
                            currentUser.City    = Input.BillingCity;
                            currentUser.State   = Input.BillingState;
                            currentUser.Zip     = Input.BillingZip;
                            if (Input.BillingOptionalAddition != null || Input.BillingOptionalAddition != "")
                            {
                                currentUser.OptionalAddress = Input.BillingOptionalAddition;
                            }
                            await _userManager.UpdateAsync(currentUser);
                        }

                        return(RedirectToPage("/Checkout/Success", new { response = result.Response, cartId = cart.Id }));
                    }
                    else
                    {
                        ModelState.AddModelError("", result.Response);
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Something went wrong! We couldn't find anything in your cart.");
                }
            }
            else
            {
                ModelState.AddModelError("", "Invalid input. Please try again.");
            }
            return(Page());
        }