private static void DataFromCSVMappingToImportStudentsDataModel(string[] seperatedData, ImportedStudentsDataModel dataFromCSV, string[] firstNameAndLastName)
        {
            dataFromCSV.FirstName = firstNameAndLastName.First();
            dataFromCSV.LastName  = firstNameAndLastName.Last();
            if (seperatedData[2] == "")
            {
                dataFromCSV.Email = "-";
            }
            else
            {
                dataFromCSV.Email = seperatedData[2];
            }
            if (seperatedData[3] == "")
            {
                dataFromCSV.PhoneNumber = "-";
            }
            else
            {
                dataFromCSV.PhoneNumber = seperatedData[3];
            }
            if (seperatedData[4].ToLower() == "m")
            {
                dataFromCSV.Gender = Gender.Moteris;
            }
            else if (seperatedData[4].ToLower() == "v")
            {
                dataFromCSV.Gender = Gender.Vyras;
            }
            else
            {
                dataFromCSV.Gender = Gender.Kita;
            }
            dataFromCSV.Priority = seperatedData[5];
            string[] tasks = new string[10];
            for (int i = 6; i < 16; i++)
            {
                if (seperatedData[i] == "")
                {
                    tasks[i - 6] = "0";
                }
                else
                {
                    tasks[i - 6] = seperatedData[i].Replace(',', '.');
                }
            }
            dataFromCSV.Tasks = $"[{String.Join(",", tasks)}]";

            if (seperatedData[16].ToLower() == "taip")
            {
                dataFromCSV.PassedExam = true;
            }
            else
            {
                dataFromCSV.PassedExam = false;
            }
            if (double.TryParse(seperatedData[17], out double conversationResult))
            {
                dataFromCSV.ConversationResult = conversationResult;
            }
            else
            {
                dataFromCSV.ConversationResult = null;
            }
            if (seperatedData[18].ToLower() == "taip")
            {
                dataFromCSV.InvitationToStudy = true;
            }
            else
            {
                dataFromCSV.InvitationToStudy = false;
            }
            if (seperatedData[19].ToLower() == "taip")
            {
                dataFromCSV.SignedAContract = true;
            }
            else
            {
                dataFromCSV.SignedAContract = false;
            }
        }
        public async Task <IActionResult> Index(IFormFile file)
        {
            if (file == null)
            {
                _logger.LogWarning("User {User} tried to save empty file", _user);
                TempData["ErrorMessage"] = "Nėra įkeltas failas.";
                return(RedirectToAction("Index", "ImportCSV"));
            }
            if (!file.FileName.EndsWith(".csv"))
            {
                _logger.LogWarning("User {User} tried to upload", _user, file.FileName);
                TempData["ErrorMessage"] = "Prašome įkelti .csv failą.";
                return(RedirectToAction("Index", "ImportCSV"));
            }
            int.TryParse(TempData["ExamId"].ToString(), out int examId);

            var programs = await _repository.Query <Core.Library.Entities.Program>().ToListAsync();

            using (StreamReader streamReaderValidation = new StreamReader(file.OpenReadStream()))
            {
                string dataFromCSV;
                while ((dataFromCSV = streamReaderValidation.ReadLine()) != null)
                {
                    var seperatedData = dataFromCSV.Split(";");
                    if (seperatedData.Length > 20)
                    {
                        _logger.LogWarning("User {User} tried to upload {File} with too many columns", _user, file.FileName);
                        TempData["ErrorMessage"] = $"Jūsų faile yra per daug stulpelių arba CSV faile tarp duomenų yra naudojamas kabliataškis(;).";
                        return(RedirectToAction("ImportCSV", "ImportCSV"));
                    }
                    if (seperatedData.Length < 20)
                    {
                        _logger.LogWarning("User {User} tried to upload {File} with less columns or wrong .CSV format", _user, file.FileName);
                        TempData["ErrorMessage"] = $"Jūsų faile yra per mažai stulpelių arba CSV failo skirtuvas yra blogas.";
                        return(RedirectToAction("Index", "ImportCSV"));
                    }
                    if (seperatedData[1] == "")
                    {
                        _logger.LogWarning("User {User} tried to upload {File} where student in {Line} line does not  firstname and lastname", _user, file.FileName, seperatedData[0]);
                        TempData["ErrorMessage"] = $"Jūsų faile {seperatedData[0]} eilutėje yra kandidatas, kuris neturi vardo ir pavardės.";
                        return(RedirectToAction("Index", "ImportCSV"));
                    }

                    var programFromCSV = programs.FirstOrDefault(x => x.Name == seperatedData[5]);
                    if (programFromCSV == null)
                    {
                        _logger.LogWarning("User {User} tried to upload {File} where program in {Line} line does not exist", _user, file.FileName, seperatedData[0]);
                        TempData["ErrorMessage"] = $"Jūsų faile {seperatedData[0]} eilutėje yra programa, kuri neegzistuoja sitemoje. Pirma sukurkite programą, tada kelkite failą.";
                        return(RedirectToAction("Index", "ImportCSV"));
                    }
                    var firstNameAndLastName = seperatedData[1].Split(" ");

                    if (firstNameAndLastName.First() == "" || firstNameAndLastName.First() == " ")
                    {
                        _logger.LogWarning("User {User} tried to upload {File} where student in {Line} line does not have firstname", _user, file.FileName, seperatedData[0]);
                        TempData["ErrorMessage"] = $"Jūsų faile {seperatedData[0]} eilutėje yra kandidatas, kurio vardo yra negalima aptikti. Patikrinkite ar nėra tarpo prieš vardą.";
                        return(RedirectToAction("Index", "ImportCSV"));
                    }
                    if (firstNameAndLastName.Last() == "" || firstNameAndLastName.Last() == " ")
                    {
                        _logger.LogWarning("User {User} tried to upload {File} where student in {Line} line does not have lastname", _user, file.FileName, seperatedData[0]);
                        TempData["ErrorMessage"] = $"Jūsų faile {seperatedData[0]} eilutėje yra kandidatas, kurio pavardės negalima aptikti.";
                        return(RedirectToAction("Index", "ImportCSV"));
                    }
                    if (seperatedData[16].ToLower() != "taip" && seperatedData[17] != "")
                    {
                        _logger.LogWarning("User {User} tried to upload {File} where student in {Line} line did not passedExam and has conversationResult", _user, file.FileName, seperatedData[0]);
                        TempData["ErrorMessage"] = $"Jūsų faile {seperatedData[0]} eilutėje yra kandidatas, kuris nėra pakviestas į pokalbį, bet turi pokalbio įvertinimą.";
                        return(RedirectToAction("Index", "ImportCSV"));
                    }
                    if (seperatedData[16].ToLower() != "taip" && seperatedData[18].ToLower() == "taip")
                    {
                        _logger.LogWarning("User {User} tried to upload {File} where student in {Line} line did not passedExam and has invitation to study", _user, file.FileName, seperatedData[0]);
                        TempData["ErrorMessage"] = $"Jūsų faile {seperatedData[0]} eilutėje yra kandidatas, kuris nėra pakviestas į pokalbį, bet yra kviečiamas studijuoti.";
                        return(RedirectToAction("Index", "ImportCSV"));
                    }
                    if (seperatedData[16].ToLower() != "taip" && seperatedData[19].ToLower() == "taip")
                    {
                        _logger.LogWarning("User {User} tried to upload {File} where student in {Line} line did not passedExam and signed a contract", _user, file.FileName, seperatedData[0]);
                        TempData["ErrorMessage"] = $"Jūsų faile {seperatedData[0]} eilutėje yra kandidatas, kuris nėra pakviestas į pokalbį, bet yra pasirašęs sutartį.";
                        return(RedirectToAction("Index", "ImportCSV"));
                    }
                    if (seperatedData[18].ToLower() != "taip" && seperatedData[19].ToLower() == "taip")
                    {
                        _logger.LogWarning("User {User} tried to upload {File} where student in {Line} line signed a contract but did not have invitation to studies", _user, file.FileName, seperatedData[0]);
                        TempData["ErrorMessage"] = $"Jūsų faile {seperatedData[0]} eilutėje yra kandidatas, kuris yra pasirašęs sutartį, bet nėra pakviestas studijuoti.";
                        return(RedirectToAction("Index", "ImportCSV"));
                    }
                }
            }
            using (StreamReader streamReader = new StreamReader(file.OpenReadStream()))
            {
                string studentDataFromCSV;
                while ((studentDataFromCSV = streamReader.ReadLine()) != null)
                {
                    var seperatedData = studentDataFromCSV.Split(";");

                    var firstNameAndLastName = seperatedData[1].Split(" ");
                    var dataFromCSV          = new ImportedStudentsDataModel();
                    DataFromCSVMappingToImportStudentsDataModel(seperatedData, dataFromCSV, firstNameAndLastName);

                    Result result = new Result
                    {
                        ExamId = examId,
                    };
                    await _repository.InsertAsync <Result>(result);

                    _logger.LogInformation($"Result with {result.Id} id was saved from {file.FileName} by {_user}");
                    var student = new Student();
                    await _repository.InsertAsync <Student>(student);

                    _logger.LogInformation($"Student with {student.Id} id was saved from {file.FileName} by {_user}");
                    if (dataFromCSV.ConversationResult == null)
                    {
                        _logger.LogInformation($"Student with {student.Id} id does not have conversationResult from {file.FileName} by {_user}");
                        ImportedCSVMappings.ToEntityWithoutConversationResult(student, result, dataFromCSV);
                    }
                    else
                    {
                        var conversationResult = new ConversationResult();
                        await _repository.InsertAsync <ConversationResult>(conversationResult);

                        _logger.LogInformation($"ConversationResult {conversationResult.Id} Id was created for student with {student.Id} id  from {file.FileName} by {_user}");
                        ImportedCSVMappings.ToEntity(student, result, conversationResult, dataFromCSV);
                    }
                    var studentsExam = _repository.Query <Exam>().FirstOrDefault(x => x.Id == examId);

                    foreach (var program in programs)
                    {
                        StudentCourse studentCourse = new StudentCourse
                        {
                            StudentId = student.Id,
                            Student   = student
                        };

                        var priorityProgram = _repository.Query <Core.Library.Entities.Program>()
                                              .Where(x => x.Name == program.Name)
                                              .FirstOrDefault();
                        var priorityCourse = _repository.Query <Course>()
                                             .Where(x => x.ProgramId == priorityProgram.Id)
                                             .Where(x => x.StartYear.Year == studentsExam.Date.Year)
                                             .FirstOrDefault();

                        if (priorityCourse != null)
                        {
                            studentCourse.CourseId = priorityCourse.Id;
                        }
                        else
                        {
                            Course course = new Course
                            {
                                StartYear = studentsExam.Date,
                                EndYear   = studentsExam.Date.AddYears(1),
                                CityId    = studentsExam.CityId,
                                ProgramId = priorityProgram.Id,
                                Title     = priorityProgram.Name
                            };
                            studentCourse.CourseId = course.Id;
                            studentCourse.Course   = course;
                            await _repository.InsertAsync <Course>(course);

                            _logger.LogInformation($"New course {course.Title}{course.StartYear} {course.EndYear} was created from {file.FileName} by {_user}");
                        }
                        var programFromCSV = programs.FirstOrDefault(x => x.Name == dataFromCSV.Priority);
                        if (programFromCSV.Name == program.Name)
                        {
                            studentCourse.Priority = 1;
                        }
                        else
                        {
                            studentCourse.Priority = null;
                        }

                        await _repository.InsertAsync <StudentCourse>(studentCourse);

                        _logger.LogInformation($"{studentCourse.Priority} priority for {student.Id} was added from {file.FileName} by {_user}");
                        await _repository.SaveAsync();
                    }
                }
            }
            _logger.LogInformation("User {User} uploaded successfully data from {File}", _user, file.FileName);
            return(RedirectToAction("Index", "Students", new { id = examId }));
        }
 public static void ToEntity(Student student, Result result, ConversationResult conversationResult, ImportedStudentsDataModel importedStudentsDataModel)
 {
     student.FirstName            = importedStudentsDataModel.FirstName;
     student.LastName             = importedStudentsDataModel.LastName;
     student.PassedExam           = importedStudentsDataModel.PassedExam;
     student.InvitedToStudy       = importedStudentsDataModel.InvitationToStudy;
     student.SignedAContract      = importedStudentsDataModel.SignedAContract;
     student.ResultId             = result.Id;
     student.Result               = result;
     student.ConversationResultId = conversationResult.Id;
     student.ConversationResult   = conversationResult;
     student.Email                        = importedStudentsDataModel.Email;
     student.PhoneNumber                  = importedStudentsDataModel.PhoneNumber;
     result.Student                       = student;
     result.StudentForeignKey             = student.Id;
     result.Tasks                         = importedStudentsDataModel.Tasks;
     conversationResult.Grade             = importedStudentsDataModel.ConversationResult;
     conversationResult.StudentForeignKey = student.Id;
     conversationResult.Student           = student;
 }