//
        // GET: /Fechamento/
        public ActionResult Index()
        {
            Fechamento fechamento = new Fechamento();

            try
            {
                PedidoService pedidoService = new PedidoService();
                fechamento.Pedidos = pedidoService.ListPedidosAbertos(false);
                fechamento.BebidasSugeridas = pedidoService.ListBebidasSugeridas();
            }
            catch (Exception ex)
            {
                ViewBag.Error = ex.Message;
            }

            fechamento = InicializaTela(fechamento);

            return View(fechamento);
        }
        public ActionResult Index(Fechamento fechamento)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    // Carrega os pedidos em aberto
                    PedidoService pedidoService = new PedidoService();
                    fechamento.Pedidos = pedidoService.ListPedidosAbertos(true);

                    // Carrega os parãmetros
                    ParametroService parametroService = new ParametroService();
                    fechamento.Parametro = parametroService.Find();

                    // Fecha o pedido
                    FechamentoService fechamentoService = new FechamentoService();
                    fechamentoService.FechaPedido(fechamento);

                    // Envia os emails
                    fechamentoService.EnviaEmailContato(fechamento);
                    fechamentoService.EnviaEmailUsuarios(fechamento);

                    TempData["message"] = "Pedido finalizado com sucesso - Valor total R$ " + String.Format("{0:0.00}", fechamento.Pedidos.Sum(p => p.Valor));

                    return RedirectToAction("Index", "Home");
                }
            }
            catch (Exception ex)
            {
                ViewBag.Error = ex.Message;
            }

            fechamento = InicializaTela(fechamento);

            return View();
        }
        private Fechamento InicializaTela(Fechamento fechamento)
        {
            BebidaService bebidaService = new BebidaService();
            fechamento.BebidasDisponiveis = bebidaService.List();

            using (Context db = new Context())
            {
                // DropDownList Bebida
                if (fechamento.BebidaId != 0)
                    ViewBag.Bebidas = new SelectList(db.Bebida.ToList(), "Id", "Nome", fechamento.BebidaId);
                else
                    ViewBag.Bebidas = new SelectList(db.Bebida.ToList(), "Id", "Nome");
            }

            return fechamento;
        }
        public void EnviaEmailContato(Fechamento fechamento)
        {
            string toMailAddress = fechamento.Parametro.EmailContato;
            string toContact = fechamento.Parametro.NomeContato;
            decimal valorTotalPedido = 0;

            StringBuilder message = new StringBuilder();

            message.Append("Olá " + toContact + ", \n\n");

            if (fechamento.PossuiTeleEntrega)
            {
                message.Append("Segue pedido do pessoal da Voiza para Tele-Entrega na Voiza:\n\n");
                message.Append("FORMA PAGAMENTO: \n Visa e Visa Vale \n\n");
                message.Append("TELE ENTREGA: R$" + fechamento.Parametro.ValorTeleEntrega + "\n\n");

                valorTotalPedido += (decimal)fechamento.Parametro.ValorTeleEntrega;

                if (fechamento.PossuiBebida)
                {
                    message.Append("BEBIDAS:\n");

                    BebidaService bebidaService = new BebidaService();

                    for (short i = 0; i < fechamento.PedidoIdBebidas.Length; i++)
                    {
                        if (fechamento.PedidoQuantidadeBebidas[i] > 0)
                        {
                            message.Append(" - " + fechamento.PedidoQuantidadeBebidas[i] + " " + bebidaService.GetName(fechamento.PedidoIdBebidas[i]) + " - R$" + fechamento.PedidoQuantidadeBebidas[i] * bebidaService.GetValor(fechamento.PedidoIdBebidas[i]) + "\n");
                            valorTotalPedido += fechamento.PedidoQuantidadeBebidas[i] * bebidaService.GetValor(fechamento.PedidoIdBebidas[i]);
                        }
                    }
                    message.Append("\n");
                }

                message.Append("LANCHES: \n\n");

                foreach (var pedido in fechamento.Pedidos)
                {
                    message.Append(pedido.Usuario.Nome.ToUpper() + " -> " + pedido.Lanche.Nome.ToUpper() + " - R$" + pedido.ValorLanche + "\n");

                    foreach (Opcional opcional in pedido.Opcionais)
                        message.Append(" - Com " + opcional.Nome + "\n");

                    if (!String.IsNullOrWhiteSpace(pedido.Observacao))
                        message.Append(" Obs: " + pedido.Observacao + "\n");

                    valorTotalPedido += (decimal)pedido.ValorLanche;

                    message.Append("\n\n");
                }

                message.Append("VALOR TOTAL DO PEDIDO: R$" + valorTotalPedido + "\n\n");
                message.Append("Muito Obrigado!\n\n");
                message.Append("*** NÃO RESPONDER ESTE EMAIL - MENSAGEM GERADA AUTOMATICAMENTE - SextaNerdApplication ***");

                //Envia email
                Mail.SendMail(toMailAddress, "Pedido Voiza - Tele-Entrega", message.ToString());
            }
            else
            {
                message.Append("Segue pedido do pessoal da Voiza para comer no Restaurante:\n\n");

                message.Append("LANCHES: \n\n");

                foreach (var pedido in fechamento.Pedidos)
                {
                    message.Append(pedido.Usuario.Nome.ToUpper() + " -> " + pedido.Lanche.Nome.ToUpper() + "\n");

                    foreach (Opcional opcional in pedido.Opcionais)
                        message.Append(" - Com " + opcional.Nome + "\n");

                    if (!String.IsNullOrWhiteSpace(pedido.Observacao))
                        message.Append(" Obs: " + pedido.Observacao + "\n");

                    valorTotalPedido += (decimal)pedido.ValorLanche;

                    message.Append("\n\n");
                }

                message.Append("Muito Obrigado!\n\n");
                message.Append("*** NÃO RESPONDER ESTE EMAIL - MENSAGEM GERADA AUTOMATICAMENTE - SextaNerdApplication ***");

                //Envia email
                Mail.SendMail(toMailAddress, "Pedido Voiza - Restaurante", message.ToString());
            }
        }
        public void FechaPedido(Fechamento fechamento)
        {
            // Calcula o valor da tele-entrega

            if (fechamento.PossuiTeleEntrega)
            {
                decimal parcelaTeleEntrega = Decimal.Round((fechamento.Parametro.ValorTeleEntrega / fechamento.Pedidos.Count()), 2);

                foreach (Pedido pedido in fechamento.Pedidos)
                {
                    pedido.ValorEntrega = parcelaTeleEntrega;
                }

                // Calcula o valor das bebidas

                if (fechamento.PossuiBebida)
                {
                    BebidaService bebidaService = new BebidaService();

                    decimal totalBebida = 0;
                    decimal parcelaBebida;

                    for (short i = 0; i < fechamento.PedidoIdBebidas.Length; i++)
                    {
                        totalBebida += fechamento.PedidoQuantidadeBebidas[i] * bebidaService.GetValor(fechamento.PedidoIdBebidas[i]);
                    }

                    parcelaBebida = Decimal.Round((totalBebida / fechamento.Pedidos.Where(p => p.BebidaId != null).Count()), 2);

                    foreach (Pedido pedido in fechamento.Pedidos)
                    {
                        if(pedido.BebidaId != null)
                            pedido.ValorBebida = parcelaBebida;
                    }
                }
            }

            // Atualiza o valor de todos os pedidos em aberto

            PedidoService pedidoService = new PedidoService();

            foreach (Pedido pedido in fechamento.Pedidos)
            {
                pedido.Valor = pedido.Valor + (pedido.ValorBebida != null ? pedido.ValorBebida.Value : 0) + (pedido.ValorEntrega != null ? pedido.ValorEntrega.Value : 0);

                // Marca o pedido como atendido
                pedido.Atendido = 1;

                pedidoService.UpdateSimple(pedido);
            }
        }
        public void EnviaEmailUsuarios(Fechamento fechamento)
        {
            UsuarioService userService = new UsuarioService();

            foreach (var pedido in fechamento.Pedidos)
            {
                string toMailAddress = pedido.Usuario.Email;

                StringBuilder message = new StringBuilder();

                message.Append("Eea Tchê!\n\n");
                message.Append("O pedido do SextaNerd já foi feito!\n\n");
                message.Append("Lanche escolhido:\n\n");
                message.Append(" * " + pedido.Lanche.Nome.ToUpper() + "\n\n");
                message.Append(" Opcionais escolhidos:\n\n");

                foreach (Opcional opcional in pedido.Opcionais)
                {
                    message.Append("  * Com " + opcional.Nome + "\n");
                }

                if (!String.IsNullOrWhiteSpace(pedido.Observacao))
                {
                    message.Append("  * " + pedido.Observacao + "\n");
                }

                message.Append("\n");

                if(fechamento.PossuiTeleEntrega)
                    message.Append("VALOR REFERENTE A ENTREGA: R$" + String.Format("{0:0.00}", pedido.ValorEntrega) + "\n\n");

                if (pedido.ValorBebida > 0)
                    message.Append("VALOR REFERENTE A BEBIDA: R$" + String.Format("{0:0.00}", pedido.ValorBebida) + "\n\n");

                message.Append("VALOR DO LANCHE: R$" + String.Format("{0:0.00}", pedido.ValorLanche) + "\n\n");

                message.Append("VALOR TOTAL: R$" + String.Format("{0:0.00}", pedido.Valor) + "\n\n");

                message.Append("Obrigado!\n\n");

                message.Append("*** NÃO RESPONDER ESTE EMAIL - MENSAGEM GERADA AUTOMATICAMENTE - SextaNerdApplication ***");

                Mail.SendMail(toMailAddress, "Seu pedido Nrº " + userService.GetNumeroTotalLancheByUsuario(pedido.Usuario.Id)  + " da SextaNerd foi fechado", message.ToString());
            }
        }