public async Task <IActionResult> RemoveOfferFromCart([FromBody] CartOfferViewModel model)
        {
            try
            {
                #region Check user
                var userID = HttpContext.User.Identity.Name;
                if (userID == null)
                {
                    return(StatusCode(StatusCodes.Status401Unauthorized));
                }
                ApplicationUser user = await _context.Set <ApplicationUser>().SingleOrDefaultAsync(item => item.UserName == userID);

                Account account = _context.Set <Account>()
                                  .Include(x => x.Cart)
                                  .ThenInclude(x => x.CartItems)
                                  .FirstOrDefault(x => x.ID == user.AccountID);
                if (user == null || account == null)
                {
                    return(null);
                }
                //if (!user.IsVerified) return StatusCode(StatusCodes.Status426UpgradeRequired);
                #endregion

                var cartItems = account.Cart?.CartItems.Where(x => x.OfferID == model.OfferID);
                if (cartItems == null)
                {
                    return(NoContent());
                }
                _context.Set <CartItem>().RemoveRange(cartItems);
                await _context.SaveChangesAsync();

                await account.Cart.FixMissingOfferItems(_context);

                await account.Cart.UpdateCart(_context);

                return(NoContent());
            }
            catch (Exception ex)
            {
                return(BadRequest());
            }
        }
        public async Task <IActionResult> AddOfferToCart([FromBody] CartOfferViewModel model)
        {
            try
            {
                #region Check user
                var userID = HttpContext.User.Identity.Name;
                if (userID == null)
                {
                    return(StatusCode(StatusCodes.Status401Unauthorized));
                }
                ApplicationUser user = await _context.Set <ApplicationUser>().SingleOrDefaultAsync(item => item.UserName == userID);

                Account account = _context.Set <Account>()
                                  .Include(x => x.Cart)
                                  .ThenInclude(x => x.CartItems)
                                  .FirstOrDefault(x => x.ID == user.AccountID);
                if (user == null || account == null)
                {
                    return(null);
                }
                //if (!user.IsVerified) return StatusCode(StatusCodes.Status426UpgradeRequired);
                #endregion

                var off = _context.Set <Offer>().FirstOrDefault(x => x.ID == model.OfferID);
                if (off == null)
                {
                    return(BadRequest("No Offer related to this OfferID"));
                }

                #region Create cart for the first time
                if (account.Cart == null)
                {
                    account.Cart = new Cart()
                    {
                        CreationDate = DateTime.Now,
                        TotalAmount  = 0,
                        LastPurchase = DateTime.Now,
                    };
                }
                else
                {
                    foreach (var ci in account.Cart.CartItems)
                    {
                        if (ci.ItemID == null || ci.UnitPrice == null)
                        {
                            _context.Set <CartItem>().Remove(ci);
                        }
                    }
                }
                #endregion

                #region Add Offer
                var Offer = _context.Set <Offer>().Include(x => x.OfferItems)
                            .FirstOrDefault(x => x.ID == model.OfferID);
                OfferType offerType = OfferType.None;
                Enum.TryParse <OfferType>(Offer.OfferType, out offerType);
                var removeItem = _context.Set <CartItem>().Where(x => x.OfferID == model.OfferID);
                _context.Set <CartItem>().RemoveRange(removeItem);
                switch (offerType)
                {
                case OfferType.Discount:
                    #region Discount Offer
                    var item = await _context.Set <Item>().FirstOrDefaultAsync(x => x.ID == Offer.ItemID);

                    var cartItem = new CartItem()
                    {
                        ItemID       = item.ID,
                        CreationDate = DateTime.Now,
                        Quantity     = model.Quantity,
                        OfferID      = Offer.ID
                    };
                    account.Cart.CartItems.Add(cartItem);
                    #endregion
                    break;

                case OfferType.Free:
                    #region  Free Offer
                    var cartItemMain = new CartItem()
                    {
                        ItemID       = Offer.ItemID,
                        CreationDate = DateTime.Now,
                        Quantity     = model.Quantity,
                        OfferID      = Offer.ID
                    };
                    account.Cart.CartItems.Add(cartItemMain);
                    foreach (var offerItem in Offer.OfferItems)
                    {
                        var itemFree = await _context.Set <Item>().FirstOrDefaultAsync(x => x.ID == offerItem.ItemID);

                        if (itemFree == null)
                        {
                            continue;
                        }
                        var cartItemFree = new CartItem()
                        {
                            ItemID       = itemFree.ID,
                            CreationDate = DateTime.Now,
                            Quantity     = model.Quantity,
                            OfferID      = Offer.ID
                        };
                        account.Cart.CartItems.Add(cartItemFree);
                    }
                    #endregion
                    break;

                case OfferType.Set:
                case OfferType.None:
                default:
                    break;
                }
                #endregion

                await _context.SaveChangesAsync();

                //await account.Cart.FixMissingOfferItems(_context);
                await account.Cart.UpdateCart(_context);

                return(NoContent());
            }
            catch (Exception ex)
            {
                return(BadRequest());
            }
        }