public bool QuitarRegistro(int pubId, string estId)
        {
            PublicacionDAO     publicacion       = RepositoryDAL1.Read <PublicacionDAO>(x => x.id == pubId).FirstOrDefault();
            TutoriaDAO         tutoria           = publicacion.Tutorias.FirstOrDefault();
            RegistroTutoriaDAO registroExistente = RepositoryDAL1.Read <RegistroTutoriaDAO>(x => x.id_estudiante.Equals(estId) && x.id_tutoria == tutoria.id).FirstOrDefault();

            if (registroExistente != null)
            {
                return(RepositoryDAL1.Delete(registroExistente));
            }
            return(false);
        }
        public bool RegistrarseEnTutoria(int pubId, string estId)
        {
            PublicacionDAO     publicacion       = RepositoryDAL1.Read <PublicacionDAO>(x => x.id == pubId).FirstOrDefault();
            TutoriaDAO         tutoria           = publicacion.Tutorias.FirstOrDefault();
            RegistroTutoriaDAO registroExistente = RepositoryDAL1.Read <RegistroTutoriaDAO>(x => x.id_estudiante.Equals(estId) && x.id_tutoria == tutoria.id).FirstOrDefault();

            if (registroExistente == null)
            {
                RegistroTutoriaDAO nuevoRegistro = new RegistroTutoriaDAO
                {
                    id_estudiante = estId,
                    id_tutoria    = tutoria.id
                };
                return(RepositoryDAL1.Create(nuevoRegistro));
            }
            return(false);
        }
        public bool CreateTutoria(Tutoria tutoria)
        {
            IEnumerable <string> nombresTecnologias = tutoria.Tecnologias.Select(x => x.Nombre);
            List <TecnologiaDAO> listaTecnologias   = RepositoryDAL1.Read <TecnologiaDAO>(x => nombresTecnologias.Contains(x.nombre));
            List <Tecnologia_x_publicacionDAO> listaTecnologiasPublicacion = new List <Tecnologia_x_publicacionDAO>();

            if (RepositoryDAL1.Create <PublicacionDAO>(new PublicacionDAO
            {
                descripcion = tutoria.Descripcion,
                fecha_publicacion = DateTime.Now,
                id_estudiante = tutoria.Id_autor,
                isTutoria = true,
                titulo = tutoria.Titulo,
                Tecnologia_x_publicacion = listaTecnologiasPublicacion,
                activo = true
            }))
            {
                int        id_publicacionCreada = RepositoryDAL1.Read <PublicacionDAO, int>(x => x.id > 0, x => x.id).FirstOrDefault().id;
                TutoriaDAO nuevaTutoria         = new TutoriaDAO
                {
                    costo          = tutoria.Costo,
                    id_publicacion = id_publicacionCreada,
                    lugar          = tutoria.Lugar,
                    fecha_tutoria  = tutoria.FechaTutoria
                };
                if (RepositoryDAL1.Create <TutoriaDAO>(nuevaTutoria))
                {
                    foreach (var tecnologia in listaTecnologias)
                    {
                        listaTecnologiasPublicacion.Add(new Tecnologia_x_publicacionDAO {
                            id_tecnologia = tecnologia.id, id_publicacion = id_publicacionCreada
                        });
                    }
                    EstudianteDAO estudianteAModificar = RepositoryDAL1.Read <EstudianteDAO>(x => x.id_usuario.Equals(tutoria.Id_autor)).FirstOrDefault();
                    estudianteAModificar.participacion++;
                    RepositoryDAL1.Update(estudianteAModificar);
                    return(RepositoryDAL1.Create <Tecnologia_x_publicacionDAO>(listaTecnologiasPublicacion));
                }
            }
            return(false);
        }
        public bool AddComentario(Comentario comentario)
        {
            PublicacionDAO publicacionDeComentario = RepositoryDAL1.Read <PublicacionDAO>(x => x.id == comentario.id_publicacion).FirstOrDefault();
            bool           puedeComentar           = true;

            if (publicacionDeComentario.isTutoria)
            {
                TutoriaDAO tutoria = publicacionDeComentario.Tutorias.FirstOrDefault();
                List <RegistroTutoriaDAO> registroTutoria        = tutoria.RegistroTutorias.ToList();
                IEnumerable <string>      estudiantesRegistrados = registroTutoria.Select(x => x.id_estudiante);
                puedeComentar = estudiantesRegistrados.Contains(comentario.Id_Autor);
            }
            ComentarioDAO nuevoComentario = new ComentarioDAO
            {
                contenido      = comentario.Contenido,
                fecha_creacion = DateTime.Now,
                id_estudiante  = comentario.Id_Autor,
                id_publicacion = comentario.id_publicacion,
                activo         = true
            };

            return(RepositoryDAL1.Create(nuevoComentario));
        }
        public IEnumerable <Publicacion> GetPublicaciones(string userid, int pag)
        {
            List <Estudiante_sigue_EstudianteDAO> listSeguidos = RepositoryDAL1.Read <Estudiante_sigue_EstudianteDAO>(x => x.id_estudianteSeguidor.Equals(userid));

            listSeguidos.Add(new Estudiante_sigue_EstudianteDAO {
                id_estudianteSeguido = userid
            });
            IEnumerable <string>  listIdSeguidos             = listSeguidos.Select(y => y.id_estudianteSeguido);
            List <PublicacionDAO> listaPublicacionesVisibles = RepositoryDAL1.Read <PublicacionDAO, DateTime>(x => listIdSeguidos.Contains(x.id_estudiante) && x.activo, x => x.fecha_publicacion);
            List <PublicacionDAO> veintePublicaciones        = listaPublicacionesVisibles.Skip(20 * (pag - 1)).Take(20).ToList();

            if (veintePublicaciones.Count() == 0)
            {
                return(new List <Publicacion>());
            }
            IEnumerable <int>                  listaIdPublicaciones         = veintePublicaciones.Select(x => x.id);
            List <TutoriaDAO>                  listaTutorias                = RepositoryDAL1.Read <TutoriaDAO>(x => listaIdPublicaciones.Contains(x.id_publicacion));
            IEnumerable <int>                  listaIDTutorias              = listaTutorias.Select(x => x.id);
            List <RegistroTutoriaDAO>          listRegistros                = RepositoryDAL1.Read <RegistroTutoriaDAO>(x => listaIDTutorias.Contains(x.id_tutoria));
            List <Tecnologia_x_publicacionDAO> listaTecnologiasxPublicacion = RepositoryDAL1.Read <Tecnologia_x_publicacionDAO>(x => listaIdPublicaciones.Contains(x.id_publicacion));
            IEnumerable <int>                  listaIdTecnologias           = listaTecnologiasxPublicacion.Select(x => x.id_tecnologia);
            List <TecnologiaDAO>               listaTecnologias             = RepositoryDAL1.Read <TecnologiaDAO>(x => listaIdTecnologias.Contains(x.id));
            List <ContenidoDAO>                listaContenidos              = RepositoryDAL1.Read <ContenidoDAO>(x => listaIdPublicaciones.Contains(x.id_publicacion));
            IEnumerable <int>                  listaIdDocumentos            = listaContenidos.Where(x => x.id_documento != null).Select(x => (int)x.id_documento);
            List <DocumentoDAO>                listaDocumentos              = RepositoryDAL1.Read <DocumentoDAO>(x => listaIdDocumentos.Contains(x.id));
            List <ComentarioDAO>               comentarios             = RepositoryDAL1.Read <ComentarioDAO>(x => listaIdPublicaciones.Contains(x.id_publicacion));
            List <EvaluacionDAO>               evaluaciones            = RepositoryDAL1.Read <EvaluacionDAO>(x => listaIdPublicaciones.Contains(x.id_publicacion));
            IEnumerable <string>               estudiantesIdPublicando = veintePublicaciones.Select(x => x.id_estudiante);
            List <UsuarioDAO>                  listaUsuarios           = RepositoryDAL1.Read <UsuarioDAO>(x => estudiantesIdPublicando.Contains(x.id));


            List <Publicacion> listaAEnviar = new List <Publicacion>();

            foreach (PublicacionDAO publicacion in listaPublicacionesVisibles)
            {
                if (publicacion.isTutoria)
                {
                    Tutoria publicacionAAgregar = new Tutoria();
                    AddDatosPublicacion(publicacion, comentarios, evaluaciones, listaUsuarios, listaTecnologiasxPublicacion, listaTecnologias, userid, ref publicacionAAgregar);
                    TutoriaDAO tutoria = listaTutorias.Where(x => x.id_publicacion == publicacion.id).FirstOrDefault();
                    publicacionAAgregar.Costo = tutoria.costo;
                    IEnumerable <string> listaIdEstudiantesRegistro = listRegistros.Where(x => x.id_tutoria == tutoria.id).Select(x => x.id_estudiante);
                    publicacionAAgregar.EstoyRegistrado = listaIdEstudiantesRegistro.Contains(userid) ? true : false;
                    publicacionAAgregar.FechaTutoria    = tutoria.fecha_tutoria;
                    publicacionAAgregar.Lugar           = tutoria.lugar;
                    listaAEnviar.Add(publicacionAAgregar);
                }
                else
                {
                    Contenido publicacionAAgregar = new Contenido();
                    AddDatosPublicacion(publicacion, comentarios, evaluaciones, listaUsuarios, listaTecnologiasxPublicacion, listaTecnologias, userid, ref publicacionAAgregar);
                    ContenidoDAO contenido = listaContenidos.Where(x => x.id_publicacion == publicacion.id).FirstOrDefault();
                    DocumentoDAO documento = listaDocumentos.Where(x => x.id == contenido.id_documento).FirstOrDefault();
                    publicacionAAgregar.Documento = documento == null ? "" : documento.contenido;
                    publicacionAAgregar.Link      = contenido.enlace_extra;
                    publicacionAAgregar.Video     = contenido.enlace_video;
                    listaAEnviar.Add(publicacionAAgregar);
                }
            }
            return(listaAEnviar);
        }
        public bool AddOrModifyEvaluacion(Evaluacion evaluacion)
        {
            PublicacionDAO        publicacionAEvaluar     = RepositoryDAL1.Read <PublicacionDAO>(x => x.id == evaluacion.id_publicacion).FirstOrDefault();
            EstudianteDAO         estudianteEvaluado      = RepositoryDAL1.Read <EstudianteDAO>(x => x.id_usuario.Equals(publicacionAEvaluar.id_estudiante)).FirstOrDefault();
            List <PublicacionDAO> publicacionesDelUsuario = RepositoryDAL1.Read <PublicacionDAO>(x => x.id_estudiante.Equals(estudianteEvaluado.id_usuario));
            int           totalEvaluacionesNegativas      = publicacionesDelUsuario.Select(x => x.evaluaciones_negativas).Sum();
            int           totalEvaluacionesPositivas      = publicacionesDelUsuario.Select(x => x.evaluaciones_positivas).Sum();
            int           reputacion;
            double        porcentaje0a1;
            EvaluacionDAO evaluacionExistente = RepositoryDAL1.Read <EvaluacionDAO>(x =>
                                                                                    x.id_estudiante.Equals(evaluacion.Id_estudiante) &&
                                                                                    x.id_publicacion == evaluacion.id_publicacion)
                                                .FirstOrDefault();

            if (evaluacion.Tipo_evaluacion.Equals("null") && evaluacionExistente != null)
            {
                if ((bool)evaluacionExistente.positiva)
                {
                    publicacionAEvaluar.evaluaciones_positivas--;
                    totalEvaluacionesPositivas--;
                }
                else
                {
                    publicacionAEvaluar.evaluaciones_negativas--;
                    totalEvaluacionesNegativas--;
                }
                if ((totalEvaluacionesPositivas + totalEvaluacionesNegativas) == 0)
                {
                    reputacion = 0;
                }
                else
                {
                    porcentaje0a1 = ((double)totalEvaluacionesPositivas / ((double)totalEvaluacionesPositivas + (double)totalEvaluacionesNegativas));
                    reputacion    = (int)((porcentaje0a1) * 100);
                }
                estudianteEvaluado.reputacion = reputacion;
                RepositoryDAL1.Update(estudianteEvaluado);
                RepositoryDAL1.Update(publicacionAEvaluar);
                return(RepositoryDAL1.Delete(evaluacionExistente));
            }
            if (publicacionAEvaluar.isTutoria)
            {
                EstudianteDAO     estudianteQueEvalua        = RepositoryDAL1.Read <EstudianteDAO>(x => x.id_usuario.Equals(evaluacion.Id_estudiante)).FirstOrDefault();
                TutoriaDAO        tutoriaEvaluada            = publicacionAEvaluar.Tutorias.Where(x => x.id_publicacion == evaluacion.id_publicacion).FirstOrDefault();
                IEnumerable <int> listaIdTutoriasRegistradas = estudianteQueEvalua.RegistroTutorias.Select(x => x.id_tutoria);
                if (!listaIdTutoriasRegistradas.Contains(tutoriaEvaluada.id) || tutoriaEvaluada.fecha_tutoria > DateTime.Now)
                {
                    return(false); //no se puede evaluar porque no está registrado o la tutoría no ha terminado
                }
            }
            EvaluacionDAO evaluacionAAgregar = new EvaluacionDAO
            {
                id_publicacion = evaluacion.id_publicacion,
                positiva       = evaluacion.Tipo_evaluacion.Equals("pos") ? true : false,
                id_estudiante  = evaluacion.Id_estudiante
            };

            if (evaluacion.Tipo_evaluacion.Equals("pos") && evaluacionExistente != null)
            {
                if (!(bool)evaluacionExistente.positiva) //es negativa
                {
                    publicacionAEvaluar.evaluaciones_positivas++;
                    totalEvaluacionesPositivas++;
                    publicacionAEvaluar.evaluaciones_negativas--;
                    totalEvaluacionesNegativas--;
                }
                else
                {
                    return(true);
                }
                RepositoryDAL1.Delete(evaluacionExistente);
            }
            if (evaluacion.Tipo_evaluacion.Equals("pos") && evaluacionExistente == null)
            {
                publicacionAEvaluar.evaluaciones_positivas++;
                totalEvaluacionesPositivas++;
            }
            if (evaluacion.Tipo_evaluacion.Equals("neg") && evaluacionExistente != null)
            {
                if ((bool)evaluacionExistente.positiva) //es negativa
                {
                    publicacionAEvaluar.evaluaciones_positivas--;
                    totalEvaluacionesPositivas--;
                    publicacionAEvaluar.evaluaciones_negativas++;
                    totalEvaluacionesNegativas++;
                }
                else
                {
                    return(true);
                }
                RepositoryDAL1.Delete(evaluacionExistente);
            }
            if (evaluacion.Tipo_evaluacion.Equals("neg") && evaluacionExistente == null)
            {
                publicacionAEvaluar.evaluaciones_negativas++;
                totalEvaluacionesNegativas++;
            }
            porcentaje0a1 = ((double)totalEvaluacionesPositivas / ((double)totalEvaluacionesPositivas + (double)totalEvaluacionesNegativas));
            reputacion    = (int)((porcentaje0a1) * 100);
            estudianteEvaluado.reputacion = reputacion;
            RepositoryDAL1.Update(estudianteEvaluado);
            RepositoryDAL1.Update(publicacionAEvaluar);
            return(RepositoryDAL1.Create(evaluacionAAgregar));
        }