public async Task <IHttpActionResult> FindAllActivities(string title      = null, string description  = null, string keyword  = null,
                                                                string locationId = null, string locationName = null, int?ageFrom     = null,
                                                                int?ageTo         = null, DateTime?fromDate   = null, DateTime?toDate = null,
                                                                SharedEnums.TransportationFilter transportation = SharedEnums.TransportationFilter.All,
                                                                SharedEnums.ActivityPostStatus postStatus       = SharedEnums.ActivityPostStatus.Posted, bool myActivities = false, int pageIndex = 1, int pageSize = 10,
                                                                string include         = null, string orderBy = "CreateDate DESC", int?categoryId = null, int?maxPrice = null,
                                                                int?minPrice           = null, SharedEnums.ActivationStatus status = SharedEnums.ActivationStatus.Active, string adminKeyword = null,
                                                                string bookingUserName = null, string bookingUserEmail             = null,
                                                                SharedEnums.BookingConfirmationStatus bookingStatus = SharedEnums.BookingConfirmationStatus.All,
                                                                string bookingNumber = null, bool excludeAdminActivities = false, bool onlyAdminActivities = false)
        {
            try
            {
                Pager pager = new Pager()
                {
                    PageSize = pageSize, PageIndex = pageIndex
                };;


                Expression <Func <Activity, bool> > Filter = x => !x.IsDeleted;


                if (!string.IsNullOrWhiteSpace(keyword))
                {
                    keyword = keyword.ToLower().Trim();
                    Filter  = Filter.And((x) => x.TitleAr.ToLower().Trim().Contains(keyword) || x.TitleEn.ToLower().Trim().Contains(keyword) ||
                                         x.DescriptionAr.ToLower().Trim().Contains(keyword) ||
                                         x.DescriptionEn.ToLower().Trim().Contains(keyword) ||
                                         x.Category.TitleAr.ToLower().Trim().Contains(keyword) ||
                                         x.Category.TitleEn.ToLower().Trim().Contains(keyword) ||
                                         x.LocationName.ToLower().Trim().Contains(keyword));
                }

                if (!string.IsNullOrWhiteSpace(adminKeyword))
                {
                    adminKeyword = adminKeyword.ToLower().Trim();
                    Filter       = Filter.And((x) => x.TitleAr.ToLower().Trim().Contains(adminKeyword) || x.TitleEn.ToLower().Trim().Contains(adminKeyword) ||
                                              x.DescriptionAr.ToLower().Trim().Contains(adminKeyword) ||
                                              x.DescriptionEn.ToLower().Trim().Contains(adminKeyword) ||
                                              x.Category.TitleAr.ToLower().Trim().Contains(adminKeyword) ||
                                              x.Category.TitleEn.ToLower().Trim().Contains(adminKeyword) ||
                                              x.LocationName.ToLower().Trim().Contains(adminKeyword) ||
                                              x.Supplier.FirstName.ToLower().Trim().Contains(adminKeyword) ||
                                              x.Supplier.LastName.ToLower().Trim().Contains(adminKeyword) ||
                                              (x.Supplier.FirstName.ToLower().Trim() + " " + x.Supplier.LastName.ToLower().Trim()).Contains(adminKeyword) ||
                                              ("#" + x.Id.ToString()) == adminKeyword
                                              );
                }

                if (!string.IsNullOrWhiteSpace(title))
                {
                    title  = title.ToLower().Trim();
                    Filter = Filter.And((x) => x.TitleAr.ToLower().Trim().Contains(title) || x.TitleEn.ToLower().Trim().Contains(title));
                }

                if (!string.IsNullOrWhiteSpace(description))
                {
                    description = description.ToLower().Trim();
                    Filter      = Filter.And((x) => x.Description.ToLower().Trim().Contains(description));
                }

                if (!string.IsNullOrWhiteSpace(locationId))
                {
                    locationId = locationId.ToLower().Trim();
                    Filter     = Filter.And((x) => x.LocationId.ToLower().Trim() == locationId);
                }

                if (!string.IsNullOrWhiteSpace(locationName))
                {
                    locationName = locationName.ToLower().Trim();
                    Filter       = Filter.And((x) => x.LocationName.ToLower().Trim() == locationName);
                }

                if (ageFrom.HasValue)
                {
                    Filter = Filter.And((x) => x.AgeFrom >= ageFrom);
                }


                if (ageTo.HasValue)
                {
                    Filter = Filter.And((x) => x.AgeTo >= ageTo);
                }

                if (categoryId.HasValue)
                {
                    Filter = Filter.And((x) => x.CategoryId == categoryId.Value);
                }

                if (maxPrice.HasValue)
                {
                    Filter = Filter.And((x) => x.Price <= maxPrice.Value);
                }

                if (minPrice.HasValue)
                {
                    Filter = Filter.And((x) => x.Price >= minPrice.Value);
                }



                if (fromDate.HasValue && toDate.HasValue)
                {
                    Filter = Filter.And(x => (DbFunctions.TruncateTime(x.From) >= DbFunctions.TruncateTime(fromDate) && DbFunctions.TruncateTime(x.From) <= DbFunctions.TruncateTime(toDate)) ||
                                        (DbFunctions.TruncateTime(x.To) >= DbFunctions.TruncateTime(fromDate) && DbFunctions.TruncateTime(x.To) <= DbFunctions.TruncateTime(toDate)) ||
                                        (DbFunctions.TruncateTime(x.From) <= DbFunctions.TruncateTime(fromDate) && DbFunctions.TruncateTime(x.To) >= DbFunctions.TruncateTime(toDate)));
                }
                else if (fromDate.HasValue || toDate.HasValue)
                {
                    if (fromDate.HasValue)
                    {
                        Filter = Filter.And(x => DbFunctions.TruncateTime(x.From) >= DbFunctions.TruncateTime(fromDate));
                    }
                    else
                    {
                        Filter = Filter.And(x => DbFunctions.TruncateTime(x.To) <= DbFunctions.TruncateTime(toDate));
                    }
                }

                switch (transportation)
                {
                case SharedEnums.TransportationFilter.Available:
                    Filter = Filter.And(x => x.Transportation);
                    break;

                case SharedEnums.TransportationFilter.NotAvailable:
                    Filter = Filter.And(x => !x.Transportation);
                    break;

                default:
                    break;
                }

                if (excludeAdminActivities)
                {
                    Filter = Filter.And(x => x.SupplierId.HasValue);
                }
                if (onlyAdminActivities)
                {
                    Filter = Filter.And(x => !x.SupplierId.HasValue);
                }
                //TODO
                //if(Unit.UserId.IsSupplier)
                //if(this.ActiveUser.IsSupplier)
                if (this.ActiveUser == null || !this.ActiveUser.IsSupplier)
                {
                    Filter = Filter.And(x => x.IsPosted);
                }
                else if (postStatus != SharedEnums.ActivityPostStatus.All)
                {
                    if (postStatus == SharedEnums.ActivityPostStatus.Posted)
                    {
                        Filter = Filter.And(x => x.IsPosted);
                    }
                    else
                    {
                        Filter = Filter.And(x => !x.IsPosted);
                    }
                }


                if (this.ActiveUser != null && this.ActiveUser.UserType == SharedEnums.UserTypes.Manager && !onlyAdminActivities)
                {
                    if (status != SharedEnums.ActivationStatus.All)
                    {
                        if (status == SharedEnums.ActivationStatus.Active)
                        {
                            Filter = Filter.And(x => x.IsActive);
                        }
                        else
                        {
                            Filter = Filter.And(x => !x.IsActive);
                        }
                    }
                }
                else if (this.ActiveUser != null && myActivities && this.ActiveUser.IsSupplier)
                {
                    Filter = Filter.And(x => x.SupplierId == this.ActiveUser.Id);
                }
                else if (!onlyAdminActivities)
                {
                    Filter = Filter.And(x => x.IsActive);
                }


                if (!string.IsNullOrEmpty(bookingUserName))
                {
                    bookingUserName = bookingUserName.ToLower();
                    Filter          = Filter.And(x => x.Bookings.Any(y => !y.IsDeleted && ((y.User.FirstName + " " + y.User.LastName).ToLower().Contains(bookingUserName))));
                }

                if (!string.IsNullOrEmpty(bookingUserEmail))
                {
                    bookingUserEmail = bookingUserEmail.ToLower();
                    Filter           = Filter.And(x => x.Bookings.Any(y => !y.IsDeleted && y.User.Email.ToLower().Contains(bookingUserEmail)));
                }

                if (!string.IsNullOrEmpty(bookingNumber))
                {
                    bookingNumber = bookingNumber.ToLower();
                    Filter        = Filter.And(x => x.Bookings.Any(y => !y.IsDeleted && y.BookingNumber.Contains(bookingNumber)));
                }

                if (bookingStatus != SharedEnums.BookingConfirmationStatus.All)
                {
                    Filter = Filter.And(x => x.Bookings.Any(y => !y.IsDeleted && y.Status == bookingStatus));
                }

                //Get Order By
                var OrderBy = Mgr.DynamicOrderBy(orderBy);

                var activities = await Mgr.FindAll_Async(Filter, OrderBy, pager, Helper.ToStringArray(include));


                HttpContext.Current.Response.Headers.Add("access-control-expose-headers", "X-Pager");

                HttpContext.Current.Response.Headers.Add("X-Pager",
                                                         Newtonsoft.Json.JsonConvert.SerializeObject(pager));

                return(Ok(activities));
            }
            catch (Exception ex)
            {
                Unit.LogError(ex, this.ToString(), this.ActionContext.ActionArguments.ToList());
                return(InternalServerError(ex));
            }
        }
        public async Task <IHttpActionResult> FindAllMapMarks(decimal gLat, decimal gLng, decimal sLat, decimal sLng, string locationId = null,
                                                              int?ageFrom = null,
                                                              int?ageTo   = null, DateTime?fromDate = null, DateTime?toDate = null,
                                                              SharedEnums.TransportationFilter transportation = SharedEnums.TransportationFilter.All,
                                                              bool isPosted = true, bool myActivities = false, int?categoryId = null, int?maxPrice = null, int?minPrice = null)
        {
            try
            {
                Pager pager = new Pager()
                {
                    PageSize = 25, PageIndex = 1
                };;


                Expression <Func <Activity, bool> > Filter = x => !x.IsDeleted && x.IsActive;


                Filter = Filter.And(x => x.Lat >= sLat && x.Lat <= gLat);
                Filter = Filter.And(x => x.Lng >= sLng && x.Lng <= gLng);
                Filter = Filter.And(x => !x.OnlineLocation && !x.AtUserLocation);

                if (ageFrom.HasValue)
                {
                    Filter = Filter.And((x) => x.AgeFrom >= ageFrom);
                }


                if (ageTo.HasValue)
                {
                    Filter = Filter.And((x) => x.AgeTo >= ageTo);
                }

                if (categoryId.HasValue)
                {
                    Filter = Filter.And((x) => x.CategoryId == categoryId.Value);
                }

                if (maxPrice.HasValue)
                {
                    Filter = Filter.And((x) => x.Price <= maxPrice.Value);
                }

                if (minPrice.HasValue)
                {
                    Filter = Filter.And((x) => x.Price >= minPrice.Value);
                }



                if (fromDate.HasValue && toDate.HasValue)
                {
                    Filter = Filter.And(x => (DbFunctions.TruncateTime(x.From) >= DbFunctions.TruncateTime(fromDate) && DbFunctions.TruncateTime(x.From) <= DbFunctions.TruncateTime(toDate)) ||
                                        (DbFunctions.TruncateTime(x.To) >= DbFunctions.TruncateTime(fromDate) && DbFunctions.TruncateTime(x.To) <= DbFunctions.TruncateTime(toDate)) ||
                                        (DbFunctions.TruncateTime(x.From) <= DbFunctions.TruncateTime(fromDate) && DbFunctions.TruncateTime(x.To) >= DbFunctions.TruncateTime(toDate)));
                }
                else if (fromDate.HasValue || toDate.HasValue)
                {
                    if (fromDate.HasValue)
                    {
                        Filter = Filter.And(x => DbFunctions.TruncateTime(x.From) >= DbFunctions.TruncateTime(fromDate));
                    }
                    else
                    {
                        Filter = Filter.And(x => DbFunctions.TruncateTime(x.To) <= DbFunctions.TruncateTime(toDate));
                    }
                }

                switch (transportation)
                {
                case SharedEnums.TransportationFilter.Available:
                    Filter = Filter.And(x => x.Transportation);
                    break;

                case SharedEnums.TransportationFilter.NotAvailable:
                    Filter = Filter.And(x => !x.Transportation);
                    break;

                default:
                    break;
                }

                //TODO
                //if(Unit.UserId.IsSupplier)
                Filter = Filter.And(x => x.IsPosted == isPosted);


                if (myActivities)
                {
                    Filter = Filter.And(x => x.SupplierId == Unit.UserId);
                }

                var marks = await Mgr.FindAllMarks(Filter);


                HttpContext.Current.Response.Headers.Add("access-control-expose-headers", "X-Pager");

                HttpContext.Current.Response.Headers.Add("X-Pager",
                                                         Newtonsoft.Json.JsonConvert.SerializeObject(pager));

                return(Ok(marks));
            }
            catch (Exception ex)
            {
                Unit.LogError(ex, this.ToString(), this.ActionContext.ActionArguments.ToList());
                return(InternalServerError(ex));
            }
        }