/// <summary>
 /// Конструктор
 /// </summary>
 /// <param name="problemDescriptor">Объект, содержащий описание решённой задачи</param>
 /// <param name="problemExample">Объект, содержащий решённый пример</param>
 /// <param name="problemStatistics">Объект, содержащий статистику решённой задачи (примера)</param>
 public FormProblemStatistics(IProblemDescriptor problemDescriptor, ProblemExample problemExample, IProblemStatistics problemStatistics) : this()
 {
     // Сохраняем всю информацию
     this.problemDescriptor = problemDescriptor;
     this.problemStatistics = problemStatistics;
     this.problemExample    = problemExample;
     // Отображаем статистику
     textLabelStatistics.Text = problemStatistics.GetStatisticsText();
 }
        /// <summary>
        /// Отправить статистику решения задачи на сервер
        /// </summary>
        /// <param name="problem">Дескриптор решённой задачи</param>
        /// <param name="example">Дескприптор решённого примера</param>
        /// <param name="statistics">Статистика решения</param>
        /// <param name="studentName">Имя студента</param>
        /// <param name="studentGroup">Группа (класс) студента</param>
        /// <param name="errorMessage">Сообщение об ошибке. Означивается, если произошла ошибка</param>
        /// <returns>Флаг успеха</returns>
        public bool Send(IProblemDescriptor problem, ProblemExample example, IProblemStatistics statistics,
                         string studentName, string studentGroup, out string errorMessage)
        {
            bool isSuccess = true;

            errorMessage = null;
            // Все отправляемые данные представляем в виде словаря пар <строка>-<строка> и сериализуем его в json
            Dictionary <string, string> data = new Dictionary <string, string> {
                { "student_name", studentName },
                { "student_group", studentGroup },
                { "problem_name", problem.Name },
                { "example_name", example.Name },
                { "example_description", example.Description },
                { "statistics_body", statistics.GetStatisticsText() },
                { "total_errors_count", statistics.TotalErrorsCount.ToString() },
                { "necessary_errors_count", statistics.TotalNecessaryErrorsCount.ToString() },
                { "mark", statistics.Mark.ToString() }
            };
            string json = JsonConvert.SerializeObject(data, Formatting.Indented);
            // Готовим объект для совершения POST-запроса с JSON на сервер для отправки статистики
            var httpWebRequest = (HttpWebRequest)WebRequest.Create($"{serverConfig.ServerUri}/api/stats");

            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method      = "POST";
            // Совершаем запрос и получаем ответ
            try {
                // Пишем json в запрос
                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) {
                    streamWriter.Write(json);
                }
                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                // Читаем ответ
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) {
                    var responseString = streamReader.ReadToEnd();
                }
            }
            catch (Exception e) {
                isSuccess    = false;
                errorMessage = e.Message;
            }
            return(isSuccess);
        }