public async Task <DoctorDetailsDTO> GetDoctorDetailsAsync(int serviceSupplyId, Lang lang, int?centerServiceId = null, int?offerId = null)
        {
            var serviceSupply = await _serviceSupplyService.GetServiceSupplyByIdAsync(serviceSupplyId);

            if (serviceSupply == null)
            {
                throw new AwroNoreException(Global.Err_DoctorNotFound);
            }

            var Lng = lang;

            // Get all places that doctor work
            var suppliedSerivices         = _serviceSupplyService.Table.Where(x => x.PersonId == serviceSupply.PersonId && x.IsAvailable).ToList();
            var healthCentersWorkingHours = new List <DoctorCenterModel>();

            foreach (var item in suppliedSerivices)
            {
                var centerName    = "";
                var centertype    = HealthCenterType.Polyclinic;
                var centerAddress = "";
                if (item.ShiftCenter.IsIndependent)
                {
                    centerName    = Lng == Lang.AR ? item.ShiftCenter.Name_Ar : Lng == Lang.KU ? item.ShiftCenter.Name_Ku : item.ShiftCenter.Name;
                    centertype    = HealthCenterType.Polyclinic;
                    centerAddress = Lng == Lang.AR ? $"{item.ShiftCenter.City.Name_Ar}: {item.ShiftCenter.Address_Ar}" : lang == Lang.KU ? $"{item.ShiftCenter.City.Name_Ku}: {item.ShiftCenter.Address_Ku}" : $"{item.ShiftCenter.City.Name}: {item.ShiftCenter.Address}";
                }
                else if (!item.ShiftCenter.IsIndependent && item.ShiftCenter.Clinic.IsIndependent)
                {
                    centerName    = Lng == Lang.AR ? item.ShiftCenter.Clinic.Name_Ar : Lng == Lang.KU ? item.ShiftCenter.Clinic.Name_Ku : item.ShiftCenter.Clinic.Name;
                    centertype    = HealthCenterType.Clinic;
                    centerAddress = Lng == Lang.AR ? item.ShiftCenter.Clinic.City.Name_Ar : Lng == Lang.KU ? item.ShiftCenter.Clinic.City.Name_Ku + ": " + item.ShiftCenter.Clinic.Address_Ku : item.ShiftCenter.Clinic.City.Name + ": " + item.ShiftCenter.Clinic.Address;
                }
                else
                {
                    centerName    = Lng == Lang.AR ? item.ShiftCenter.Clinic.Hospital.Name_Ar : Lng == Lang.KU ? item.ShiftCenter.Clinic.Hospital.Name_Ku : item.ShiftCenter.Clinic.Hospital.Name;
                    centertype    = HealthCenterType.Hospital;
                    centerAddress = Lng == Lang.AR ? $"{item.ShiftCenter.Clinic.Hospital.City.Name_Ar}: {item.ShiftCenter.Clinic.Hospital.Address_Ar}" : Lng == Lang.KU ? $"{item.ShiftCenter.Clinic.Hospital.City.Name_Ku}: {item.ShiftCenter.Clinic.Hospital.Address_Ku}" : $"{item.ShiftCenter.Clinic.Hospital.City.Name}: {item.ShiftCenter.Clinic.Hospital.Address}";
                }

                var WorkingHours = new List <WorkingHourModel>();
                var plans        = item.UsualSchedulePlans.Where(x => x.ServiceSupplyId == serviceSupplyId).OrderBy(x => x.DayOfWeek).ToList();
                foreach (var schedule in plans)
                {
                    WorkingHours.Add(new WorkingHourModel
                    {
                        DayOfWeek = Utils.ConvertDayOfWeek(schedule.DayOfWeek.ToString()),
                        Shift     = schedule.Shift == ScheduleShift.Morning ? Global.Morning : Global.Evening,
                        FromTime  = schedule.StartTime,
                        ToTime    = schedule.EndTime,
                        Service   = Lng == Lang.AR ? schedule.ShiftCenterService?.Service.Name_Ar : Lng == Lang.KU ? schedule.ShiftCenterService?.Service.Name_Ku : schedule.ShiftCenterService?.Service.Name,
                        MaxCount  = schedule.MaxCount
                    });
                }

                healthCentersWorkingHours.Add(new DoctorCenterModel
                {
                    CenterName    = centerName,
                    CenterType    = centertype,
                    CenterAddress = centerAddress,
                    WorkingHoures = WorkingHours
                });
            }

            TurnModel firstTurn = null;

            if (centerServiceId != null)
            {
                firstTurn = await GetNextFirstAvailableTurnAsync(serviceSupplyId, centerServiceId.Value, lang);
            }

            var firstExpertise = serviceSupply.DoctorExpertises.FirstOrDefault();

            var result = new DoctorDetailsDTO
            {
                Id                   = serviceSupply.Id,
                FullName             = lang == Lang.KU ? serviceSupply.Person.FullName_Ku : lang == Lang.AR ? serviceSupply.Person.FullName_Ar : serviceSupply.Person.FullName,
                Avatar               = serviceSupply.Person.RealAvatar,
                ExpertiseCategory    = firstExpertise != null ? lang == Lang.AR ? firstExpertise.Expertise.ExpertiseCategory.Name_Ar : lang == Lang.KU ? firstExpertise.Expertise.ExpertiseCategory.Name_Ku : firstExpertise.Expertise.ExpertiseCategory.Name : "",
                Address              = lang == Lang.KU ? serviceSupply.ShiftCenter.Address_Ku : lang == Lang.AR ? serviceSupply.ShiftCenter.Address_Ar : serviceSupply.ShiftCenter.Address,
                HasEmptyTurn         = firstTurn != null,
                Province             = serviceSupply.ShiftCenter.IsIndependent ? (Lng == Lang.AR ? serviceSupply.ShiftCenter.City.Province.Name_Ar : Lng == Lang.KU ? serviceSupply.ShiftCenter.City.Province.Name_Ku : serviceSupply.ShiftCenter.City.Province.Name) : (Lng == Lang.AR ? serviceSupply.ShiftCenter.Clinic.City.Province.Name_Ar : Lng == Lang.KU ? serviceSupply.ShiftCenter.Clinic.City.Province.Name_Ku : serviceSupply.ShiftCenter.Clinic.City.Province.Name),
                MedicalCouncilNumber = serviceSupply.ServiceSupplyInfo?.MedicalCouncilNumber,
                FirstAvailableTurn   = firstTurn,
                Latitude             = serviceSupply.ShiftCenter.Location?.Y.ToString(),
                Longitude            = serviceSupply.ShiftCenter.Location?.X.ToString(),
                Schedules            = await GetSchedulesAsync(serviceSupply.Id, lang)
            };

            if (serviceSupply.ShiftCenter.PhoneNumbers != null)
            {
                result.Phones = serviceSupply.ShiftCenter.PhoneNumbers.Where(p => p.IsForReserve).Select(x => new ShiftCenterPhoneModel
                {
                    PhoneNumber  = x.PhoneNumber,
                    IsForReserve = x.IsForReserve
                }).ToList();
            }
            result.Expertises     = serviceSupply.DoctorExpertises.Select(x => Lng == Lang.AR ? x.Expertise.Name_Ar : Lng == Lang.KU ? x.Expertise.Name_Ku : x.Expertise.Name).ToList();
            result.Description    = Lng == Lang.AR ? serviceSupply.ShiftCenter.Description_Ar : Lng == Lang.KU ? serviceSupply.ShiftCenter.Description_Ku : serviceSupply.ShiftCenter.Description;
            result.Notification   = Lng == Lang.AR ? serviceSupply.ShiftCenter.Notification_Ar : Lng == Lang.KU ? serviceSupply.ShiftCenter.Notification_Ku : serviceSupply.ShiftCenter.Notification;
            result.WorkingCenters = healthCentersWorkingHours;
            var photosQuery = _dbContext.Attachments.Where(x => x.Owner == FileOwner.SHIFT_CENTER && x.OwnerTableId == serviceSupply.ShiftCenterId && x.FileType == FileType.Image);

            result.Photos = await photosQuery.Select(x => x.Url).ToListAsync();

            result.PhotosThumbs = await photosQuery.Select(x => x.ThumbnailUrl).ToListAsync();

            result.Grades = serviceSupply.ServiceSupplyInfo?.DoctorScientificCategories.Select(x => Lng == Lang.AR ? x.ScientificCategory.Name_Ar : Lng == Lang.KU ? x.ScientificCategory.Name_Ku : x.ScientificCategory.Name).ToList();
            result.Bio    = Lng == Lang.EN ? serviceSupply.ServiceSupplyInfo?.Bio : Lng == Lang.AR ? serviceSupply.ServiceSupplyInfo?.Bio_Ar : serviceSupply.ServiceSupplyInfo?.Bio_Ku;

            if (offerId != null)
            {
                var offer = await _dbContext.Offers.FindAsync(offerId);

                if (offer != null)
                {
                    offer.VisitsCount += 1;

                    _dbContext.Attach(offer);

                    _dbContext.Entry(offer).State = EntityState.Modified;

                    _dbContext.Offers.Update(offer);

                    await _dbContext.SaveChangesAsync();
                }
            }

            return(result);
        }