/// <summary>
        /// Возвращает массив языков и уровнь их владением
        /// </summary>
        /// <param name="countLanguages">Количество языков</param>
        /// <returns>Массив языков и уровнь их владением</returns>
        private LevelLanguageSDB[] GetLevelLanguageArray(int countLanguages)
        {
            LevelLanguageSDB[] languages           = new LevelLanguageSDB[countLanguages];
            List <int>         numberLanguageRetry = new List <int>();

            for (int i = 0; i < countLanguages; i++)
            {
                int numberLanguage;
                while (true)
                {
                    numberLanguage = GetNumberLanguage();
                    int j = 0;
                    foreach (int number in numberLanguageRetry)
                    {
                        if (numberLanguage == number)
                        {
                            Console.WriteLine("Данный язык уже выбран");
                            break;
                        }
                        j++;
                    }
                    if (numberLanguageRetry.Count == 0 || j == numberLanguageRetry.Count)
                    {
                        numberLanguageRetry.Add(numberLanguage);
                        break;
                    }
                }
                int level = GetLevel();
                languages[i] = new LevelLanguageSDB((BookSDB.languageEnum)numberLanguage, level);
            }
            return(languages);
        }
        static void Main(string[] args)
        {
            //отменяющий токен
            CancellationTokenSource cancelTokenSource = null;
            CancellationToken       token;

            //объявление канала связи с rabbitMQ
            string            exchangeName = "SiteExchange";
            string            queueName1   = "BookQueue";           //очередь распределения книг
            string            routingKey1  = "Book";
            string            queueName2   = "ClientQueue";         //очередь добавления/удаления клиентов
            string            routingKey2  = "Client";
            ConnectionFactory factory      = new ConnectionFactory
            {
                UserName    = "******",
                Password    = "******",
                VirtualHost = "/",
                HostName    = "localhost"
            };
            IConnection conn    = null;
            IModel      channel = null;

            //команды контектного ввода
            string AddingBooks   = "1 - Запуск добавления книг";
            string AddingClient  = "2 - Добавление клиента";
            string DeletedClient = "3 - Удаление клиента";

            try
            {
                //создание канала связи с rabbitMQ
                conn    = factory.CreateConnection();
                channel = conn.CreateModel();
                channel.ExchangeDeclare(exchangeName, ExchangeType.Direct);
                channel.QueueDeclare(queueName1, true, false, false, null);
                channel.QueueBind(queueName1, exchangeName, routingKey1, null);
                channel.QueueDeclare(queueName2, true, false, false, null);
                channel.QueueBind(queueName2, exchangeName, routingKey2, null);
                IBasicProperties propAdding = channel.CreateBasicProperties();
                propAdding.Type = "Adding";
                IBasicProperties propDeleted = channel.CreateBasicProperties();
                propDeleted.Type = "Deleted";

                //выполнение контекстных команд
                while (true)
                {
                    Console.WriteLine(AddingBooks + "\n" + AddingClient + "\n" + DeletedClient);
                    string choice = Console.ReadLine();
                    //включение-отключение добавления книг
                    if (choice == "1")
                    {
                        //включение добавления книг
                        if (AddingBooks == "1 - Запуск добавления книг")
                        {
                            cancelTokenSource = new CancellationTokenSource();
                            token             = cancelTokenSource.Token;
                            Console.WriteLine("Ввведите интервал (в секундх) случайного добавления книг");
                            int minInterval;                                                                        //минимальное значение интервала добавления
                            while (true)
                            {
                                Console.WriteLine("Ввведите начальное значение интервала");
                                if (Int32.TryParse(Console.ReadLine(), out minInterval) && minInterval >= 0)
                                {
                                    break;
                                }
                                else
                                {
                                    Console.WriteLine("Не верно введено значение");
                                }
                            }
                            int maxInterval;                                                                        //максимальное значение интервала добавления
                            while (true)
                            {
                                Console.WriteLine("Ввведите конечное значение интервала");
                                if (Int32.TryParse(Console.ReadLine(), out maxInterval) && maxInterval > minInterval)
                                {
                                    break;
                                }
                                else
                                {
                                    Console.WriteLine("Не верно введено значение или конечное значение интервала меньше начального значения интервала");
                                }
                            }
                            Task clientTask = new Task(() => RandomAddingBooks(minInterval, maxInterval, token, channel, exchangeName, routingKey1));
                            clientTask.Start();                                                                     //запуск метода RandomAddingBooks в другом потоке
                            Console.WriteLine("Успешно");
                            AddingBooks = "1 - Отмена добавления книг";
                        }
                        //отключение запуска книг
                        else if (AddingBooks == "1 - Отмена добавления книг")
                        {
                            cancelTokenSource.Cancel();
                            AddingBooks = "1 - Запуск добавления книг";
                            Console.WriteLine("Успешно");
                        }
                    }
                    //добавление нового клиента
                    else if (choice == "2")
                    {
                        string pattern = @"^[A-Я][а-я]*$";
                        string surname;                                                  //Фамилия
                        while (true)
                        {
                            Console.WriteLine("Ввведите фамилию клиента");
                            surname = Console.ReadLine();
                            if (Regex.IsMatch(surname, pattern) && surname.Length < 30)
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Не верно введено значение. Фамилия должна содержать не более 30 прописных букв кириллицы с заглавной буквой");
                            }
                        }
                        string name;                                                    //Имя
                        while (true)
                        {
                            Console.WriteLine("Ввведите имя клиента");
                            name = Console.ReadLine();
                            if (Regex.IsMatch(name, pattern) && name.Length < 30)
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Не верно введено значение. Имя должно содержать не более 30 прописных букв кириллицы с заглавной буквой");
                            }
                        }
                        string address;                                                 //электронный адресс
                        while (true)
                        {
                            Console.WriteLine("Ввведите адресс электронной почты клиента");
                            address = Console.ReadLine();
                            pattern = @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                                      @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$";
                            if (Regex.IsMatch(address, pattern, RegexOptions.IgnoreCase) && address.Length < 30)
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Не верно введено значение или число символов больше 30");
                            }
                        }
                        int pagesPerDay;                                                //Количество читаемых страниц в день
                        while (true)
                        {
                            Console.WriteLine("Ввведите количество страниц, читаемое клиентом за день");
                            if (Int32.TryParse(Console.ReadLine(), out pagesPerDay) && pagesPerDay <= 1000)
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Не верно введено значение или количество страниц превышает 1000");
                            }
                        }
                        int readingIntervalActive;                                      //Количество дней чтения подряд
                        while (true)
                        {
                            Console.WriteLine("Введите количество дней чтения книг подряд");
                            if (Int32.TryParse(Console.ReadLine(), out readingIntervalActive) && readingIntervalActive >= 0)
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Не верно введено значение или количество дней меньше 1");
                            }
                        }
                        int readingIntervalPassive;                                     //Количество дней отдыха
                        while (true)
                        {
                            Console.WriteLine("Введите количество дней между чтением книг");
                            if (Int32.TryParse(Console.ReadLine(), out readingIntervalPassive) && readingIntervalPassive <= 20)
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Не верно введено значение или количество дней превышает 20");
                            }
                        }
                        int countLanguages;                                             //Количество языков
                        while (true)
                        {
                            Console.WriteLine("Введите количество языков, которыми владеет клиент");
                            if (Int32.TryParse(Console.ReadLine(), out countLanguages) && countLanguages <= 5 && countLanguages >= 1)
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Не верно введено значение или количество языков превышет 5 или меньше 1");
                            }
                        }
                        //создание массива языков и уровня владения клиента
                        LevelLanguageSDB[] levelLanguages = new LevelLanguageSDB[countLanguages];
                        List <int>         numberLan      = new List <int>();
                        for (int i = 0; i < countLanguages; i++)
                        {
                            int numberLanguages;                                            //язык
                            while (true)
                            {
                                Console.WriteLine("Введите язык (1-Русский, 2-Английский, 3-Немецкий, 4-Итальянский, 5-Испанский)");
                                if (Int32.TryParse(Console.ReadLine(), out numberLanguages) && numberLanguages <= 5 && numberLanguages >= 1)
                                {
                                    if (numberLan.Count == 0)
                                    {
                                        numberLan.Add(numberLanguages);
                                        break;
                                    }
                                    else
                                    {
                                        int j = 0;
                                        foreach (int nl in numberLan)
                                        {
                                            if (numberLanguages == nl)
                                            {
                                                Console.WriteLine("Данный язык уже выбран");
                                                break;
                                            }
                                            j++;
                                        }
                                        if (numberLan.Count == 0 || j == numberLan.Count)
                                        {
                                            numberLan.Add(numberLanguages);
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    Console.WriteLine("Не верно введено значение");
                                }
                            }
                            int level;                                              //Уровень владения
                            while (true)
                            {
                                Console.WriteLine("Введите уровень владения языком (от 1 до 10)");
                                if (Int32.TryParse(Console.ReadLine(), out level) && level <= 10 && level >= 1)
                                {
                                    break;
                                }
                                else
                                {
                                    Console.WriteLine("Не верно введено значение");
                                }
                            }
                            levelLanguages[i] = new LevelLanguageSDB((BookSDB.languageEnum)numberLanguages, level);
                        }
                        //создание клиента, сериализация в файл JSON и отправка в очередь
                        ClientSDB Client           = new ClientSDB(surname, name, address, pagesPerDay, readingIntervalActive, readingIntervalPassive, levelLanguages);
                        string    ClientJSON       = JsonSerializer.Serialize <ClientSDB>(Client);
                        byte[]    messageBodyBytes = Encoding.UTF8.GetBytes(ClientJSON);
                        channel.BasicPublish(exchangeName, routingKey2, propAdding, messageBodyBytes);
                        Console.WriteLine("Успешно");
                    }
                    else if (choice == "3")
                    {
                        string address;                                 //электронный адресс
                        while (true)
                        {
                            Console.WriteLine("Ввведите адресс электронной почты клиента");
                            address = Console.ReadLine();
                            string pattern = @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                                             @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$";
                            if (Regex.IsMatch(address, pattern, RegexOptions.IgnoreCase) && address.Length < 30)
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Не верно введено значение или число символов больше 30");
                            }
                        }
                        //сериализация адресса в JSON и отправка в очередь
                        byte[] messageBodyBytes = Encoding.UTF8.GetBytes(address);
                        channel.BasicPublish(exchangeName, routingKey2, propDeleted, messageBodyBytes);
                        Console.WriteLine("Успешно");
                    }
                    else
                    {
                        Console.WriteLine("Данного кода операции не существует");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                }
                if (channel != null)
                {
                    channel.Close();
                }
            }
        }