public async Task <int> PurchaseProduct(int id, AddToShoppingCart addToShoppingCart)
        {
            if (Session["authenticatedUser"] != null && Session["authenticatedToken"] != null)
            {
                client.DefaultRequestHeaders.Authorization =
                    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", Session["authenticatedToken"].ToString());

                HttpResponseMessage response = await client.PostAsJsonAsync("api/PurchaseProduct/AddtoShoppingCart/" + id, addToShoppingCart);

                if (response.IsSuccessStatusCode)
                {
                    var addedItem = await response.Content.ReadAsAsync <AddToShoppingCart>();

                    if (addedItem != null)
                    {
                        return(1);
                    }
                    return(-1);
                }
                return(-1);
            }
            return(0);
        }
        public async Task <AddToShoppingCart> AddtoShoppingCart(int id, AddToShoppingCart addToShoppingCart)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var customer = await(from c in db.Customers
                                         where c.CustomerID == id
                                         select c).FirstOrDefaultAsync();

                    if (customer != null && customer.Addresses.Count == 0)
                    {
                        Address address = new Address();
                        address.AddressType = 1;
                        address.Street      = "";
                        address.Suburb      = "";
                        address.City        = "";
                        address.Country     = "";
                        address.PostalCode  = "Dummy";
                        customer.Addresses.Add(address);
                        await db.SaveChangesAsync();

                        var query = await(from o in db.Orders
                                          where o.CustomerID == id &&
                                          o.Complete == false &&
                                          o.IsBackOrder == false
                                          select o).FirstOrDefaultAsync();

                        if (query == null)
                        {
                            Order order = new Order();
                            order.AddressID   = address.AddressID;
                            order.CustomerID  = id;
                            order.OrderDate   = DateTime.Now;
                            order.Complete    = false;
                            order.IsBackOrder = false;
                            db.Orders.Add(order);
                            customer.Orders.Add(order);
                            await db.SaveChangesAsync();

                            OrderDetail orderDetail = new OrderDetail();
                            orderDetail.OrderID   = order.OrderID;
                            orderDetail.ProductID = addToShoppingCart.ProductId;
                            orderDetail.Quantity  = addToShoppingCart.Quantity;
                            orderDetail.Packaged  = false;
                            db.OrderDetails.Add(orderDetail);
                            order.OrderDetails.Add(orderDetail);
                            await db.SaveChangesAsync();

                            return(addToShoppingCart);
                        }
                        else
                        {
                            var orderDetail = await(from od in db.OrderDetails
                                                    where od.OrderID == query.OrderID &&
                                                    od.ProductID == addToShoppingCart.ProductId
                                                    select od).FirstOrDefaultAsync();

                            if (orderDetail == null)
                            {
                                OrderDetail newDetail = new OrderDetail();
                                newDetail.OrderID   = query.OrderID;
                                newDetail.ProductID = addToShoppingCart.ProductId;
                                newDetail.Quantity  = addToShoppingCart.Quantity;
                                newDetail.Packaged  = false;
                                db.OrderDetails.Add(newDetail);
                                query.OrderDetails.Add(newDetail);

                                await db.SaveChangesAsync();

                                return(addToShoppingCart);
                            }
                            else
                            {
                                orderDetail.Quantity = orderDetail.Quantity + addToShoppingCart.Quantity;
                                await db.SaveChangesAsync();

                                return(addToShoppingCart);
                            }
                        }
                    }
                    else if (customer != null && customer.Addresses.Count != 0)
                    {
                        var query = await(from o in db.Orders
                                          where o.CustomerID == id &&
                                          o.Complete == false &&
                                          o.IsBackOrder == false
                                          select o).FirstOrDefaultAsync();

                        if (query == null)
                        {
                            var address = (from a in customer.Addresses
                                           select a).FirstOrDefault();

                            Order order = new Order();
                            order.AddressID   = address.AddressID;
                            order.CustomerID  = id;
                            order.OrderDate   = DateTime.Now;
                            order.Complete    = false;
                            order.IsBackOrder = false;
                            db.Orders.Add(order);
                            customer.Orders.Add(order);
                            await db.SaveChangesAsync();

                            OrderDetail orderDetail = new OrderDetail();
                            orderDetail.OrderID   = order.OrderID;
                            orderDetail.ProductID = addToShoppingCart.ProductId;
                            orderDetail.Quantity  = addToShoppingCart.Quantity;
                            orderDetail.Packaged  = false;
                            db.OrderDetails.Add(orderDetail);
                            order.OrderDetails.Add(orderDetail);

                            await db.SaveChangesAsync();

                            return(addToShoppingCart);
                        }
                        else
                        {
                            var orderDetail = await(from od in db.OrderDetails
                                                    where od.OrderID == query.OrderID &&
                                                    od.ProductID == addToShoppingCart.ProductId
                                                    select od).FirstOrDefaultAsync();

                            if (orderDetail == null)
                            {
                                OrderDetail newDetail = new OrderDetail();
                                newDetail.OrderID   = query.OrderID;
                                newDetail.ProductID = addToShoppingCart.ProductId;
                                newDetail.Quantity  = addToShoppingCart.Quantity;
                                newDetail.Packaged  = false;
                                db.OrderDetails.Add(newDetail);
                                query.OrderDetails.Add(newDetail);

                                await db.SaveChangesAsync();

                                return(addToShoppingCart);
                            }
                            else
                            {
                                orderDetail.Quantity = orderDetail.Quantity + addToShoppingCart.Quantity;
                                await db.SaveChangesAsync();

                                return(addToShoppingCart);
                            }
                        }
                    }
                    return(null);
                }
                return(null);
            }
            catch (Exception)
            {
                return(null);
            }
        }