/*
         *
         * public static void selecionarEndereco(Action<EnderecoInfo> aoSelecionar)
         * {
         *  var regraUsuario = UsuarioFactory.create();
         *  var usuario = regraUsuario.pegarAtual();
         *  if (usuario != null)
         *  {
         *      if (usuario.Enderecos.Count == 1)
         *      {
         *          aoSelecionar?.Invoke(usuario.Enderecos[0]);
         *      }
         *      else if (usuario.Enderecos.Count > 1)
         *      {
         *          var enderecoListaPage = EnderecoUtils.gerarEnderecoLista((endereco) => {
         *              aoSelecionar?.Invoke(endereco);
         *          });
         *          var enderecos = new List<EnderecoInfo>();
         *          foreach (var endereco in usuario.Enderecos)
         *          {
         *              enderecos.Add(endereco);
         *          }
         *          enderecoListaPage.Enderecos = enderecos;
         *          if (App.Current.MainPage is RootPage)
         *          {
         *              ((RootPage)App.Current.MainPage).PushAsync(enderecoListaPage);
         *          }
         *          else
         *          {
         *              App.Current.MainPage = App.gerarRootPage(enderecoListaPage);
         *          }
         *      }
         *      else
         *      {
         *          var cepPage = 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);
         *
         *              aoSelecionar?.Invoke(endereco);
         *          });
         *          if (App.Current.MainPage is RootPage)
         *          {
         *              ((RootPage)App.Current.MainPage).PushAsync(cepPage);
         *          }
         *          else
         *          {
         *              App.Current.MainPage = App.gerarRootPage(cepPage);
         *          }
         *      }
         *  }
         *  else
         *  {
         *      var cepPage = EnderecoUtils.gerarBuscaPorCep((endereco) => {
         *          var usuarioCep = regraUsuario.pegarAtual();
         *          if (usuarioCep == null)
         *          {
         *              usuarioCep = new UsuarioInfo();
         *          }
         *          usuarioCep.Enderecos.Add(UsuarioEnderecoInfo.clonar(endereco));
         *          regraUsuario.gravarAtual(usuarioCep);
         *
         *          aoSelecionar?.Invoke(endereco);
         *      });
         *      if (App.Current.MainPage is RootPage)
         *      {
         *          ((RootPage)App.Current.MainPage).PushAsync(cepPage);
         *      }
         *      else
         *      {
         *          App.Current.MainPage = App.gerarRootPage(cepPage);
         *      }
         *  }
         * }
         */

        public static void selecionarEndereco(Action <EnderecoInfo> aoSelecionar)
        {
            var regraUsuario = UsuarioFactory.create();
            var usuario      = regraUsuario.pegarAtual();

            if (usuario != null)
            {
                if (usuario.Enderecos.Count == 1)
                {
                    aoSelecionar?.Invoke(usuario.Enderecos[0]);
                }
                else if (usuario.Enderecos.Count > 1)
                {
                    var enderecoListaPage = EnderecoUtils.gerarEnderecoLista((endereco) => {
                        aoSelecionar?.Invoke(endereco);
                    });
                    var enderecos = new List <EnderecoInfo>();
                    foreach (var endereco in usuario.Enderecos)
                    {
                        enderecos.Add(endereco);
                    }
                    enderecoListaPage.Enderecos = enderecos;
                    if (App.Current.MainPage is RootPage)
                    {
                        ((RootPage)App.Current.MainPage).PushAsync(enderecoListaPage);
                    }
                    else
                    {
                        App.Current.MainPage = App.gerarRootPage(enderecoListaPage);
                    }
                }
                else
                {
                    var cepPage = 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);

                        aoSelecionar?.Invoke(endereco);
                    });
                    if (App.Current.MainPage is RootPage)
                    {
                        ((RootPage)App.Current.MainPage).PushAsync(cepPage);
                    }
                    else
                    {
                        App.Current.MainPage = App.gerarRootPage(cepPage);
                    }
                }
            }
            else
            {
                var cepPage = EnderecoUtils.gerarBuscaPorCep((endereco) => {
                    var usuarioCep = regraUsuario.pegarAtual();
                    if (usuarioCep == null)
                    {
                        usuarioCep = new UsuarioInfo();
                    }
                    usuarioCep.Enderecos.Add(UsuarioEnderecoInfo.clonar(endereco));
                    regraUsuario.gravarAtual(usuarioCep);

                    aoSelecionar?.Invoke(endereco);
                });
                if (App.Current.MainPage is RootPage)
                {
                    ((RootPage)App.Current.MainPage).PushAsync(cepPage);
                }
                else
                {
                    App.Current.MainPage = App.gerarRootPage(cepPage);
                }
            }
        }
        public static Page gerarBuscaPorCep(Action <EnderecoInfo> aoSelecionar, bool usaLogin = true)
        {
            var cepPage = new CepPage {
                Title         = "Entre com seu CEP",
                UsaBotaoLogin = usaLogin
            };

            cepPage.AoLogar += (sender, e) => {
                var loginPage = new LoginPage {
                    Title = "Login"
                };
                loginPage.AoLogar += (s2, usuario) => {
                    if (usuario.Enderecos.Count() == 1)
                    {
                        aoSelecionar?.Invoke(usuario.Enderecos[0]);
                    }
                    else if (usuario.Enderecos.Count() > 1)
                    {
                        ((Page)s2).Navigation.PushAsync(EnderecoUtils.gerarEnderecoLista((endereco) => {
                            aoSelecionar?.Invoke(endereco);
                        }));
                    }
                    else
                    {
                        ((Page)s2).Navigation.PushAsync(EnderecoUtils.gerarEnderecoLista((endereco) => {
                            aoSelecionar?.Invoke(endereco);
                        }), false);
                    }
                };
                ((Page)sender).Navigation.PushAsync(loginPage);
                //((Page)sender).Navigation.PushAsync(LoginUtils.gerarLogin((usuario) => {}));
            };
            cepPage.AoSelecionar += (s1, endereco) =>
            {
                var enderecoForm = new EnderecoFormPage
                {
                    Title      = "Complete seu endereço",
                    PodeEditar = false,
                    Endereco   = endereco
                };
                enderecoForm.AoSelecionar += (s2, endereco2) => {
                    ((Page)s2).Navigation.RemovePage(cepPage);
                    aoSelecionar(endereco2);
                    //((Page)s2).Navigation.RemovePage(enderecoForm);
                };
                cepPage.Navigation.PushAsync(enderecoForm);
            };
            cepPage.AoBuscar += (s0, e) => {
                var ufLista = new UfListaPage
                {
                    Title = "Selecione o Estado"
                };
                ufLista.AoSelecionar += (s1, estado) =>
                {
                    var cidadeBusca = new CidadeBuscaPage
                    {
                        Title = "Busque sua cidade",
                        Uf    = estado.Uf
                    };
                    cidadeBusca.AoSelecionar += (s2, cidade) => {
                        var bairroBusca = new BairroBuscaPage
                        {
                            Title    = "Busque seu bairro",
                            IdCidade = cidade.Id
                        };
                        bairroBusca.AoSelecionar += (s3, bairro) => {
                            var logradouroBusca = new LogradouroBuscaPage
                            {
                                Title    = "Busque seu endereço",
                                IdBairro = bairro.Id
                            };
                            logradouroBusca.AoSelecionar += (s4, endereco) =>
                            {
                                var enderecoForm = new EnderecoFormPage
                                {
                                    Title      = "Complete seu endereço",
                                    PodeEditar = false,
                                    Endereco   = endereco
                                };
                                enderecoForm.AoSelecionar += (s5, endereco2) => {
                                    ((Page)s5).Navigation.RemovePage(cepPage);
                                    ((Page)s5).Navigation.RemovePage(ufLista);
                                    ((Page)s5).Navigation.RemovePage(cidadeBusca);
                                    ((Page)s5).Navigation.RemovePage(bairroBusca);
                                    ((Page)s5).Navigation.RemovePage(logradouroBusca);
                                    aoSelecionar(endereco2);
                                    //((Page)s5).Navigation.RemovePage(enderecoForm);
                                };
                                ((Page)s4).Navigation.PushAsync(enderecoForm);
                            };
                            ((Page)s3).Navigation.PushAsync(logradouroBusca);
                        };
                        ((Page)s2).Navigation.PushAsync(bairroBusca);
                    };
                    ((Page)s1).Navigation.PushAsync(cidadeBusca);
                };
                ((Page)s0).Navigation.PushAsync(ufLista);
            };
            return(cepPage);
        }