public static GeneroObraDTO Traduzir(this GeneroObra item, int idIdioma)
        {
            var dto = new GeneroObraDTO()
            {
                Id        = item.Id,
                Descricao = item.Descricoes.FirstOrDefault(x => x.IdIdioma == idIdioma).Descricao
            };

            return(dto);
        }
        /// <summary>
        /// Método para iniciar a população do banco de dados
        /// </summary>
        /// <param name="serviceProvider"></param>
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var contexto = new MainContext(
                       serviceProvider.GetRequiredService <DbContextOptions <MainContext> >()))
            {
                // Creates the database if not exists
                contexto.Database.EnsureCreated();

                /////////////////////////////////////////////////////////////////////////
                // TODO: Carga de Idiomas

                // English, inglês
                Idioma eng = new Idioma()
                {
                    Descricao      = "English",
                    ISO639Alfa2    = "en",
                    ISO639Alfa3    = "eng",
                    HtmlCode       = string.Empty,
                    DataDeInclusao = DateTime.Now
                };

                if (contexto.Idioma.Where(i => i.ISO639Alfa3 == eng.ISO639Alfa3).Count() == 0)
                {
                    contexto.Idioma.Add(eng);
                }

                string siglaPortugues = "por";

                // Portuguese, português
                Idioma por = contexto.Idioma.Where(x => x.ISO639Alfa3 == siglaPortugues).FirstOrDefault();
                if (por == null)
                {
                    por = new Idioma()
                    {
                        Descricao      = "Português",
                        ISO639Alfa2    = "pt",
                        ISO639Alfa3    = siglaPortugues,
                        HtmlCode       = string.Empty,
                        DataDeInclusao = DateTime.Now
                    };

                    contexto.Idioma.Add(por);
                }

                /////////////////////////////////////////////////////////////////////////
                // TODO: Carga de Paises

                var paises = new List <Pais>();

                var brasil = new Pais()
                {
                    ISO3166Alfa2   = "Br",
                    ISO3166Alfa3   = "Bra",
                    CodigoTelefone = 55,
                    DataDeInclusao = DateTime.Now
                };

                brasil.Descricoes.Add(new PaisDescricao()
                {
                    Descricao = "Brasil",
                    Idioma    = por
                });

                brasil.Descricoes.Add(new PaisDescricao()
                {
                    Descricao = "Brazil",
                    Idioma    = eng
                });

                paises.Add(brasil);

                foreach (var pais in paises)
                {
                    if (contexto.Pais.Where(x => x.ISO3166Alfa3.Contains(pais.ISO3166Alfa3)).Count() == 0)
                    {
                        contexto.Pais.Add(pais);
                    }
                    else
                    {
                        var paisfromdb = contexto.Pais.Where(x => x.ISO3166Alfa3.Contains(pais.ISO3166Alfa3))
                                         .Include(p => p.Descricoes)
                                         .FirstOrDefault();
                        // TODO: Verificar se as descrições estão completas com todos os idiomas
                        // TODO: Ou excluir todas as descrições e incluir novamente
                        //foreach(var d in paisfromdb.Descricoes){
                        //foreach(var s in pais.Descricoes){
                        //if (d.Idioma.ISO639Alfa3 == s.Idioma.ISO639Alfa3)
                        //}
                        //}
                    }
                }

                brasil = contexto.Pais.Where(x => x.ISO3166Alfa3.Contains(brasil.ISO3166Alfa3)).FirstOrDefault();

                /////////////////////////////////////////////////////////////////////////
                // TODO: Carga de Gêneros das Obras

                var generos = new List <GeneroObra>();

                var literaria = new GeneroObra()
                {
                    Codigo         = 1,
                    DataDeInclusao = DateTime.Now
                };

                literaria.Descricoes.Add(new GeneroObraDescricao()
                {
                    Descricao = "Literária",
                    Idioma    = por
                });

                literaria.Descricoes.Add(new GeneroObraDescricao()
                {
                    Descricao = "English",
                    Idioma    = eng
                });

                generos.Add(literaria);

                foreach (var g in generos)
                {
                    if (contexto.GeneroObra.Where(x => x.Codigo == g.Codigo).Count() == 0)
                    {
                        contexto.GeneroObra.Add(g);
                    }
                    else
                    {
                        var generofromdb = contexto.GeneroObra.Where(x => x.Codigo == g.Codigo)
                                           .Include(p => p.Descricoes)
                                           .FirstOrDefault();
                        // TODO: Excluir todas as descrições e incluir novamente
                    }
                }

                /////////////////////////////////////////////////////////////////////////
                // TODO: Carga de Tipos de Documentos

                var tiposDeDocumentos = new List <TipoDocumento>();

                var cpf = new TipoDocumento()
                {
                    Codigo         = 1,
                    DataDeInclusao = DateTime.Now
                };

                cpf.Descricoes.Add(new TipoDocumentoDescricao()
                {
                    Descricao = "CPF",
                    Idioma    = por
                });

                cpf.Descricoes.Add(new TipoDocumentoDescricao()
                {
                    Descricao = "English",
                    Idioma    = eng
                });

                tiposDeDocumentos.Add(cpf);

                foreach (var t in tiposDeDocumentos)
                {
                    if (contexto.TipoDocumento.Where(x => x.Codigo == t.Codigo).Count() == 0)
                    {
                        contexto.TipoDocumento.Add(t);
                    }
                    else
                    {
                        var tipodocfromdb = contexto.TipoDocumento.Where(x => x.Codigo == t.Codigo)
                                            .Include(p => p.Descricoes)
                                            .FirstOrDefault();
                        // TODO: Excluir todas as descrições e incluir novamente
                    }
                }

                /////////////////////////////////////////////////////////////////////////
                // Criando um usuário para testes em produção

                var nome = "Rodrigo Lessa";
                //var email = new Email("*****@*****.**");
                var email = "*****@*****.**";
                //var telefone = new Telefone("21", "988997240");
                var telefone           = "21988997240";
                var endereco           = new Endereco("Rua Doutor Nilo Peçanha", "Bloco 04 Apto 906", "1170", "Estrela Do Norte", "São Gonçalo", Uf.RJ, string.Empty, new Cep("24450000", false));
                var senha              = "Lcd!123";
                var confirmacaoDeSenha = "Lcd!123";

                // HACK: Create a user for debugging proposes
                var usuario = new Usuario(nome, senha, confirmacaoDeSenha, email, telefone)
                {
                    Idioma = por,
                    Pais   = brasil
                };

                usuario.SetEndereco(endereco);
                usuario.Requerentes.Add(new Requerente(
                                            "Manuela Lessa",
                                            "Manu",
                                            "Lilia Silva",
                                            new DateTime(2019, 1, 1),
                                            "Brasileira",
                                            new Email("*****@*****.**")
                                            ));

                if (contexto.Usuario.Where(x => x.Email == email).Count() == 0)
                {
                    contexto.Usuario.Add(usuario);
                }

                /////////////////////////////////////////////////////////////////////////
                // Saves all data in MySQL
                contexto.SaveChanges();
            }
        }