public IActionResult GetSpecialists([FromQuery] GetSpecialistsList query)
        {
            var all         = SpecialistService.GetAll().ToList();
            var specialists = GetFullSpecialists(query);

            return(Ok(new SpecialistsListResponse
            {
                Data = specialists,
                PageSize = query.PageSize,
                CurrentPage = query.PageNumber,
                SortBy = query.SortBy,
                OrderBy = query.OrderBy,
                TotalPages = (int)Math.Ceiling(all.Count / (double)query.PageSize),
                TotalItems = all.Count
            }));
        }
        private List <SpecialistViewModel> GetFullSpecialists(GetSpecialistsList query)
        {
            var result      = new List <SpecialistViewModel>();
            var specialists = new List <Specialist>();

            if (query.OrderBy == OrderBy.ASC)
            {
                switch (query.SortBy)
                {
                case SpecialistsSort.Price:
                {
                    specialists.AddRange(SpecialistService.GetAll().ToList()
                                         .OrderBy(x => x.Price)
                                         .Skip((query.PageNumber - 1) * query.PageSize)
                                         .Take(query.PageSize)
                                         .ToList());

                    break;
                }

                case SpecialistsSort.Rating:
                {
                    specialists.AddRange(SpecialistService.GetAll().ToList()
                                         .OrderBy(x => ReviewService.GetSpecialistRating(x))
                                         .Skip((query.PageNumber - 1) * query.PageSize)
                                         .Take(query.PageSize)
                                         .ToList());

                    break;
                }

                case SpecialistsSort.Reviews:
                {
                    specialists.AddRange(SpecialistService.GetAll().ToList()
                                         .OrderBy(x => SessionService.GetSpecialistSessions(x).Count)
                                         .Skip((query.PageNumber - 1) * query.PageSize)
                                         .Take(query.PageSize)
                                         .ToList());

                    break;
                }

                default:
                {
                    specialists.AddRange(SpecialistService.GetAll().ToList()
                                         .OrderBy(x => x.Price)
                                         .Skip((query.PageNumber - 1) * query.PageSize)
                                         .Take(query.PageSize)
                                         .ToList());

                    break;
                }
                }
            }
            else
            {
                switch (query.SortBy)
                {
                case SpecialistsSort.Price:
                {
                    specialists.AddRange(SpecialistService.GetAll().ToList()
                                         .OrderByDescending(x => x.Price)
                                         .Skip((query.PageNumber - 1) * query.PageSize)
                                         .Take(query.PageSize)
                                         .ToList());

                    break;
                }

                case SpecialistsSort.Rating:
                {
                    specialists.AddRange(SpecialistService.GetAll().ToList()
                                         .OrderByDescending(x => ReviewService.GetSpecialistRating(x))
                                         .Skip((query.PageNumber - 1) * query.PageSize)
                                         .Take(query.PageSize)
                                         .ToList());

                    break;
                }

                case SpecialistsSort.Reviews:
                {
                    specialists.AddRange(SpecialistService.GetAll().ToList()
                                         .OrderByDescending(x => SessionService.GetSpecialistSessions(x).Count)
                                         .Skip((query.PageNumber - 1) * query.PageSize)
                                         .Take(query.PageSize)
                                         .ToList());

                    break;
                }

                default:
                {
                    specialists.AddRange(SpecialistService.GetAll().ToList()
                                         .OrderByDescending(x => x.Price)
                                         .Skip((query.PageNumber - 1) * query.PageSize)
                                         .Take(query.PageSize)
                                         .ToList());

                    break;
                }
                }
            }

            specialists.ForEach(specialist => result.Add(GetFullSpecialist(specialist)));

            return(result);
        }