public string Criar(int idQuestao, string titulo, bool certa)
        {
            using (var context = new Context()) 
            {
                var questao = context.DbQuestoes.Where(q => q.IdQuestao.Equals(idQuestao)).FirstOrDefault();

                var alternativa = new Alternativa
                {
                    Descricao = titulo,
                    IdQuestao = idQuestao,
                    Questao = questao,
                    Certa = certa
                };

                context.Set<Alternativa>().Add(alternativa);
                context.SaveChanges();

                var anonObj = new
                {
                    uid = alternativa.IdAlternativa,
                    titulo = alternativa.Descricao,
                    certa = alternativa.Certa
                };

                var serializer = new JavaScriptSerializer();
                return serializer.Serialize(anonObj);
            }
        }
        public void Criar(string descricao, int idCategoria, int idUsuarioCriador)
        {
            Context.Response.Clear();
            using (var context = new Context())
            {
                var categoria = context.DbCategorias.Where(c => c.IdCategoria.Equals(idCategoria)).FirstOrDefault();
                var usuario = context.DbUsuarios.Where(c => c.IdUsuario == idUsuarioCriador).FirstOrDefault();               

                var questionario  = new Questionario
                {
                    Descricao = descricao,
                    IdCategoria = idCategoria,
                    Categoria = categoria,
                    IdUsuarioCriador = idUsuarioCriador,
                   // UsuarioCriador = usuario
                };

                context.Set<Questionario>().Add(questionario);                
                context.SaveChanges();
               

                var retornoAnon = new
                {
                    uid = questionario.IdQuestionario,
                    descricao = questionario.Descricao,
                    categoria = questionario.IdCategoria,
                    criador = questionario.IdUsuarioCriador
                    
                };

                var serializer = new JavaScriptSerializer();
                Context.Response.Write(serializer.Serialize(retornoAnon));
            }
        }
        public void Criar(string nome, string email, string senha)
        {
            Context.Response.Clear();
            using (var context = new Context())
            {
                var usuario = context.DbUsuarios.Where(u => u.Email.Equals(email)).FirstOrDefault();
                if (usuario == null)
                {
                    var usuarioNew = new Usuario
                    {
                        Email = email,
                        Nome = nome,
                        Senha = senha
                    };
                    context.Set<Usuario>().Add(usuarioNew);
                    context.SaveChanges();
                    Context.Response.Write(usuarioNew.IdUsuario);
                }
                else
                {
                    throw new Exception("Email ja cadastrado!");
                }
            };

        }
        public object Criar(string titulo, int tipoQuestao, int idQuestionario)
        {
            using (var context = new Context()) 
            {
                var questionario = context.DbQuestionarios.Where(q => q.IdQuestionario.Equals(idQuestionario)).FirstOrDefault();
                var tipoQuestaoEnum = (TipoQuestao)tipoQuestao;

                var questao = new Questao
                {
                    Titulo = titulo,
                    Tipo = tipoQuestaoEnum,
                    Questionario = questionario,
                    IdQuestionario = idQuestionario
                };

                context.Set<Questao>().Add(questao);
                context.SaveChanges();

                var anonObj = new
                {
                    uid = questao.IdQuestao,
                    titulo =  questao.Titulo,
                    tipo = questao.Tipo.ToString()
                };

                var serializer = new JavaScriptSerializer();
                return serializer.Serialize(anonObj);
            }
        }
        public void Excluir(int idAlternativa)
        {
            using (var context = new Context())
            {
                var alternativa = context.DbAlternativas.Where(q => q.IdAlternativa.Equals(idAlternativa)).FirstOrDefault();
                alternativa.Excluido = true;

                context.Set<Alternativa>().Attach(alternativa);
                context.Entry(alternativa).State = EntityState.Modified;
                context.SaveChanges();
            }
        }
 public void Excluir(int idQuestao)
 {
     using (var context = new Context())
     {
         var questao = context.DbQuestoes.Where(q => q.IdQuestao.Equals(idQuestao)).FirstOrDefault();
         questao.Excluido = true;
         
         context.Set<Questao>().Attach(questao);
         context.Entry(questao).State = EntityState.Modified;
         context.SaveChanges();
     }
 }
        public void Editar(int idAlternativa, string descricao, bool certa)
        {
            using (var context = new Context())
            {
                var alternativa = context.DbAlternativas.Where(q => q.IdAlternativa.Equals(idAlternativa)).FirstOrDefault();
                
                alternativa.Descricao = descricao;
                alternativa.Certa = certa;

                context.Set<Alternativa>().Attach(alternativa);
                context.Entry(alternativa).State = EntityState.Modified;
                context.SaveChanges();

            }
        }
        public void Editar(int idQuestao, string titulo, int tipoQuestao)
        {
            using (var context = new Context())
            {
                var questao = context.DbQuestoes.Where(q => q.IdQuestao.Equals(idQuestao)).FirstOrDefault();
                var tipoQuestaoEnum = (TipoQuestao)tipoQuestao;

                questao.Tipo = tipoQuestaoEnum;
                questao.Titulo = titulo;

                context.Set<Questao>().Attach(questao);
                context.Entry(questao).State = EntityState.Modified;
                context.SaveChanges();
            }
        }
 public void Alterar(int idCategoria, string descricao)
 {
     using (var context = new Context())
     {               
         var categoria = context.DbCategorias.Where(c => c.IdCategoria.Equals(idCategoria)).FirstOrDefault();
         if (categoria != null)
         {
             categoria.Descricao = descricao;
             context.Set<Categoria>().Attach(categoria);
             context.Entry(categoria).State = EntityState.Modified;
             context.SaveChanges();
         }
         else
         {
             throw new Exception("Categoria não existe.");
         }
     };
 }
        public void Criar(string descricao, int idUsuarioCriador)
        {
            using (var context = new Context())
            {
                Context.Response.Clear();
                var usuario = context.DbUsuarios.Where(u => u.IdUsuario == idUsuarioCriador).FirstOrDefault();
                // caso não encontre o usuário no banco não inclui a categoria
                if (usuario == null)
                {
                    throw new Exception("Usuario nao cadastrado!");
                }
                var categoria = context.DbCategorias.Where(c => c.Descricao.Equals(descricao) && c.IdUsuarioCriador == idUsuarioCriador && !c.Excluido).FirstOrDefault();
               
                if (categoria == null)
                {
                    var categoriaNew = new Categoria
                    {
                        Descricao = descricao,
                        IdUsuarioCriador = idUsuarioCriador,
                        UsuarioCriador  = usuario                      
                    };
                    context.Set<Categoria>().Add(categoriaNew);
                    context.SaveChanges();

                    var anonObj = new 
                    {
                        uid = categoriaNew.IdCategoria,
                        descricao = categoriaNew.Descricao,
                        criador = categoriaNew.IdUsuarioCriador
                    };

                    var serializer = new JavaScriptSerializer();
                    Context.Response.Write(serializer.Serialize(anonObj));

                }
                else
                {
                    throw new Exception("Já existe uma categoria com esse nome para esse usuário.");
                }
            };
        }
        public void Editar(int idQuestionario, string descricao, int idCategoria)
        {
            using (var context = new Context())
            {
                var questionario = context.DbQuestionarios.Where(q => q.IdQuestionario.Equals(idQuestionario)).FirstOrDefault();
                var categoria = context.DbCategorias.Where(c => c.IdCategoria.Equals(idCategoria)).FirstOrDefault();
                if (questionario != null)
                {
                    questionario.Descricao = descricao;
                    questionario.Categoria = categoria;
                    questionario.IdCategoria = idCategoria;

                    context.Set<Questionario>().Attach(questionario);
                    context.Entry(questionario).State = EntityState.Modified;
                    context.SaveChanges();
                }
                else
                {
                    throw new Exception("Questionário não existe.");
                }
            }
        }
        public void Logar(string email, string senha)
        {
            Context.Response.Clear();
            using (var context = new Context()) 
            {
                var usuario = context.DbUsuarios.Where(u => u.Email.Equals(email) && u.Senha.Equals(senha)).FirstOrDefault();
                var serializer = new JavaScriptSerializer();
                if (usuario != null)
                {
                    var retornoAnon = new 
                    {
                        uid = usuario.IdUsuario,
                        nome = usuario.Nome,
                        email = usuario.Email,

                    };
                    Context.Response.Write(serializer.Serialize(retornoAnon));
                }
                else
                    throw new Exception("Erro na autenticacao");
  
            };
        }
        public void Retornar(int idUsuario) 
        {
            Context.Response.Clear();
            using (var context = new Context())
            {
                var usuario = context.DbUsuarios.Where(u => u.IdUsuario.Equals(idUsuario)).FirstOrDefault();
                var serializer = new JavaScriptSerializer();

                if (usuario != null)
                {
                    var retornoAnon = new
                       {
                           uid = usuario.IdUsuario,
                           nome = usuario.Nome,
                           email = usuario.Email,

                       };
                    Context.Response.Write(serializer.Serialize(retornoAnon));
                }
                else
                    throw new Exception("Usuario não existe.");
            }
        }
        public void Retornar(int idQuestionario)
        {

            Context.Response.Clear();
            using (var context = new Context())
            {
                var questionario = context.DbQuestionarios.Where(q => q.IdQuestionario.Equals(idQuestionario) && !q.Excluido).FirstOrDefault();
                var categoria = context.DbCategorias.Where(c => c.IdCategoria.Equals(questionario.IdCategoria)).FirstOrDefault();
               // var questoes = context.DbQuestoes.Where(q => q.IdQuestionario.Equals(questionario.IdQuestionario) && !q.Excluido).ToList();
                
               // questionario.Questoes = questoes;
                questionario.Categoria = categoria;
        

                var anonObj = new
                {
                    uid = questionario.IdQuestionario,
                    descricao = questionario.Descricao,
                   /////// criador = new { uid = questionario.IdUsuarioCriador, nome = questionario.UsuarioCriador.Nome, email = questionario.UsuarioCriador.Email },
                    categoria = new
                    {
                        uid = questionario.Categoria.IdCategoria,
                        descricao = questionario.Categoria.Descricao,
                        criador = new { uid = questionario.Categoria.IdUsuarioCriador, nome = questionario.Categoria.UsuarioCriador.Nome, email = questionario.Categoria.UsuarioCriador.Email }
                    }
                    //questoes = questionario.Questoes.Select(q => new { uid = q.IdQuestao, titulo = q.Titulo, tipo = q.Tipo.ToString() })
                };

                var serializer = new JavaScriptSerializer();
                Context.Response.Write(serializer.Serialize(anonObj));
            }
        }
        public void RetornarPorUsuario(int idUsuario)
        {
            Context.Response.Clear();
            using (var context = new Context())
            {
                var categoria = context.DbCategorias.Where(c => c.IdUsuarioCriador.Equals(idUsuario) && !c.Excluido).ToList();
               
                var anonObj = categoria.Select(c => new
                    {
                        uid = c.IdCategoria,
                        descricao = c.Descricao,
                        criador = c.IdUsuarioCriador
                    });

                var serializer = new JavaScriptSerializer();
                Context.Response.Write(serializer.Serialize(anonObj));
            };
        }
        public void Excluir(int idQuestionario, int idUsuario)
        {
            using (var context = new Context())
            {
                var questionario = context.DbQuestionarios.Where(q => q.IdQuestionario.Equals(idQuestionario)).FirstOrDefault();               
                var usuario = context.DbUsuarios.Where(u => u.IdUsuario.Equals(idUsuario)).First();

                if (questionario != null)
                {
                    // se o Usuário é o criador do questionario então remove da base
                    if (questionario.IdUsuarioCriador == idUsuario)
                    {
                        questionario.Excluido = true;
                        context.Set<Questionario>().Attach(questionario);
                        context.Entry(questionario).State = EntityState.Modified;                    
                    }
                    // senão remove da tabela de relacionamento 
                    else
                    {
                        questionario.Usuarios.Remove(usuario);       
                    }                                       
                    context.SaveChanges();
     
                }
                else
                {
                    throw new Exception("Questionário não existe.");
                }
            }
        }
        public void RetornarBaixados(int idUsuario)
        {
            Context.Response.Clear();
            using (var context = new Context())
            {
                var usuario = context.DbUsuarios.Find(idUsuario);
                var questionarios = usuario.Questionarios;
               
                var anonObj = questionarios.Select(q => new
                {
                    uid = q.IdQuestionario,
                    descricao = q.Descricao,
                    criador = q.IdUsuarioCriador,
                    categoria = new
                    {
                        uid = q.Categoria.IdCategoria,
                        descricao = q.Categoria.Descricao,
                        criador = q.Categoria.IdUsuarioCriador
                        //criador = new { uid = questionario.Categoria.IdUsuarioCriador, nome = questionario.Categoria.UsuarioCriador.Nome, email = questionario.Categoria.UsuarioCriador.Email }
                    }
                });

                var serializer = new JavaScriptSerializer();
                Context.Response.Write(serializer.Serialize(anonObj));
            }
        }
        public object Retornar(int idQuestao)
        {
            using (var context = new Context())
            {
                var questao = context.DbQuestoes.Where(q => q.IdQuestao.Equals(idQuestao) && !q.Excluido).FirstOrDefault();
                var alternativas = context.DbAlternativas.Where(a => a.IdQuestao.Equals(questao.IdQuestao)).ToList();

                questao.Alternativas = alternativas;
                var anonObj = new
                {
                    uid = questao.IdQuestao,
                    titulo = questao.Titulo,
                    tipo = questao.Tipo,
                    alternativas = alternativas.Select(a => new { uid = a.IdAlternativa, titulo = a.Descricao, correta = a.Certa })
                };

                var serializer = new JavaScriptSerializer();
                return serializer.Serialize(anonObj);
            }
        }
 public void RetornarCompartilhados()
 {
     Context.Response.Clear();
     using (var context = new Context())
     {
         var questionarios = context.DbQuestionarios.Where(q => q.Publico == true).ToList();
        
        var anonObj = questionarios.Select(q => new 
         {
             uid = q.IdQuestionario,
             descricao = q.Descricao,
             criador = q.IdUsuarioCriador,
             categoria = new
             {
                 uid = q.Categoria.IdCategoria,
                 descricao = q.Categoria.Descricao,
                 criador = q.Categoria.IdUsuarioCriador
                 //criador = new { uid = questionario.Categoria.IdUsuarioCriador, nome = questionario.Categoria.UsuarioCriador.Nome, email = questionario.Categoria.UsuarioCriador.Email }
             }
         });
         
         var serializer = new JavaScriptSerializer();
         Context.Response.Write(serializer.Serialize(anonObj));              
     }
 }
        public void Compartilhar(int idQuestionario, bool publico)
        {
            
            using (var context = new Context())
            {
                var questionario = context.DbQuestionarios.Where(q => q.IdQuestionario.Equals(idQuestionario)).FirstOrDefault();
                if (questionario != null)
                {
                    questionario.Publico = publico;

                    context.Set<Questionario>().Attach(questionario);
                    context.Entry(questionario).State = EntityState.Modified;
                    context.SaveChanges();
                }
                else
                {
                    throw new Exception("Questionário não existe.");
                }
            }

        }
        public void Baixar(int idQuestionario, int idUsuario)
        {
            Context.Response.Clear();
            using (var context = new Context())
            {                
                
                var usuario = context.DbUsuarios.Where(c => c.IdUsuario == idUsuario).FirstOrDefault();
                var questionario = context.DbQuestionarios.Where(q => q.IdQuestionario.Equals(idQuestionario)
                    && !q.IdUsuarioCriador.Equals(idUsuario) && q.Publico == true).FirstOrDefault();
               
                if (questionario != null && usuario != null)
                {
                    // adiciona nas tabelas associativas questionario_usuario 
                    questionario.Usuarios.Add(usuario);
                    context.Set<Questionario>().Attach(questionario);
                    context.Entry(questionario).State = EntityState.Modified;
                    context.SaveChanges();                 

                    var retornoAnon = new
                    {
                        uid = questionario.IdQuestionario,
                        descricao = questionario.Descricao,
                        categoria = questionario.IdCategoria,
                        criador = questionario.IdUsuarioCriador

                    };

                    var serializer = new JavaScriptSerializer();
                    Context.Response.Write(serializer.Serialize(retornoAnon));
                }
                else
                {
                    throw new Exception("Não foi possivel baixar o questionario");
                }
            }
        }
        public void RetornarPorUsuario(int idUsuario)
        {
            Context.Response.Clear();
            using (var context = new Context())
            {

                var questionarios = context.DbQuestionarios.Where(q => q.IdUsuarioCriador.Equals(idUsuario) && !q.Excluido).ToList();
               
                foreach (var questionario in questionarios) 
                {
                    var categoria = context.DbCategorias.Where(c => c.IdCategoria.Equals(questionario.IdQuestionario)).FirstOrDefault();
                    var questoes = context.DbQuestoes.Where(q => q.IdQuestionario.Equals(questionario.IdQuestionario) && !q.Excluido).ToList();

                    questionario.Questoes = questoes;
                    questionario.Categoria = categoria;
                }

                var anonObj = questionarios.Select(questionario => new
                                            {
                                                uid = questionario.IdQuestionario,
                                                descricao = questionario.Descricao,
                                                categoria = new
                                                {
                                                    uid = questionario.Categoria.IdCategoria,
                                                    descricao = questionario.Categoria.Descricao
                                                },
                                                questoes = questionario.Questoes.Select(q => new
                                                                                    {
                                                                                        uid = q.IdQuestao,
                                                                                        titulo = q.Titulo,
                                                                                        tipo = q.Tipo.ToString()
                                                                                    })
                                            });

                var serializer = new JavaScriptSerializer();
                Context.Response.Write(serializer.Serialize(anonObj));      
            }
        }
 public GerenciadorDeSessao(ContextConfiguration.Context context)
 {
     _context = context;
 }
        public string Retornar(int idQuestao)
        {
            using (var context = new Context())
            {
                var alternativas = context.DbAlternativas.Where(q => q.IdQuestao.Equals(idQuestao) && !q.Excluido).ToList();
                var anonObj = alternativas.Select(alternativa => new
                {
                    uid = alternativa.IdAlternativa,
                    descricao = alternativa.Descricao,
                    certa = alternativa.Certa
                });

                var serializer = new JavaScriptSerializer();
                return serializer.Serialize(anonObj);
            }
        }