public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                  var user = _userManager.FindByName(model.Email);
                    if (user == null)
                    {
                        // Não revelar se o usuario nao existe ou nao esta confirmado
                        return View("ForgotPasswordConfirmation");
                    }

                    //var code = _userManager.GeneratePasswordResetToken(user.Id);
                    var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id }, protocol: Request.Url.Scheme);
                    //await _userManager.SendEmailAsync(user.Id, "Esqueci minha senha", "Por favor altere sua senha clicando aqui: <a href='" + callbackUrl + "'></a>");
                    //ViewBag.Link = callbackUrl;
                    //ViewBag.Status = "DEMO: Caso o link não chegue: ";
                    //ViewBag.LinkAcesso = callbackUrl;
                    

                    var saudacao = "";
                    var date = DateTime.Now;
                    if (date.Hour > 12 && date.Hour < 18)
                    {
                        saudacao = "boa tarde";
                    }
                    else if (date.Hour > 0 && date.Hour < 12)
                    {
                        saudacao = "bom dia";
                    }
                    else
                    {
                        saudacao = "boa noite";
                    }


                    var corpoNotificacao = "Olá, " + saudacao + "!" + " <br /><br /> Troque agora sua senha." +
                                "<br /> <a href=" + '\u0022' + callbackUrl + '\u0022' + "><strong>Clique aqui</strong></a> para alterar sua senha. " +
                                "<br /><br /> Att, <br />" +
                                " Equipe Agiliza.";

                    var assuntoNotificacao = "Solicitação de nova senha";
                   var _enviaEmail = new EnviaEmail();
                    var enviouNotificacao = _enviaEmail.EnviaEmailConfirmacao(model.Email, corpoNotificacao, assuntoNotificacao);
                    if (!enviouNotificacao.Key)
                    {
                        var logVm = new LogViewModel();
                        logVm.Mensagem = enviouNotificacao.Value;
                        logVm.Controller = "Enviar Email Nova Senha";
                        logVm.View = "Enviar email notificação de nova senha.";
                        var log = Mapper.Map<LogViewModel, Log>(logVm);
                        _logAppService.SaveOrUpdate(log);
                    }
                    return View("ForgotPasswordConfirmation");
                }

                // No caso de falha, reexibir a view. 
                return View(model);
            }
            catch (Exception e)
            {
                var logVm = new LogViewModel();
                logVm.Mensagem = e.Message;
                logVm.Controller = "Account";
                logVm.View = "ForgotPassword";
                var log = Mapper.Map<LogViewModel, Log>(logVm);
                _logAppService.SaveOrUpdate(log);
                return RedirectToAction("ErroAoCadastrar");
            }
        }
        public ActionResult Cadastrar(OrcamentoViewModel orcamento, int servico_id)
        {
            try
              {

            if (ModelState.IsValid)
            {
              var orcamentoEntity = Mapper.Map<OrcamentoViewModel, Orcamento>(orcamento);

              var endereco = orcamento.orc_Endereco;
              var partes = endereco.Split(',');
              foreach (var parte in partes.Where(s => s.Contains("-")))
              {

            var separar = parte.Split('-');
            var ufs =
                " AC, AL, AP, AM, BA, CE, DF, ES, GO, MA, MT, MS, MG, PA,PB, PR, PE, PI, RJ, RN, RS, RO, RR, SC, SP, SE, TO";
            if (ufs.Contains(separar[1]))
            {
              orcamentoEntity.orc_estado =
                  (EnumClass.EnumEstados)Enum.Parse(typeof(EnumClass.EnumEstados), separar[1]);
              orcamentoEntity.orc_cidade = separar[0];
            }
            else
              continue;

              }
              orcamentoEntity.serv_Id = servico_id;
              _orcamentoApp.Add(orcamentoEntity);

              var corpo = @"Olá " + orcamento.orc_nome_solicitante + " seu orçamento já está cadastrado em nosso sistema, fique atento que logo o prestador entrará em contato com você. Obrigado por nos escolher!" +
            "<br /><br /> Att, <br />";

              var assunto = "Orçamento Enviado";
              _enviaEmail = new EnviaEmail();
              var enviou = _enviaEmail.EnviaEmailConfirmacao(orcamentoEntity.orc_email_solicitante, corpo, assunto);
              if (!enviou.Key)
              {
            var logVm = new LogViewModel();
            logVm.Mensagem = enviou.Value;
            logVm.Controller = "Enviar Email";
            logVm.View = "Cadastrar Orçamento";
            var log = Mapper.Map<LogViewModel, Log>(logVm);
            _logAppService.SaveOrUpdate(log);
              }

              _enviaEmail.EnviaEmailConfirmacao(orcamentoEntity.orc_email_solicitante, corpo, assunto);

              var prestadores = _orcamentoApp.EnviaEmailParaPrestadoresQueOferecemOServico(orcamentoEntity.serv_Id);
              foreach (var prestadorID in prestadores)
              {
            var prestador = _prestadorApp.GetPorGuid(prestadorID);
            var envia = _orcamentoApp.EnviaEmailNotificacao(prestador, orcamentoEntity);
            if (envia.Key)
            {
              var corpoNotificacao = "Olá, " + _utils.PrimeiraLetraMaiuscula(prestador.pres_Nome.Trim()) + ", " + _utils.DefineSaudacao() + "!" + " <br /><br /> Chegou mais um orçamento para você." +
                  " <br /> Este orçamento está à uma distância de " + envia.Value.Trim() + ". <br />" +
                  "<br /> <a href=" + '\u0022' + "www.agilizaorcamentos.com.br/Orcamento/BuscaTrabalhos?usuarioId=" + prestador.pres_Id + '\u0022' + "><strong>Clique aqui</strong></a> para visualizar os orçamentos disponíveis para você. " +
                  "<br /><br /> Att, <br />" +
                  "Equipe Agiliza";

              var assuntoNotificacao = "Novo orçamento encontrado";
              _enviaEmail = new EnviaEmail();
              var enviouNotificacao = _enviaEmail.EnviaEmailConfirmacao(prestador.pres_Email, corpoNotificacao, assuntoNotificacao);
              if (!enviou.Key)
              {
                var logVm = new LogViewModel();
                logVm.Mensagem = enviou.Value;
                logVm.Controller = "Enviar Email Notificação";
                logVm.View = "Enviar email notificação de novo orçamento.";
                var log = Mapper.Map<LogViewModel, Log>(logVm);
                _logAppService.SaveOrUpdate(log);
              }
            }
              }

              //Enviar email para administradores de novo orçamento

              var servico = _servicoApp.GetById(servico_id);

              var admins = _prestadorApp.GetAdministradores();

              foreach (var admin in admins)
              {
            var corpoNovoUsuario = "Olá, " + _utils.PrimeiraLetraMaiuscula(admin.pres_Nome.Trim()) + ", " + _utils.DefineSaudacao() + "!" + " <br /><br /> Chegou mais um novo orçamento para Agiliza." +
            " <br /><strong>Solicitante:</strong>  " + orcamento.orc_nome_solicitante +
            " <br /><strong>Email:</strong>  " + orcamento.orc_email_solicitante +
            " <br /><strong>Telefone:</strong>  " + orcamento.orc_telefone_solicitante +
            " <br /><strong>Tipo de serviço:</strong>  " + servico.serv_Nome +
            " <br /><strong>Descrição:</strong>  " + orcamento.orc_descricao +
            " <br /><strong>Local para realizar o trabalho:</strong>  " + orcamento.orc_Endereco +
            " <br /><strong>Prazo previsto:</strong>  " + orcamento.orc_prazo +

            " <br /><strong>Descrição:</strong>  " + orcamento.orc_descricao +
            "<br /> <a href=" + '\u0022' + "www.agilizaorcamentos.com.br/Orcamento/ListarTodos" + '\u0022' + "><strong>Clique aqui</strong></a> para visualizar os orçamentos. " +
            "<br /><br /> Att, <br />" +
            "Equipe Agiliza";

            var assuntoNotificacao = "Novo orçamento Cadastrado";
            _enviaEmail = new EnviaEmail();
            var enviouNotificacao = _enviaEmail.EnviaEmailConfirmacao(admin.pres_Email, corpoNovoUsuario, assuntoNotificacao);
            if (!enviou.Key)
            {
              var logVm = new LogViewModel();
              logVm.Mensagem = enviou.Value;
              logVm.Controller = "Enviar Email Notificação para admin de novo orçamento";
              logVm.View = "Enviar email notificação para admin de novo orçamento.";
              var log = Mapper.Map<LogViewModel, Log>(logVm);
              _logAppService.SaveOrUpdate(log);
            }
              }

              return RedirectToAction("OrcamentoEnviadoSucesso");
            }
            else
            {
              ViewBag.ListaCat = new SelectList(_categoriaApp.GetAll(), "cat_Id", "cat_Nome");
              return View(orcamento);
            }

              }
              catch (Exception e)
              {

            var logVm = new LogViewModel();
            logVm.Mensagem = e.Message;
            logVm.Controller = "Orçamento";
            logVm.View = "Cadastrar Post";

            var log = Mapper.Map<LogViewModel, Log>(logVm);

            _logAppService.SaveOrUpdate(log);
            return RedirectToAction("ErroAoCadastrar");
              }
        }
        public ActionResult ServicosCategorias(FormCollection collection, string cpf,
            string nome, string celular, string email, bool editarPerfil)
        {
            try
            {
                var sbEmail = new StringBuilder();
                var servicos = new List<Servico>();
                foreach (var col in collection)
                {
                    int servId;
                    Int32.TryParse(col.ToString(), out servId);
                    var servico = _iServicoApp.GetById(servId);

                    sbEmail.Append(servico.serv_Nome);
                    sbEmail.Append(", ");

                    servicos.Add(servico);
                }
                //inserir por email, assim nao tem como duplicar
                var prestador = _iPrestadorApp.GetPorEmail(email);
                _iServicoPrestadorApp.SalvarServicosPrestador(servicos, prestador);
                if (editarPerfil)
                {
                    return RedirectToAction("MeuPerfil", "Prestador", new { usuarioId = prestador.pres_Id });
                }
                else
                {
                    //Enviar email para admins de novo usuario
                    var admins = _iPrestadorApp.GetAdministradores();

                    foreach (var admin in admins)
                    {
                        var corpoNovoUsuario = "Olá, " + _utils.PrimeiraLetraMaiuscula(admin.pres_Nome.Trim()) + ", " + _utils.DefineSaudacao() + "!" + " <br /><br /> Chegou mais um prestador para Agiliza." +
                        " <br /><strong>Nome:</strong>  " + prestador.pres_Nome +
                        " <br /><strong>Email:</strong>  " + prestador.pres_Email +
                        " <br /><strong>Telefone:</strong>  " + prestador.pres_Telefone_Residencial +
                        " <br /><strong>Celular:</strong>  " + prestador.pres_Telefone_Celular +
                        " <br /><strong>Endereço:</strong>  " + prestador.pres_Endereco +
                        " <br /><strong>Serviços:</strong><br />  " + sbEmail.ToString().Substring(0, sbEmail.ToString().Length - 2) + "." +

                        "<br /><br /> <a href=" + '\u0022' + "www.agilizaorcamentos.com.br/Prestador/Index" + '\u0022' + "><strong>Clique aqui</strong></a> para visualizar os prestadores cadastrados. " +
                        "<br /><br /> Att, <br />" +
                        " Equipe Agiliza.";

                        var assuntoNotificacao = "Novo orçamento Cadastrado";
                        var _enviaEmail = new EnviaEmail();
                        var enviouNotificacao = _enviaEmail.EnviaEmailConfirmacao(admin.pres_Email, corpoNovoUsuario, assuntoNotificacao);
                        if (!enviouNotificacao.Key)
                        {
                            var logVm = new LogViewModel();
                            logVm.Mensagem = enviouNotificacao.Value;
                            logVm.Controller = "Enviar Email Notificação para admin de novo prestador";
                            logVm.View = "Enviar email notificação para admin de novo prestador.";
                            var log = Mapper.Map<LogViewModel, Log>(logVm);
                            _logAppService.SaveOrUpdate(log);
                        }
                    }

                    return RedirectToAction("PrestadorCadastroSucesso", "Prestador");
                }
            }
            catch
            {
                return RedirectToAction("ErroAoCadastrar");
            }
        }
        private void EnviaEmailConfirmacao (ApplicationUser user)
        {

            var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id }, protocol: Request.Url.Scheme);
            _enviarEmail = new EnviaEmail();
            var corpo = "Por favor confirme sua conta clicando neste link:  <a href=" + '\u0022' + callbackUrl +
                        '\u0022' + ">Clique aqui</a>";
            var assunto = "Confirme seu email";

            var send = _enviarEmail.EnviaEmailConfirmacao(user.Email, corpo, assunto);

            if (!send.Key)
            {
                var logVm = new LogViewModel();
                logVm.Mensagem = send.Value;
                logVm.Controller = "Prestador";
                logVm.View = "EnviaEmailConfirmacao";
                var log = Mapper.Map<LogViewModel, Log>(logVm);
                _logAppService.SaveOrUpdate(log);
            }
        }