public async Task<HttpResponseMessage> ExecuteEvent(Event e)
 {
     var result = await new DbInteractions().ExecuteEvent(e.Id, false);
     var response = Request.CreateResponse(result.Item2);
     response.ReasonPhrase = result.Item1;
     return response;
 }
 /// <summary>
 /// Execute event on API
 /// </summary>
 /// <param name="eventToExecute">Event to execute</param>
 /// <returns>Tuple of bool and string, bool == true when API succeded, bool == false when API did not succeed, string == fail message.</returns>
 public Tuple<bool, string> PutExecuteEvent(Event eventToExecute)
 {
     using (var client = new HttpClient())
     {
         client.BaseAddress = _baseAddress;
         var response = client.PutAsXmlAsync("api/order/executeevent", eventToExecute).Result;
         if (response.IsSuccessStatusCode)
         {
             return new Tuple<bool, string>(true, response.StatusCode.ToString());
         }
         else //do failure thing
         {
             return new Tuple<bool, string>(false, "Could not execute event: Error from Web api: " + response.StatusCode.ToString() + ": " + response.ReasonPhrase);
         }
     }
 }
        /// <summary>
        /// Method to find orders in the database, while filtering events so that only pending and edit events are loaded.
        /// </summary>
        /// <param name="restaurant"></param>
        /// <returns></returns>
        public async Task<Tuple<List<DROM_Client.Models.BusinessObjects.Order>, string, HttpStatusCode>> GetOrdersWithSortedEvents(int restaurant)
        {
            try
            {


                using (var db = new Database())
                {
                    //get non arcihved orders from database, with only relevant events.
                    //Projection is used to get the data, since filtering on child collections is not availeble in eager loading https://msdn.microsoft.com/en-us/magazine/hh205756.aspx

                    var query = await (from o in db.Orders
                                 where o.Archived == false
                                 where o.RestaurantId == restaurant
                                 select
                                     new
                                     {
                                         Order = o,
                                         //child collections aren't loaded, and have to be selected seperately

                                         Graph = o.DCRGraph,
                                         Events = (from e in o.DCRGraph.DCREvents
                                                   where
                                                           (
                                                           e.Pending
                                                           && e.Included
                                                           && !e.Conditions.Any(
                                                               c => c.Included
                                                               && c.Executed == false)
                                                           && !e.Milestones.Any(
                                                               m => m.Included
                                                               && m.Pending)
                                                           )
                                                       ||
                                                           (
                                                           e.Groups.Any(g => g.Name == "Edit events")
                                                           && e.Included
                                                           )
                                                   select new
                                                   {
                                                       Event = e,
                                                       Groups = e.Groups,
                                                       Roles = e.Roles
                                                   }
                                         ),
                                         Customer = o.Customer,
                                         OrderDetails = o.OrderDetails,
                                         Items = (from od in o.OrderDetails
                                                  select new
                                                  {
                                                      Item = od.Item,
                                                      Category = od.Item.Category,
                                                      Quantity = od.Quantity
                                                  }
                                         ),
                                     }).ToListAsync();
                    
                    
                    var orders = new List<DROM_Client.Models.BusinessObjects.Order>();

                    //go through all the orders loaded from the database ad make DTOs
                    foreach (var queryOrder in query)
                    {
                        //Make a DTO order and set all the non collection type properties
                        var order = new DROM_Client.Models.BusinessObjects.Order()
                        {
                            Id = queryOrder.Order.Id,
                            Notes = queryOrder.Order.Notes,
                            OrderDate = queryOrder.Order.OrderDate,
                            OrderType = queryOrder.Order.OrderType,
                            Table = queryOrder.Order.Table,
                            AcceptingState = queryOrder.Graph.AcceptingState,
                            Restaurant = restaurant
                        };
                        
                        var events = new List<Event>();

                        //Assemble events - meaning put the disjointed information together in one object.
                        foreach (var e in queryOrder.Events)
                        {
                            var assemblyEvent = new Event
                            {
                                Description = e.Event.Description,
                                Executed = e.Event.Executed,
                                Id = e.Event.Id,
                                Included = e.Event.Included,
                                Label = e.Event.Label,
                                Pending = e.Event.Pending,
                                Groups = new List<Group>()
                            };
                            foreach (var g in e.Groups)
                            {
                                assemblyEvent.Groups.Add(new Group()
                                {
                                    Id = g.Id,
                                    Name = g.Name
                                });
                            }
                            assemblyEvent.Roles = new List<Role>();
                            foreach (var r in e.Roles)
                            {
                                assemblyEvent.Roles.Add(new Role()
                                {
                                    Id = r.Id,
                                    Name = r.Name
                                });
                            }
                            events.Add(assemblyEvent);
                        }

                        //make the DCRGraph, to be put onto the order, with all the newly assembled events in it
                        order.DCRGraph = new DROM_Client.Models.BusinessObjects.DCRGraph()
                        {
                            Id = queryOrder.Graph.Id,
                            Events = events
                        };


                        order.ItemsAndQuantity = new List<ItemQuantity>();
                        //put item, quantity and category together to form the DTO Item and quantity.
                        foreach (var i in queryOrder.Items)
                        {
                            order.ItemsAndQuantity.Add(new ItemQuantity()
                            {
                                Item = new DROM_Client.Models.BusinessObjects.Item()
                                {
                                    Id = i.Item.Id,
                                    Description = i.Item.Description,
                                    Price = i.Item.Price,
                                    Name = i.Item.Name,
                                    Category = i.Category.Name
                                },
                                Quantity = i.Quantity

                            });
                        }

                        //If there is a customer, include it.
                        if (queryOrder.Customer != null)
                        {
                            //map customer to DTO Customer
                            order.Customer = new DROM_Client.Models.BusinessObjects.Customer()
                            {
                                Id = queryOrder.Customer.Id,
                                City = queryOrder.Customer.City,
                                Phone = queryOrder.Customer.Phone,
                                ZipCode = queryOrder.Customer.Zipcode,
                                Email = queryOrder.Customer.Email,
                                StreetAndNumber = queryOrder.Customer.StreetAndNumber,
                                LastName = queryOrder.Customer.LastName,
                                FirstAndMiddleNames = queryOrder.Customer.FirstName
                            };
                        }

                        orders.Add(order);
                    }

                    return new Tuple<List<DROM_Client.Models.BusinessObjects.Order>, string, HttpStatusCode>(orders,
                        "Success", HttpStatusCode.OK);
                }
            }
            catch (Exception ex)
            {
                return new Tuple<List<DROM_Client.Models.BusinessObjects.Order>, string, HttpStatusCode>(null,
                        ex.Message, HttpStatusCode.InternalServerError);
            }
        }