protected async Task atualizarCategoria()
        {
            var regraLoja = LojaFactory.create();
            var loja      = regraLoja.pegarAtual();

            if (loja != null)
            {
                _empresaLabel.Text = loja.Nome;
                var regraCategoria = CategoriaFactory.create();
                UserDialogs.Instance.ShowLoading("Carregando...");
                try {
                    var regraBanner = BannerPecaFactory.create();
                    _bannerView.ItemsSource = await regraBanner.gerar(new BannerFiltroInfo {
                        SlugBanner = BannerUtils.CATEGORIA,
                        IdLoja     = loja.Id,
                        Ordem      = BannerOrdemEnum.PorOrdem
                    });

                    if (IdCategoria.HasValue)
                    {
                        executarAtualizarCategoria(await regraCategoria.listarPorCategoria(loja.Id, IdCategoria.Value));
                    }
                    else
                    {
                        executarAtualizarCategoria(await regraCategoria.listarPai(loja.Id));
                    }
                    UserDialogs.Instance.HideLoading();
                }
                catch (Exception erro)
                {
                    UserDialogs.Instance.HideLoading();
                    UserDialogs.Instance.Alert(erro.Message, "Erro", "Entendi");
                }
            }
            else
            {
                await DisplayAlert("Aviso", "Nenhuma loja selecionada.", "Fechar");
            }
        }
        //public static void gerarLojaLista(EnderecoInfo endereco) {
        public static async Task <LojaListaPage> gerarLojaLista(SeguimentoInfo seguimento, EnderecoInfo endereco, IList <LojaInfo> lojas)
        {
            var regraLoja     = LojaFactory.create();
            var regraBanner   = BannerPecaFactory.create();
            var lojaListaPage = new LojaListaPage
            {
                Title   = "Selecione sua Loja",
                Banners = await regraBanner.gerar(new BannerFiltroInfo
                {
                    SlugBanner   = BannerUtils.SEGUIMENTO,
                    IdSeguimento = seguimento.Id,
                    Latitude     = endereco.Latitude.Value,
                    Longitude    = endereco.Longitude.Value,
                    Raio         = regraLoja.RaioBusca
                }),
                Lojas = lojas
            };

            /*
             * lojaListaPage.AoCarregar += async (sender, e) =>
             * {
             *  var regraLoja = LojaFactory.create();
             *  var regraBanner = BannerPecaFactory.create();
             *  e.Banners = await regraBanner.gerar(new BannerFiltroInfo
             *  {
             *      SlugBanner = BannerUtils.SEGUIMENTO,
             *      IdSeguimento = seguimento.Id,
             *      Latitude = endereco.Latitude.Value,
             *      Longitude = endereco.Longitude.Value,
             *      Raio = regraLoja.RaioBusca
             *  });
             *  e.Lojas = await regraLoja.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca, seguimento.Id);
             * };
             */
            return(lojaListaPage);
        }
        public static async Task <Page> gerarSeguimento(EnderecoInfo endereco)
        {
            UserDialogs.Instance.ShowLoading("Carregando...");
            var seguimentoPage = new SeguimentoListaPage {
                Title = "Selecione o seguimento"
            };

            try {
                var regraBanner     = BannerPecaFactory.create();
                var regraSeguimento = SeguimentoFactory.create();
                var regraLoja       = LojaFactory.create();
                seguimentoPage.Banners = await regraBanner.gerar(new BannerFiltroInfo
                {
                    /*
                     * SlugBanner = BannerUtils.SEGUIMENTOS,
                     * Latitude = endereco.Latitude.Value,
                     * Longitude = endereco.Longitude.Value,
                     * Raio = regraLoja.RaioBusca,
                     * Ordem = BannerOrdemEnum.Aleatorio
                     */
                    SlugBanner = BannerUtils.SEGUIMENTOS,
                    Ordem      = BannerOrdemEnum.Aleatorio
                });

                seguimentoPage.Seguimentos = await regraSeguimento.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca);

                seguimentoPage.AoBuscarPorRaio += async(sender, raio) => {
                    UserDialogs.Instance.ShowLoading("Carregando...");
                    try
                    {
                        regraLoja.RaioBusca    = raio;
                        seguimentoPage.Banners = await regraBanner.gerar(new BannerFiltroInfo
                        {
                            /*
                             * SlugBanner = BannerUtils.SEGUIMENTOS,
                             * Latitude = endereco.Latitude.Value,
                             * Longitude = endereco.Longitude.Value,
                             * Raio = regraLoja.RaioBusca,
                             * Ordem = BannerOrdemEnum.Aleatorio
                             */
                            SlugBanner = BannerUtils.SEGUIMENTOS,
                            Ordem      = BannerOrdemEnum.Aleatorio
                        });

                        seguimentoPage.Seguimentos = await regraSeguimento.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca);

                        UserDialogs.Instance.HideLoading();
                    }
                    catch (Exception erro)
                    {
                        UserDialogs.Instance.HideLoading();
                        UserDialogs.Instance.Alert(erro.Message, "Erro", "Fechar");
                    }
                };
                seguimentoPage.AoClicar += async(sender, seguimento) => {
                    if (seguimento.ApenasPJ)
                    {
                        LoginUtils.carregarUsuario(async(usuario) => {
                            if (usuario.PJ.HasValue && usuario.PJ.Value)
                            {
                                try
                                {
                                    UserDialogs.Instance.ShowLoading("Carregando...");
                                    var lojas = await regraLoja.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca, seguimento.Id);
                                    if (lojas.Count > 0)
                                    {
                                        var lojaListaPage = await LojaUtils.gerarLojaLista(seguimento, endereco, lojas);
                                        UserDialogs.Instance.HideLoading();
                                        await seguimentoPage.Navigation.PushAsync(lojaListaPage);
                                    }
                                    else
                                    {
                                        UserDialogs.Instance.HideLoading();
                                        await UserDialogs.Instance.AlertAsync("Você deve aumentar o raio da busca ou aguardar futura loja no seguimento.");
                                    }
                                }
                                catch (Exception erro)
                                {
                                    UserDialogs.Instance.HideLoading();
                                    UserDialogs.Instance.Alert(erro.Message, "Erro", "Fechar");
                                }

                                //var lojaListaPage = gerarLojaLista(seguimento, endereco);
                                //seguimentoPage.Navigation.PushAsync(lojaListaPage);
                            }
                            else
                            {
                                await UserDialogs.Instance.AlertAsync("Essa é uma área apenas para pessoas jurídicas.");
                            }
                        });
                    }
                    else
                    {
                        //var lojaListaPage = gerarLojaLista(seguimento, endereco);
                        //seguimentoPage.Navigation.PushAsync(lojaListaPage);
                        try
                        {
                            UserDialogs.Instance.ShowLoading("Carregando...");
                            var lojas = await regraLoja.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca, seguimento.Id);

                            if (lojas.Count > 0)
                            {
                                var lojaListaPage = await LojaUtils.gerarLojaLista(seguimento, endereco, lojas);

                                UserDialogs.Instance.HideLoading();
                                await seguimentoPage.Navigation.PushAsync(lojaListaPage);
                            }
                            else
                            {
                                UserDialogs.Instance.HideLoading();
                                await UserDialogs.Instance.AlertAsync("Você deve aumentar o raio da busca ou aguardar futura loja no seguimento.");
                            }
                        }
                        catch (Exception erro)
                        {
                            UserDialogs.Instance.HideLoading();
                            UserDialogs.Instance.Alert(erro.Message, "Erro", "Fechar");
                        }
                    }
                };
                UserDialogs.Instance.HideLoading();
            }
            catch (Exception erro)
            {
                UserDialogs.Instance.HideLoading();
                UserDialogs.Instance.Alert(erro.Message, "Erro", "Fechar");
            }
            return(seguimentoPage);
        }
        /*
         * public static Page gerarEndereco() {
         *  return EnderecoUtils.gerarBuscaPorCep((endereco) =>
         *  {
         *      var regraUsuario = UsuarioFactory.create();
         *      var usuarioCep = regraUsuario.pegarAtual();
         *      if (usuarioCep == null)
         *      {
         *          usuarioCep = new UsuarioInfo();
         *      }
         *      usuarioCep.Enderecos.Add(UsuarioEnderecoInfo.clonar(endereco));
         *      regraUsuario.gravarAtual(usuarioCep);
         *
         *      var lojaListaPage = new LojaListaPage
         *      {
         *          Title = "Selecione sua Loja"
         *      };
         *      lojaListaPage.AoCarregar += async (sender, e) =>
         *      {
         *          var regraLoja = LojaFactory.create();
         *          var regraBanner = BannerPecaFactory.create();
         *          e.Banners = await regraBanner.gerar(new BannerFiltroInfo {
         *              SlugBanner = BannerUtils.SEGUIMENTO,
         *              Latitude = endereco.Latitude.Value,
         *              Longitude = endereco.Longitude.Value,
         *              Raio = regraLoja.RaioBusca
         *          });
         *          e.Lojas = await regraLoja.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca);
         *      };
         *      if (App.Current.MainPage is RootPage) {
         *          ((RootPage)App.Current.MainPage).PushAsync(lojaListaPage);
         *      }
         *      else {
         *          App.Current.MainPage = App.gerarRootPage(lojaListaPage);
         *      }
         *  });
         * }
         */

        /*
         * public static Page gerarSelecionar() {
         *  var regraUsuario = UsuarioFactory.create();
         *  var usuario = regraUsuario.pegarAtual();
         *  if (usuario != null)
         *  {
         *      if (usuario.Enderecos.Count == 1)
         *      {
         *          var endereco = usuario.Enderecos[0];
         *          var lojaListaPage = new LojaListaPage {
         *              Title = "Selecione sua Loja"
         *          };
         *          lojaListaPage.AoCarregar += async (sender, e) =>
         *          {
         *              var regraLoja = LojaFactory.create();
         *              var regraBanner = BannerPecaFactory.create();
         *              e.Banners = await regraBanner.gerar(new BannerFiltroInfo
         *              {
         *                  SlugBanner = BannerUtils.SEGUIMENTO,
         *                  Latitude = endereco.Latitude.Value,
         *                  Longitude = endereco.Longitude.Value,
         *                  Raio = regraLoja.RaioBusca
         *              });
         *              e.Lojas = await regraLoja.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca);
         *          };
         *          return lojaListaPage;
         *      }
         *      else if (usuario.Enderecos.Count > 1)
         *      {
         *          //return EnderecoUtils.gerarEnderecoLista((endereco) =>
         *          var enderecoListaPage = EnderecoUtils.gerarEnderecoLista((endereco) =>
         *          {
         *              var lojaListaPage = new LojaListaPage
         *              {
         *                  Title = "Selecione sua Loja"
         *              };
         *              lojaListaPage.AoCarregar += async (sender, e) =>
         *              {
         *                  var regraLoja = LojaFactory.create();
         *                  var regraBanner = BannerPecaFactory.create();
         *                  e.Banners = await regraBanner.gerar(new BannerFiltroInfo
         *                  {
         *                      SlugBanner = BannerUtils.SEGUIMENTO,
         *                      Latitude = endereco.Latitude.Value,
         *                      Longitude = endereco.Longitude.Value,
         *                      Raio = regraLoja.RaioBusca
         *                  });
         *                  e.Lojas = await regraLoja.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca);
         *              };
         *              if (App.Current.MainPage is RootPage) {
         *                  ((RootPage)App.Current.MainPage).PushAsync(lojaListaPage);
         *              }
         *              else {
         *                  App.Current.MainPage = App.gerarRootPage(lojaListaPage);
         *              }
         *          });
         *          var enderecos = new List<EnderecoInfo>();
         *          foreach (var endereco in usuario.Enderecos) {
         *              enderecos.Add(endereco);
         *          }
         *          enderecoListaPage.Enderecos = enderecos;
         *          return enderecoListaPage;
         *      }
         *      else
         *      {
         *          return gerarEndereco();
         *      }
         *  }
         *  else
         *  {
         *      return gerarEndereco();
         *  }
         * }
         */

        public static async Task <Page> gerarTelaInicial()
        {
            UserDialogs.Instance.ShowLoading("Carregando...");
            var telaInicialPage = new TelaInicialPage
            {
                Title = "Selecione o seguimento"
            };

            try
            {
                var regraLoja       = LojaFactory.create();
                var regraBanner     = BannerPecaFactory.create();
                var regraSeguimento = SeguimentoFactory.create();
                telaInicialPage.Banners = await regraBanner.gerar(new BannerFiltroInfo
                {
                    SlugBanner = BannerUtils.TELA_INICIAL,
                    Ordem      = BannerOrdemEnum.Aleatorio
                });

                telaInicialPage.Seguimentos = await regraSeguimento.listar();

                telaInicialPage.AoBuscarPorRaio += (sender, raio) => {
                    regraLoja.RaioBusca = raio;
                    EnderecoUtils.selecionarEndereco(async(endereco) => {
                        var seguimentoPage = await gerarSeguimento(endereco);
                        if (App.Current.MainPage is RootPage)
                        {
                            ((RootPage)App.Current.MainPage).PushAsync(seguimentoPage);
                        }
                        else
                        {
                            App.Current.MainPage = App.gerarRootPage(seguimentoPage);
                        }
                    });
                };
                telaInicialPage.AoClicar += (sender, seguimento) => {
                    if (seguimento.ApenasPJ)
                    {
                        LoginUtils.carregarUsuario((usuario) => {
                            if (usuario.PJ.HasValue && usuario.PJ.Value)
                            {
                                EnderecoUtils.selecionarEndereco(async(endereco) => {
                                    /*
                                     * var seguimentoPage = await gerarSeguimento(endereco);
                                     * if (App.Current.MainPage is RootPage) {
                                     *  ((RootPage)App.Current.MainPage).PushAsync(seguimentoPage);
                                     * }
                                     * else {
                                     *  App.Current.MainPage = App.gerarRootPage(seguimentoPage);
                                     * }
                                     */
                                    try {
                                        UserDialogs.Instance.ShowLoading("Carregando...");
                                        var lojas = await regraLoja.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca, seguimento.Id);
                                        if (lojas.Count > 0)
                                        {
                                            //var seguimentoPage = await gerarSeguimento(endereco);
                                            var lojaListaPage = await LojaUtils.gerarLojaLista(seguimento, endereco, lojas);
                                            UserDialogs.Instance.HideLoading();
                                            if (App.Current.MainPage is RootPage)
                                            {
                                                ((RootPage)App.Current.MainPage).PushAsync(lojaListaPage);
                                            }
                                            else
                                            {
                                                App.Current.MainPage = App.gerarRootPage(lojaListaPage);
                                            }
                                        }
                                        else
                                        {
                                            UserDialogs.Instance.HideLoading();
                                            await UserDialogs.Instance.AlertAsync("Você deve aumentar o raio da busca ou aguardar futura loja no seguimento.");
                                        }
                                    }
                                    catch (Exception erro)
                                    {
                                        UserDialogs.Instance.HideLoading();
                                        UserDialogs.Instance.Alert(erro.Message, "Erro", "Fechar");
                                    }
                                });
                            }
                            else
                            {
                                UserDialogs.Instance.AlertAsync("Essa é uma área apenas para pessoas jurídicas.");
                            }
                        });
                    }
                    else
                    {
                        EnderecoUtils.selecionarEndereco(async(endereco) => {
                            try {
                                UserDialogs.Instance.ShowLoading("Carregando...");
                                var lojas = await regraLoja.buscar(endereco.Latitude.Value, endereco.Longitude.Value, regraLoja.RaioBusca, seguimento.Id);
                                if (lojas.Count > 0)
                                {
                                    //var seguimentoPage = await gerarSeguimento(endereco);
                                    var lojaListaPage = await LojaUtils.gerarLojaLista(seguimento, endereco, lojas);
                                    UserDialogs.Instance.HideLoading();
                                    if (App.Current.MainPage is RootPage)
                                    {
                                        ((RootPage)App.Current.MainPage).PushAsync(lojaListaPage);
                                    }
                                    else
                                    {
                                        App.Current.MainPage = App.gerarRootPage(lojaListaPage);
                                    }
                                }
                                else
                                {
                                    UserDialogs.Instance.HideLoading();
                                    await UserDialogs.Instance.AlertAsync("Você deve aumentar o raio da busca ou aguardar futura loja no seguimento.");
                                }
                            }
                            catch (Exception erro)
                            {
                                UserDialogs.Instance.HideLoading();
                                UserDialogs.Instance.Alert(erro.Message, "Erro", "Fechar");
                            }
                        });
                    }
                };
                UserDialogs.Instance.HideLoading();
            }
            catch (Exception erro) {
                UserDialogs.Instance.HideLoading();
                UserDialogs.Instance.Alert(erro.Message, "Erro", "Fechar");
            }
            return(telaInicialPage);
        }