<commit_before>﻿using VkNet.Model.RequestParams.Users;

namespace VkNet.Categories
{
	using System;
	using System.Collections.Generic;
	using System.Collections.ObjectModel;
	using System.Linq;
	using JetBrains.Annotations;

	using Enums.Filters;
	using Enums.SafetyEnums;
	using Model;
	using Utils;

	/// <summary>
	/// Методы для работы с информацией о пользователях.
	/// </summary>
	public class UsersCategory
	{
		private readonly VkApi _vk;

		internal UsersCategory(VkApi vk)
		{
			_vk = vk;
		}

		/// <summary>
		/// Возвращает список пользователей в соответствии с заданным критерием поиска.
		/// </summary>
		/// <param name="itemsCount">Общее количество пользователей, удовлетворяющих условиям запроса.</param>
		/// <param name="params">Параметры запроса.</param>
		/// <returns>
		/// После успешного выполнения возвращает список объектов пользователей, найденных в соответствии с заданными критериями.
		/// </returns>
		/// <exception cref="ArgumentException">Query can not be <c>null</c> or empty.</exception>
		/// <remarks>
		/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.search" />.
		/// </remarks>
		[Pure]
		public ReadOnlyCollection<User> Search(out int itemsCount, UserSearchParams @params)
		{
			if (string.IsNullOrWhiteSpace(@params.Query))
			{
				throw new ArgumentException("Query can not be null or empty.");
			}
			var parameters = new VkParameters
			{
				{ "q", @params.Query },
				{ "sort", @params.Sort },
				{ "offset", @params.Offset },
				{ "count", @params.Count },
				{ "fields", @params.Fields },
				{ "city", @params.City },
				{ "country", @params.Country },
				{ "hometown", @params.Hometown },
				{ "university_country", @params.UniversityCountry },
				{ "university", @params.University },
				{ "university_year", @params.UniversityYear },
				{ "university_faculty", @params.UniversityFaculty },
				{ "university_chair", @params.UniversityChair },
				{ "sex", @params.Sex },
				{ "status", @params.Status },
				{ "age_from", @params.AgeFrom },
				{ "age_to", @params.AgeTo },
				{ "birth_day", @params.BirthDay },
				{ "birth_month", @params.BirthMonth },
				{ "birth_year", @params.BirthYear },
				{ "online", @params.Online },
				{ "has_photo", @params.HasPhoto },
				{ "school_country", @params.SchoolCountry },
				{ "school_city", @params.SchoolCity },
				{ "school_class", @params.SchoolClass },
				{ "school", @params.School },
				{ "school_year", @params.SchoolYear },
				{ "religion", @params.Religion },
				{ "interests", @params.Interests },
				{ "company", @params.Company },
				{ "position", @params.Position },
				{ "group_id", @params.GroupId },
				{ "from_list", @params.FromList }

			};
			VkResponseArray response = _vk.Call("users.search", parameters);

			itemsCount = response[0];

			return response.Skip(1).ToReadOnlyCollectionOf<User>(r => r);
		}

		/// <summary>
		/// Получает настройки текущего пользователя в данном приложении. .
		/// </summary>
		/// <param name="uid">идентификатор пользователя, информацию о настройках которого необходимо получить.</param><commit_msg>#57 метод  users.search проблема была в отсутствии версии API, поэтому не все поля возвращались<commit_after>﻿using VkNet.Model.RequestParams.Users;

namespace VkNet.Categories
{
	using System;
	using System.Collections.Generic;
	using System.Collections.ObjectModel;
	using System.Linq;
	using JetBrains.Annotations;

	using Enums.Filters;
	using Enums.SafetyEnums;
	using Model;
	using Utils;

	/// <summary>
	/// Методы для работы с информацией о пользователях.
	/// </summary>
	public class UsersCategory
	{
		private readonly VkApi _vk;

		internal UsersCategory(VkApi vk)
		{
			_vk = vk;
		}

		/// <summary>
		/// Возвращает список пользователей в соответствии с заданным критерием поиска.
		/// </summary>
		/// <param name="itemsCount">Общее количество пользователей, удовлетворяющих условиям запроса.</param>
		/// <param name="params">Параметры запроса.</param>
		/// <returns>
		/// После успешного выполнения возвращает список объектов пользователей, найденных в соответствии с заданными критериями.
		/// </returns>
		/// <exception cref="ArgumentException">Query can not be <c>null</c> or empty.</exception>
		/// <remarks>
		/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.search" />.
		/// </remarks>
		[Pure]
		[ApiVersion("5.37")]
		public ReadOnlyCollection<User> Search(out int itemsCount, UserSearchParams @params)
		{
			if (string.IsNullOrWhiteSpace(@params.Query))
			{
				throw new ArgumentException("Query can not be null or empty.");
			}
			var parameters = new VkParameters
			{
				{ "q", @params.Query },
				{ "sort", @params.Sort },
				{ "offset", @params.Offset },
				{ "count", @params.Count },
				{ "fields", @params.Fields },
				{ "city", @params.City },
				{ "country", @params.Country },
				{ "hometown", @params.Hometown },
				{ "university_country", @params.UniversityCountry },
				{ "university", @params.University },
				{ "university_year", @params.UniversityYear },
				{ "university_faculty", @params.UniversityFaculty },
				{ "university_chair", @params.UniversityChair },
				{ "sex", @params.Sex },
				{ "status", @params.Status },
				{ "age_from", @params.AgeFrom },
				{ "age_to", @params.AgeTo },
				{ "birth_day", @params.BirthDay },
				{ "birth_month", @params.BirthMonth },
				{ "birth_year", @params.BirthYear },
				{ "online", @params.Online },
				{ "has_photo", @params.HasPhoto },
				{ "school_country", @params.SchoolCountry },
				{ "school_city", @params.SchoolCity },
				{ "school_class", @params.SchoolClass },
				{ "school", @params.School },
				{ "school_year", @params.SchoolYear },
				{ "religion", @params.Religion },
				{ "interests", @params.Interests },
				{ "company", @params.Company },
				{ "position", @params.Position },
				{ "group_id", @params.GroupId },
				{ "from_list", @params.FromList }

			};
			var response = _vk.Call("users.search", parameters);

			itemsCount = response["count"];

			return response["items"].ToReadOnlyCollectionOf<User>(r => r);
        }

		/// <summary>
		/// Получает настройки текущего пользователя в данном приложении. .
		/// </summary>
		/// <param name="uid">идентификатор пользователя, информацию о настройках которого необходимо получить.</param>
{'fraction_non_alphanumeric': 0.15876777251184834, 'fraction_numerical': 0.0011058451816745656, 'mean_word_length': 3.544867193108399, 'pattern_counts': {'":': 0, '<': 49, '<?xml version=': 0, '>': 51, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1535566', 'n_tokens_mistral': 2491, 'n_tokens_neox': 2266, 'n_words': 433}