public ActionResult Index(SearchResultsViewModel model)
        {
            if (!string.IsNullOrWhiteSpace(model.Keyword))
            {
                if (!string.IsNullOrEmpty(model.TimeZoneId))
                {
                    new SearchHandler(Services).SetClientTimeZone(model.TimeZoneId);
                }

                var currentUserId = GetCurrentUserId();
                var lstSpecialist = Services.Search.StandardSearchByAmazon(model.Keyword, 0, -1, model.SortBy, currentUserId);
                if (lstSpecialist != null && lstSpecialist.Count > 0)
                {
                    model.ListResult = AutoMapper.Mapper.Map<List<SearchResultDto>, List<SearchResultViewModel>>(lstSpecialist);
                    model.Total = model.ListResult.Count;
                    foreach (var result in model.ListResult)
                    {
                        int number = result.StandardHour.Specializations.Count;
                        for (int i = 0; i < number; i++)
                        {
                            result.StandardHour.Specializations[i].CustomerPricing = Services.Booking.GetCustomerPricing(result.StandardHour.Specializations[i].Id);
                        }
                        if (currentUserId != null)
                        {
                            result.IsFavourite = Services.Users.IsFavourite(result.StandardHour.SpecialistId, currentUserId);
                        }
                        result.User.AvatarPath = S3ReaderHelper.CombineS3Root(result.User.AvatarPath);
                        result.RatingRatio = (int)Math.Round(Services.Booking.RatingCalculator(result.User.Id), 0, MidpointRounding.AwayFromZero);

                        //check current status is not "Not Available". if It is yes, it access db to check call
                        if (!AvailabilityStatus.NotAvailable.Equals(result.User.CurrentAvailabilityStatus))
                        {
                            //check specialist is calling with customer to change currentt status to "not avaiable"
                            if (Services.Call.CheckCallInProgressBySpecialistId(result.User.Id))
                            {
                                result.User.CurrentAvailabilityStatus = AvailabilityStatus.NotAvailable;
                            }
                        }
                    }
                }
            }

            return View(model);
        }
        /// <summary>
        /// Used for advance search on web and API for mobile
        /// </summary>
        /// <param name="userId">user Id</param>
        /// <param name="model">AdvancedSearchViewModel</param>
        /// <returns>SearchResultsViewModel</returns>
        public SearchResultsViewModel AdvancedSearch(
            Guid userId,
            AdvancedSearchViewModel model,
            int start, int size)
        {
            var result = new SearchResultsViewModel { SortBy = model.SortBy };
            var lstSpecialist = Services.Search.AdvancedSearchByAmazon(
                Mapper.Map<AdvancedSearchDto>(model), start, size, model.SortBy, userId);

            if (lstSpecialist != null)
            {
                result.ListResult =
                    AutoMapper.Mapper.Map<List<SearchResultDto>, List<SearchResultViewModel>>(lstSpecialist);
                result.Total = result.ListResult.Count;
                //assign calculated rate to each specialization
                foreach (var item in result.ListResult)
                {
                    int number = item.StandardHour.Specializations.Count;
                    for (int i = 0; i < number; i++)
                    {
                        item.StandardHour.Specializations[i].CustomerPricing =
                            Services.Booking.GetCustomerPricing(item.StandardHour.Specializations[i].Id);
                    }
                    item.User.AvatarPath = S3ReaderHelper.CombineS3Root(item.User.AvatarPath);
                    item.RatingRatio = (int)Math.Round(Services.Booking.RatingCalculator(item.User.Id),
                        0, MidpointRounding.AwayFromZero);

                    //check current status is not "Not Available". if It is yes, it access db to check call
                    if (!AvailabilityStatus.NotAvailable.Equals(item.User.CurrentAvailabilityStatus)
                        && Services.Call.CheckCallInProgressBySpecialistId(item.User.Id))
                    {
                        item.User.CurrentAvailabilityStatus = AvailabilityStatus.NotAvailable;
                    }
                }
                return result;
            }
            return null;
        }