// GET: Actividad/Create


        // POST: Actividad/Create


        // GET: Actividad/Edit/5
        public ActionResult Edit(int?id)
        {
            ViewBag.Profesor      = db.PROFESOR.Where(e => e.ESTADO == true);
            ViewBag.ActividadTipo = db.ACTIVIDAD_TIPO;
            ViewBag.Locacion      = db.LOCACION.Where(e => e.ID_TIPO_ACTIVIDAD == 3);

            var       actividadVM = new ActividadVM();
            var       actividad   = db.ACTIVIDAD.Find(id);
            HorarioVM horarioVM;

            if (actividad != null)
            {
                actividadVM.ESTADO            = actividad.ESTADO;
                actividadVM.FECHA_FIN         = actividad.FECHA_FIN;
                actividadVM.FECHA_INICIO      = actividad.FECHA_INICIO;
                actividadVM.ID_ACTIVIDAD      = actividad.ID_ACTIVIDAD;
                actividadVM.ID_PROFESOR       = actividad.ID_PROFESOR;
                actividadVM.ID_ACTIVIDAD_TIPO = actividad.ID_ACTIVIDAD_TIPO;
                actividadVM.descripcion       = actividad.descripcion;
                foreach (var horario in db.HORARIO.Where(e => e.ID_ACTIVIDAD == id))
                {
                    horarioVM = new HorarioVM();

                    horarioVM.DIA          = Enum.GetName(typeof(Enumeradores.DIAS), horario.DIA);
                    horarioVM.HORA_INICIO  = horario.HORA_INICIO;
                    horarioVM.HORA_FIN     = horario.HORA_FIN;
                    horarioVM.ID_ACTIVIDAD = horario.ID_ACTIVIDAD;
                    horarioVM.ID_HORARIO   = horario.ID_HORARIO;
                    horarioVM.ID_LOCACION  = horario.ID_LOCACION;
                    actividadVM.lHorario.Add(horarioVM);
                }
            }
            return(View(actividadVM));
        }
        public ActionResult Index()
        {
            var list = db.ACTIVIDAD.OrderBy(e => e.descripcion);

            var listActividadVM = new List <ActividadVM>();

            foreach (var item in list)
            {
                var actividadVM = new ActividadVM();
                actividadVM.ID_ACTIVIDAD      = item.ID_ACTIVIDAD;
                actividadVM.profesor          = item.PROFESOR.APELLIDO;
                actividadVM.ID_ACTIVIDAD_TIPO = item.ID_ACTIVIDAD_TIPO;
                actividadVM.FECHA_INICIO      = item.FECHA_INICIO;
                actividadVM.FECHA_FIN         = item.FECHA_FIN;
                actividadVM.ESTADO            = item.ESTADO;
                actividadVM.descripcion       = item.descripcion;
                actividadVM.cantInscripto     = db.INSCRIPCION_SOCIO.Where(e => e.ID_ACTIVIDAD == item.ID_ACTIVIDAD && e.ESTADO == true).Count();
                listActividadVM.Add(actividadVM);
            }

            return(View(listActividadVM.OrderBy(e => e.descripcion)));
        }
        public ActionResult Edit(ActividadVM model)
        {
            if (ModelState.IsValid)
            {
                var actividad = db.ACTIVIDAD.Find(model.ID_ACTIVIDAD);
                if (actividad == null)
                {
                    actividad = new ACTIVIDAD();
                    db.ACTIVIDAD.Add(actividad);
                }
                actividad.ESTADO            = model.ESTADO;
                actividad.FECHA_FIN         = model.FECHA_FIN;
                actividad.FECHA_INICIO      = model.FECHA_INICIO;
                actividad.ID_PROFESOR       = model.ID_PROFESOR;
                actividad.ID_ACTIVIDAD_TIPO = model.ID_ACTIVIDAD_TIPO;
                actividad.descripcion       = model.descripcion;


                db.SaveChanges();
                return(RedirectToAction("Index"));
            }
            return(View(model));
        }
        public JsonResult AddHorario(ActividadVM actividadVM)
        {
            var result = false;

            try
            {
                var horario = db.HORARIO.Find(actividadVM.horario.ID_HORARIO);
                if (horario == null)
                {
                    horario = new HORARIO();
                    db.HORARIO.Add(horario);
                }
                horario.ID_ACTIVIDAD = actividadVM.ID_ACTIVIDAD;
                horario.ID_LOCACION  = actividadVM.horario.ID_LOCACION;
                horario.HORA_INICIO  = actividadVM.horario.HORA_INICIO;
                horario.HORA_FIN     = actividadVM.horario.HORA_FIN;
                horario.DIA          = (short)(Enumeradores.DIAS)Enum.Parse(typeof(Enumeradores.DIAS), actividadVM.horario.DIA, true).GetHashCode();

                if (horario.HORA_INICIO > horario.HORA_FIN)
                {
                    return(Json(result, JsonRequestBehavior.AllowGet));
                }
                //si el horario esta disponible en esa locacion
                //profesor disponible en ese horario



                //// overlaps de fechas
                var query = db.HORARIO.Where(e => (DbFunctions.CreateDateTime(e.ACTIVIDAD.FECHA_INICIO.Year, e.ACTIVIDAD.FECHA_INICIO.Month, e.ACTIVIDAD.FECHA_INICIO.Day, 0, 0, 0)
                                                   <= DbFunctions.CreateDateTime(actividadVM.FECHA_FIN.Year, actividadVM.FECHA_FIN.Month, actividadVM.FECHA_FIN.Day, 0, 0, 0)) &&
                                             (DbFunctions.CreateDateTime(actividadVM.FECHA_INICIO.Year, actividadVM.FECHA_INICIO.Month, actividadVM.FECHA_INICIO.Day, 0, 0, 0)
                                              <= DbFunctions.CreateDateTime(e.ACTIVIDAD.FECHA_FIN.Year, e.ACTIVIDAD.FECHA_FIN.Month, e.ACTIVIDAD.FECHA_FIN.Day, 0, 0, 0)) && e.ACTIVIDAD.ESTADO == true);

                var t = query.Count();
                //// overlaps de horarios
                if (query.Count() > 0)
                {
                    query = query.Where(e => (DbFunctions.CreateTime(e.HORA_INICIO.Hour, e.HORA_INICIO.Minute, e.HORA_INICIO.Second)
                                              < DbFunctions.CreateTime(horario.HORA_FIN.Hour, horario.HORA_FIN.Minute, horario.HORA_FIN.Second)) &&
                                        (DbFunctions.CreateTime(horario.HORA_INICIO.Hour, horario.HORA_INICIO.Minute, horario.HORA_INICIO.Second)
                                         < DbFunctions.CreateTime(e.HORA_FIN.Hour, e.HORA_FIN.Minute, e.HORA_FIN.Second)));
                }
                t = query.Count();

                // overlops de dia
                if (query.Count() > 0)
                {
                    query = query.Where(e => (horario.DIA == e.DIA));
                }

                t = query.Count();
                //a partir de aca query tiene todos los horarios que se crusan en fecha  hora y dia
                // overlaps de profesor

                query = query.Where(e => (e.ACTIVIDAD.ID_PROFESOR == actividadVM.ID_PROFESOR) || (e.ID_LOCACION == horario.ID_LOCACION));

                t = query.Count();



                if (t > 0)
                {
                    return(Json(result, JsonRequestBehavior.AllowGet));
                }

                db.SaveChanges();
                result = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(Json(result, JsonRequestBehavior.AllowGet));
        }