//
        // GET: /Requisito/Delete/5
        public ActionResult Delete(int idPadre, int idHijo)
        {
            IRepositorio<Requisito> myRepoRequisito = new RequisitoRepositorio();
            IList<Requisito> todosRequisitos = myRepoRequisito.GetAll();
            Requisito requisitoBuscado = null;

            foreach (var requisito in todosRequisitos)
            {
                if (requisito.IdMateriaPadre == idPadre && requisito.IdMateriaHijo == idHijo)
                {
                    requisitoBuscado = requisito;
                }
            }

            if(ModelState.IsValid)
            {
                String resultado = myRepoRequisito.Delete(requisitoBuscado);

                if (resultado.Equals("true"))
                    return RedirectToAction("Index");
            }
            return RedirectToAction("Index");
        }
        public ActionResult Create(Requisito requisito)
        {
            IRepositorio<Materium> repositorioMateria = new MateriumRepositorio();
            IList<Materium> listaMaterias = repositorioMateria.GetAll();

            foreach (var materia in listaMaterias)
            {
                if (materia.Nombre == requisito.MateriaHijo.Descripcion)
                    requisito.IdMateriaHijo = materia.IdMateria;
                if (materia.Nombre == requisito.MateriaPadre.Nombre)
                    requisito.IdMateriaPadre = materia.IdMateria;
            }

            if(ModelState.IsValid)
            {
                IRepositorio<Requisito> myRepoRequisito = new RequisitoRepositorio();
                String resultado = myRepoRequisito.Save(requisito);

                if (resultado.Equals("true"))
                    return RedirectToAction("Index");
            }
            return View(requisito);
        }
        //
        // GET: /Requisito/Edit/5
        public ActionResult Edit(int idPadre, int idHijo)
        {
            IRepositorio<Requisito> myRepoRequisito = new RequisitoRepositorio();
            IList<Requisito> todosRequisitos = myRepoRequisito.GetAll();
            Requisito requisitoBuscado = null;

            IRepositorio<Materium> repositorioMateria = new MateriumRepositorio();
            foreach (var requisito in todosRequisitos)
            {
                if (requisito.IdMateriaPadre == idPadre && requisito.IdMateriaHijo == idHijo)
                {
                    requisitoBuscado = requisito;
                    requisitoBuscado.MateriaHijo = repositorioMateria.GetById(requisito.IdMateriaHijo);
                    requisitoBuscado.MateriaPadre = repositorioMateria.GetById(requisito.IdMateriaPadre);
                }
            }
            return View(requisitoBuscado);
        }
 //
 // GET: /Requisito/Details/5
 public ActionResult Details(int id)
 {
     IRepositorio<Requisito> myRepoRequisito = new RequisitoRepositorio();
     return View(myRepoRequisito.GetById(id));
 }
 //
 // GET: /Requisito/
 public ActionResult Index()
 {
     IRepositorio<Materium> repositorioMateria = new MateriumRepositorio();
     IRepositorio<Requisito> myRepoRequisito = new RequisitoRepositorio();
     IList<Requisito> listaRequisitos = myRepoRequisito.GetAll();
     foreach (var requisito in listaRequisitos)
     {
         requisito.MateriaHijo = repositorioMateria.GetById(requisito.IdMateriaHijo);
         requisito.MateriaPadre = repositorioMateria.GetById(requisito.IdMateriaPadre);
     }
     return View(listaRequisitos);
 }
        private void HorasPersonales(IEnumerable<int?> misMaterias, Alumno alumno)
        {
            var miEdad = (int)((_fechaActual - alumno.FechaNac).Days / 365.25);

            IRepositorio<DatosSociales> repositorioDatosSociales = new DatosSocialesRepositorio();
            var misDatosSociales =
                repositorioDatosSociales.GetByUniqueAtribute(alumno.Cedula.ToString());

            IRepositorio<PromedioFactor> repositorioPromedioFactor = new PromedioFactorRepositorio();
            var promedioFactor = repositorioPromedioFactor.GetAll();

            IRepositorio<Materium> repositorioMaterium = new MateriumRepositorio();
            // Se obtienen las horas base y se customiza segun los parametros del estudiante.
            foreach (int idMateria in misMaterias)
            {
                double horasBase = repositorioMaterium.GetById(idMateria).HorasBase;

                double promHistorico = 0;
                decimal nota = 0;
                int cantPersonalizacion = 0;

                // Personaliza segun la edad
                var fEdad = (from factor in promedioFactor
                             where factor.Factor.CompareTo("Edad") == 0 &&
                                   factor.Clasificacion.CompareTo(miEdad.ToString()) == 0 &&
                                   factor.IdMateria == idMateria
                             select factor);
                if (fEdad.Count() > 0)
                {
                    cantPersonalizacion++;
                    nota = fEdad.First().Promedio;
                    promHistorico = promHistorico + (double)nota;
                }

                //Personaliza segun Trabajo
                cantPersonalizacion++;
                if (misDatosSociales.Trabaja.CompareTo("Si") == 0)
                {
                    nota = (from factor in promedioFactor
                            where factor.Factor.CompareTo("Trabajo") == 0 &&
                                  factor.Clasificacion.CompareTo(misDatosSociales.RelacionTrabCarr) == 0 &&
                                  factor.IdMateria == idMateria
                            select factor.Promedio).First();
                }
                else
                {
                    nota = (from factor in promedioFactor
                            where factor.Factor.CompareTo("Trabajo") == 0 &&
                                  factor.Clasificacion.CompareTo("No Trabaja") == 0 &&
                                  factor.IdMateria == idMateria
                            select factor.Promedio).First();
                }
                promHistorico = promHistorico + Convert.ToDouble(nota);

                //Personaliza segun la materia
                cantPersonalizacion++;
                nota = (from factor in promedioFactor
                        where factor.Factor.CompareTo("Promedio") == 0 &&
                              factor.IdMateria == idMateria
                        select factor.Promedio).First();
                promHistorico = promHistorico + Convert.ToDouble(nota);

                //Personaliza segun el record de las materias que prelan esta materia
                IRepositorio<Requisito> repositorioRequisito = new RequisitoRepositorio();
                var misRequisitos = (from r in repositorioRequisito.GetAll()
                                     where r.IdMateriaHijo == idMateria
                                     select r.IdMateriaPadre).ToList();

                var prom = 0.0;
                if (misRequisitos.Count > 0)
                {
                    IRepositorio<SlRecordAcademico> repositorioSlRecord = new SlRecordAcademicoRepositorio();
                    IRepositorio<SlSeccion> repositorioSlSeccion = new SlSeccionRepositorio();
                    IRepositorio<SlMaterium> repositorioSlMateria = new SlMateriumRepositorio();
                    var anioPerdiodo = Convert.ToInt32(_periodoActual.Substring(0, 4));
                    var periodo = Convert.ToInt32(_periodoActual.Substring(4));
                    if (periodo > 21)
                    {
                        periodo--;
                    }
                    else
                    {
                        anioPerdiodo--;
                    }
                    var periodoAnterior = Convert.ToInt32(anioPerdiodo.ToString() + periodo.ToString());
                    var sum = 0;
                    foreach (var requisito in misRequisitos)
                    {
                        var materia = repositorioMaterium.GetById(requisito);
                        var slMateria = repositorioSlMateria.GetAll().Where(m => m.Nombre.CompareTo(materia.Nombre) == 0).First();
                        var slSeccion = repositorioSlSeccion.GetAll().Where(s => s.IdMateria == slMateria.IdMateria &&
                                                                                 s.Periodo.CompareTo(periodoAnterior) == 0).ToList();
                        var n = (from record in repositorioSlRecord.GetAll()
                                 from seccion in slSeccion
                                 where record.Cedula == alumno.Cedula &&
                                       record.IdSeccion == seccion.IdSeccion
                                 select record.Nota);
                        if (n.Count() > 0)
                        {
                            sum++;
                            prom += Convert.ToDouble(n.First());
                        }
                    }
                    if (prom > 0.0)
                    {
                        cantPersonalizacion++;
                        promHistorico += (prom / sum);
                    }
                }

                promHistorico = promHistorico / cantPersonalizacion;

                /*
                 * Segun el promedio obtenido segun las caracteristicas
                 * personales del alumno se le aumentan o disminuyen las
                 * horas de estudio segun una regla.
                 */
                const double pendiente = -0.075;
                var factorM = (promHistorico * pendiente) + 1.75;
                var horasPersonalizadas = horasBase * factorM;

                var misHorasPersonales = new AlumnoMaterium()
                {
                    IdMateria = idMateria,
                    Cedula = alumno.Cedula,
                    HorasPersonales = horasPersonalizadas
                };

                //Segun las notas obtenidas en las evaluaciones anteriores se afecta las horas personales
                IRepositorio<ClaseEvaluacion> repositorioHorarioClase = new HorarioClaseRepositorio();
                var listCronograma = repositorioHorarioClase.GetAll().Where(alum => alum.Cedula == alumno.Cedula).ToList();

                IRepositorio<Actividad> repositorioActividad = new ActividadRepositorio();
                var listActividades = repositorioActividad.GetAll().Where(a => a.Periodo.CompareTo(_periodoActual) == 0).ToList();

                var misEvaluaciones = (from d in listCronograma
                                       from c in listActividades
                                       where c.Tipo.CompareTo("Evaluacion") == 0 &&
                                             d.IdActividad == c.IdActividad
                                       select c).ToList();

                foreach (var miEvaluacion in misEvaluaciones)
                {
                    var miNota = (from cE in listCronograma
                                  where cE.IdActividad == miEvaluacion.IdActividad
                                  select cE.Nota).First();
                    if (miNota != 0.0)
                    {
                        const int x1 = 10;
                        const int y1 = 0;
                        const int x2 = 20;
                        var y2 = (misHorasPersonales.HorasPersonales * (miEvaluacion.Ponderacion / 100.00)) * -1;
                        var pendiente1 = (y2 - y1) / (x2 - x1);
                        var factorMat = (miNota * pendiente1) - y2;
                        misHorasPersonales.HorasPersonales += factorMat;
                    }
                }

                if (prom > 0.00)
                {
                    if (prom < 4)
                    {
                        misHorasPersonales.Preferencia = 5;
                    }
                    else if (prom < 8)
                    {
                        misHorasPersonales.Preferencia = 4;
                    }
                    else if (prom < 12)
                    {
                        misHorasPersonales.Preferencia = 3;
                    }
                    else if (prom < 16)
                    {
                        misHorasPersonales.Preferencia = 2;
                    }
                    else if (prom <= 20)
                    {
                        misHorasPersonales.Preferencia = 1;
                    }
                }
                IRepositorio<AlumnoMaterium> repositorioAlumnoMateria = new AlumnoMateriumRepositorio();
                repositorioAlumnoMateria.Update(misHorasPersonales);
            }
        }