public async Task <IActionResult> Create([Bind("IdProfessor,Nome,DataUltimaImportacao")] Professor professor)
        {
            if (ModelState.IsValid)
            {
                _context.Add(professor);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(professor));
        }
        public async Task <ActionResult> UploadListaAlunos(IFormFile file, [FromQuery(Name = "idProfessor")] int idProfessor)
        {
            if (file != null)
            {
                Models.Professor professor = await _context.Professor.FirstOrDefaultAsync(p => p.IdProfessor == idProfessor);

                // Bloquear importação de alunos por um período de tempo definido em appsettings.json
                string   strPeriodo = _configuration.GetValue <string>("Config:PeriodoBloqueioImportacao");
                TimeSpan periodo    = TimeSpan.Zero;
                if (!string.IsNullOrEmpty(strPeriodo) && TimeSpan.TryParse(strPeriodo, out periodo))
                {
                    if (professor.DataUltimaImportacao.HasValue)
                    {
                        if (DateTime.Now - professor.DataUltimaImportacao.Value < periodo)
                        {
                            TimeSpan diff = periodo - (DateTime.Now - professor.DataUltimaImportacao.Value);
                            string   dias = diff.Days > 0 ? diff.Days.ToString() + " dias," : "";
                            TempData["Error"] = $"Deve-se aguardar {dias} {diff.ToString("hh\\:mm\\:ss")} antes de se poder importar alunos para este professor.";
                            return(RedirectToAction("Index", new { idProfessor = idProfessor }));;
                        }
                    }
                }

                // Formato: NomeAluno||ValorMensalidade||DataVencimento
                using (StreamReader sr = new StreamReader(file.OpenReadStream()))
                {
                    string msg       = null;
                    string error     = null;
                    int    inseridos = 0;

                    string[] lines = sr.ReadToEnd().Split("\r\n")
                                     .Where(l => l.Length > 0)
                                     .ToArray();

                    for (int i = 0; i < lines.Length; i++)
                    {
                        string[] lineSplit = lines[i].Split("||");

                        if (lineSplit.Length != 3)
                        {
                            error = $"Registro inválido na linha {i + 1} do arquivo. Formato: NomeAluno||ValorMensalidade||DataVencimento.";
                            break;
                        }

                        string nomeAluno   = lineSplit[0];
                        string valorMensal = lineSplit[1];
                        string dataVenc    = lineSplit[2];

                        if (string.IsNullOrEmpty(nomeAluno) ||
                            string.IsNullOrEmpty(valorMensal) ||
                            string.IsNullOrEmpty(dataVenc))
                        {
                            error = $"Registro inválido na linha {i + 1} do arquivo. Formato: NomeAluno||ValorMensalidade||DataVencimento.";
                            break;
                        }

                        // Mensalidade
                        decimal mensalidade = 0.0m;
                        if (!decimal.TryParse(valorMensal, out mensalidade))
                        {
                            error = $"Valor mensal inválido na linha {i + 1} do arquivo -- formato: 0.00.";
                            break;
                        }

                        // Data de vencimento
                        DateTime dataVencimento = DateTime.MinValue;
                        if (!DateTime.TryParseExact(dataVenc, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture
                                                    , System.Globalization.DateTimeStyles.None, out dataVencimento))
                        {
                            error = $"Data de vencimento inválida na linha {i + 1} do arquivo -- formato: DD/MM/AAAA.";
                            break;
                        }

                        // Inserir Aluno
                        Models.Aluno aluno = new Aluno()
                        {
                            IdProfessor    = idProfessor,
                            Nome           = nomeAluno,
                            Mensalidade    = mensalidade,
                            DataVencimento = dataVencimento
                        };
                        _context.Add(aluno);
                        await _context.SaveChangesAsync();

                        inseridos++;

                        // Salvar data de importação
                        professor.DataUltimaImportacao = DateTime.Now;
                        await _context.SaveChangesAsync();
                    }

                    if (error == null && inseridos > 0)
                    {
                        msg = $"{inseridos} registros inseridos.";
                    }

                    TempData["Error"]   = error;
                    TempData["Message"] = msg;
                }
            }

            return(RedirectToAction("Index", new { idProfessor = idProfessor }));
        }