public ActionResult Salvar(IFormCollection form)
        {
            try
            {
                string nome     = form["nome"];
                string telefone = form["telefone"];
                string email    = form["email"];

                string      logradouro    = form["rua"];
                string      numero        = form["numero"];
                string      bairro        = form["bairro"];
                string      complemento   = form["complemento"];
                int         cidade_codigo = int.Parse(form["cidade"]);
                CidadeModel cidade        = null;
                if (cidade_codigo != 0)
                {
                    cidade = (new CidadeModel()).Obter(cidade_codigo);
                }

                if (nome != "" &&
                    telefone != "" &&
                    email != "" &&
                    logradouro != "" &&
                    numero != "" &&
                    bairro != "" &&
                    cidade != null)
                {
                    EnderecoModel endereco = new EnderecoModel()
                    {
                        Logradouro   = logradouro,
                        Numero       = numero,
                        Bairro       = bairro,
                        Complemento  = complemento,
                        CidadeCodigo = cidade.Codigo
                    };
                    endereco.Salvar();

                    ClinicaModel clinica = new ClinicaModel()
                    {
                        Nome     = nome,
                        Email    = email,
                        Endereco = endereco.Codigo,
                        Telefone = telefone
                    };
                    clinica.Salvar();
                }

                return(RedirectToAction(nameof(Index)));
            }
            catch
            {
                return(View());
            }
        }
        public IActionResult Salvar(IFormCollection form)
        {
            try
            {
                // Dados Pessoal
                string   tipoUsuario    = form["tipoUsuario"];
                string   nome           = form["nome"];
                string   sobrenome      = form["sobrenome"];
                string   cpf            = form["cpf"];
                DateTime dataNascimento = DateTime.Parse(form["dataNascimento"]);
                string   telefone       = form["telefone"];
                string   email          = form["email"];

                // Dados Endereço
                string rua         = form["rua"];
                string numero      = form["numero"];
                string complemento = form["complemento"];
                string bairro      = form["bairro"];
                int    cidade      = int.Parse(form["cidade"]);

                if (
                    tipoUsuario != "" &&
                    nome != "" &&
                    sobrenome != "" &&
                    cpf != "" &&
                    dataNascimento != null &&
                    telefone != "" &&
                    email != "" &&
                    rua != "" &&
                    numero != "" &&
                    bairro != "" &&
                    cidade != 0
                    )
                {
                    PacienteModel pacienteTeste = null;
                    pacienteTeste = (new PacienteModel()).LocalizarCPF(cpf);
                    if (pacienteTeste != null)
                    {
                        throw new Exception("CPF já cadastrado em outro usuário");
                    }

                    pacienteTeste = (new PacienteModel()).LocalizarEmail(cpf);
                    if (pacienteTeste != null)
                    {
                        throw new Exception("CPF já cadastrado em outro usuário");
                    }


                    //String senha = Senha.Gerar();
                    String senha = "abcd@123";

                    EnderecoModel endereco = new EnderecoModel();
                    endereco.CidadeCodigo = cidade;
                    endereco.Logradouro   = rua;
                    endereco.Numero       = numero;
                    endereco.Complemento  = complemento;
                    endereco.Bairro       = bairro;
                    endereco.Salvar();

                    if (tipoUsuario == "paciente")
                    {
                        double coparticipacao = double.Parse(form["coparticipacao"]);

                        if (coparticipacao != 0.0)
                        {
                            // Carrega os dados do objeto
                            PacienteModel paciente = new PacienteModel()
                            {
                                Nome           = nome,
                                Sobrenome      = sobrenome,
                                Cpf            = cpf,
                                DataNascimento = dataNascimento,
                                Telefone       = telefone,
                                Email          = email,
                                Senha          = Hash.GetHashString(senha),
                                EnderecoCodigo = endereco.Codigo
                            };
                            paciente.Salvar();
                        }
                    }
                    else if (tipoUsuario == "especialista")
                    {
                        EspecialistaModel especialistaTeste = null;
                        especialistaTeste = (new EspecialistaModel()).LocalizarCPF(cpf);
                        if (especialistaTeste != null)
                        {
                            throw new Exception("CPF já cadastrado em outro usuário");
                        }

                        especialistaTeste = (new EspecialistaModel()).LocalizarEmail(cpf);
                        if (especialistaTeste != null)
                        {
                            throw new Exception("CPF já cadastrado em outro usuário");
                        }


                        string crm = form["crm"];
                        List <EspecialidadeClinicaJsonModel> especialidadesClinicas = System.Text.Json.JsonSerializer.Deserialize <List <EspecialidadeClinicaJsonModel> >(form["especialidadesClinicas"]);

                        if (crm != "" && especialidadesClinicas != null)
                        {
                            // Carrega objeto
                            EspecialistaModel especialista = new EspecialistaModel()
                            {
                                Nome           = nome,
                                Sobrenome      = sobrenome,
                                Cpf            = cpf,
                                DataNascimento = dataNascimento,
                                Telefone       = telefone,
                                Email          = email,
                                Senha          = Hash.GetHashString(senha),
                                EnderecoCodigo = endereco.Codigo
                            };
                            especialista.Salvar();

                            // Percorre todas as uniões de clinicas e especialidades
                            foreach (EspecialidadeClinicaJsonModel especialidadeClinica in especialidadesClinicas)
                            {
                                ClinicaModel       clinica       = (new ClinicaModel()).Obter(especialidadeClinica.clinica);
                                EspecialidadeModel especialidade = (new EspecialidadeModel()).Obter(especialidadeClinica.especialidade);

                                // Caso um dos modelos estiver vazio retorna um erro
                                if (clinica == null)
                                {
                                    throw new Exception("Clinica Inválida");
                                }
                                if (especialidade == null)
                                {
                                    throw new Exception("Clinica Inválida");
                                }

                                // Salva o vinculo Especialista, Especialidade e Clinica
                                especialista.SalvarEspecialidadesClinicas(especialidade, clinica);
                            }
                        }
                    }
                    else if (tipoUsuario == "secretario")
                    {
                        SecretarioModel secretarioTeste = null;
                        secretarioTeste = (new SecretarioModel()).LocalizarCPF(cpf);
                        if (secretarioTeste != null)
                        {
                            throw new Exception("CPF já cadastrado em outro usuário");
                        }

                        secretarioTeste = (new SecretarioModel()).LocalizarEmail(cpf);
                        if (secretarioTeste != null)
                        {
                            throw new Exception("CPF já cadastrado em outro usuário");
                        }

                        SecretarioModel secretario = new SecretarioModel()
                        {
                            Nome           = nome,
                            Sobrenome      = sobrenome,
                            Cpf            = cpf,
                            DataNascimento = dataNascimento,
                            Telefone       = telefone,
                            Email          = email,
                            Senha          = Hash.GetHashString(senha),
                            EnderecoCodigo = endereco.Codigo
                        };

                        secretario.Salvar();
                    }
                    else if (tipoUsuario == "administrador")
                    {
                        AdministradorModel administradorTeste = null;
                        administradorTeste = (new AdministradorModel()).LocalizarEmail(cpf);
                        if (administradorTeste != null)
                        {
                            throw new Exception("CPF já cadastrado em outro usuário");
                        }

                        AdministradorModel administrador = new AdministradorModel()
                        {
                            Nome      = nome,
                            Sobrenome = sobrenome,
                            Email     = email,
                            Senha     = Hash.GetHashString(senha),
                        };

                        administrador.Salvar();
                    }
                    else
                    {
                        throw new Exception("Tipo de usuário não encontrado");
                    }

                    // Aqui segue o Fluxo normal e envia uma mensagem de e-mail
                    // com as informações de login
                }
                else
                {
                    throw new Exception("Preencha todos os campos corretamente.");
                }
            }
            catch (Exception ex)
            {
                ViewData["erro"] = "Falha ao salvar os dados" + ex.Message;
                return(View("Cadastrar"));
            }

            ViewData["sucesso"] = "Sucesso ao cadastrar usuário";
            return(View("../Administrador/Index"));
        }