public async Task<ActionResult> Nuevo([Bind(Include = "id,nombre,linea,ano_actual,acceso_coche,distancia_pie,o_acceso_coche,o_distancia_pie,lat,lon,tipo_cimentacion,referencia_catastral,observaciones,seguridad,suelo,tipo_foemp,num_cir,num_empalmes,a_mantenimiento,t_coordenadas,a_o_s,subCircuitos")] ApoyoForm apoyo)
        {
            if (ModelState.IsValid)
            {
                apoyo.id = Guid.NewGuid().ToString();
                if (apoyo.t_coordenadas == 1)
                {
                    Apoyo nuevo = new Apoyo();
                    Conexion db = new Conexion();
                    nuevo.id = apoyo.id;
                    nuevo.nombre = apoyo.nombre;
                    nuevo.linea = apoyo.linea;
                    nuevo.ano_construccion = int.Parse(apoyo.ano_actual);
                    nuevo.acceso_coche = apoyo.acceso_coche;
                    nuevo.o_acceso_coche = apoyo.o_acceso_coche;                   
                    nuevo.distancia_pie = apoyo.distancia_pie;
                    nuevo.o_distancia_pie = apoyo.o_distancia_pie;
                    nuevo.tipo_cimentacion = apoyo.tipo_cimentacion;
                    nuevo.referencia_catastral = apoyo.referencia_catastral;
                    nuevo.seguridad = apoyo.seguridad;
                    nuevo.num_empalmes = apoyo.num_empalmes;
                    nuevo.suelo = apoyo.suelo;
                    nuevo.observaciones = apoyo.observaciones;
                    nuevo.tipo_foemp = apoyo.tipo_foemp;
                    nuevo.a_mantenimiento = apoyo.a_mantenimiento;
                    nuevo.num_cir = apoyo.num_cir;
                    nuevo.ubicacion = System.Data.Entity.Spatial.DbGeometry.PointFromText(string.Format("POINT({0} {1})", apoyo.lat, apoyo.lon), 4326).AsBinary();

                    if (apoyo.a_o_s == "0")
                    {
                        nuevo.amarre = true;
                        nuevo.sustentacion = false;
                    }
                    else
                    {
                        nuevo.amarre = false;
                        nuevo.sustentacion = true;
                    }

                    db.Apoyo.Add(nuevo);
                    await db.SaveChangesAsync();
                }
                else 
                {                    
                    bool nuevoA = new Apoyo().Insertar_UTM(apoyo);                
                }
                Historial nuevoH = new Historial("Creó", User.Identity.GetUserId(), "Apoyo", apoyo.id, apoyo.nombre, Request.UserHostAddress);
                TempData["Mensaje"] = "Apoyo creado correctamente.";
                return RedirectToAction("Editar", "Apoyo", new {id= apoyo.id });
            }

            TempData["Mensaje"] = "Error al crear la Apoyo.";
            return View(apoyo);
        }
        public async Task<ActionResult> Programar([Bind(Include = "selectOperacion,selectLineas")] OperacionesProgramadas programar)
        {
            Operaciones operacion = db.Operaciones.First(m=>m.id == programar.selectOperacion);
            List<string> ids = new Apoyo().ApoyosAnomalia(operacion.anomalia, operacion.grado_anomalia);

            List<ApoyoLista> listaApoyos = db.ApoyoLista.Where(m => ids.Contains(m.id)).OrderBy(m=>m.nombre).ToList();

            if(programar.selectLineas != null && programar.selectLineas.Count >0){
                listaApoyos = listaApoyos.Where(m => programar.selectLineas.Contains(m.linea)).ToList();            
            }
                 
            List<ApoyoLista> listTemp = new List<ApoyoLista>();
            List<ApoyosProgramados> listaApoyosProgramados = new List<ApoyosProgramados>();

            //FECHA DE MAÑANA
            DateTime uFecha = DateTime.Today.AddDays(1);

            OperacionesProgramadas nuevoOperacionesProgramadas = new OperacionesProgramadas();
            nuevoOperacionesProgramadas.idoperacion = programar.selectOperacion;
            nuevoOperacionesProgramadas.fecha = DateTime.Now;
            nuevoOperacionesProgramadas.creadopor = User.Identity.GetUserId();

            //Si hay apoyos a reparar
            if (listaApoyos.Count > 0)
            {
                //total de días de un equipo en realizar la operación
                int totalDias = listaApoyos.Count / operacion.rendimiento;

                    //Si total de días es menor o igual a 24 que es el numero de días laborables.
                if (totalDias <= 24)
                {

                    if (db.ApoyosProgramados.ToList() != null && db.ApoyosProgramados.ToList().Count > 0)
                    {
                        uFecha = db.ApoyosProgramados.OrderByDescending(m => m.end).Take(1).ToArray()[0].end;

                        uFecha = uFecha.AddDays(1);
                    }

                    List<DateTime> listaFechas = new List<DateTime>();

                    while (listaFechas.Count < totalDias)
                    {
                        //Compruebo que las fechas no sean fin de semana
                        if (uFecha.DayOfWeek != DayOfWeek.Saturday && uFecha.DayOfWeek != DayOfWeek.Sunday)
                        {
                            listaFechas.Add(uFecha);
                        }

                        //Aumento la fecha
                        uFecha = uFecha.AddDays(1);
                    }
                    int indice = 0;

                    //Recorro Lista de Fechas filtradas
                    foreach (var e in listaFechas)
                    {
                        //Apoyos por fecha
                        foreach (var f in listaApoyos.Skip(indice).Take(operacion.rendimiento))
                        {
                            ApoyosProgramados nuevoApoyo = new ApoyosProgramados();
                            nuevoApoyo.start = e;
                            nuevoApoyo.end = e;
                            nuevoApoyo.idoperacionprogramada = nuevoOperacionesProgramadas.id;
                            nuevoApoyo.idapoyo = f.id;

                            listaApoyosProgramados.Add(nuevoApoyo);
                        }

                        indice = indice + operacion.rendimiento;
                    }

                    db.OperacionesProgramadas.Add(nuevoOperacionesProgramadas);
                    await db.SaveChangesAsync();

                    db.ApoyosProgramados.AddRange(listaApoyosProgramados);
                    await db.SaveChangesAsync();

                }/*FIN IF SI ES MENOR DE 24 DIAS*/
                else { 
                
                    //24 es la cantidad de días laborables en un mes
                    int dias = operacion.tiempo_programacion * 24;

                    //Total de apoyos por días (divido la cantidad de apoyos a operar entre el numero de dias laborables en el período de tiempo solicitado)
                    decimal totalPDias1 = decimal.Divide(decimal.Parse(listaApoyos.Count.ToString()), decimal.Parse(dias.ToString()));

                    int totalPDias =  int.Parse(decimal.Ceiling(totalPDias1).ToString());

                    if (db.ApoyosProgramados.ToList() != null && db.ApoyosProgramados.ToList().Count > 0)
                    {
                        uFecha = db.ApoyosProgramados.OrderByDescending(m => m.end).Take(1).ToArray()[0].end;
                        uFecha = uFecha.AddDays(1);
                    }

                    List<DateTime> listaFechas = new List<DateTime>();

                    while (listaFechas.Count < dias)
                    {
                        //Compruebo que las fechas no sean fin de semana
                        if (uFecha.DayOfWeek != DayOfWeek.Saturday && uFecha.DayOfWeek != DayOfWeek.Sunday)
                        {
                            listaFechas.Add(uFecha);
                        }

                        //Aumento la fecha
                        uFecha = uFecha.AddDays(1);
                     }

                    int indice = 0;

                    //Recorro Lista de Fechas filtradas
                    foreach (var e in listaFechas)
                    {
                        //Apoyos por fecha
                        foreach (var f in listaApoyos.Skip(indice).Take(totalPDias))
                        {
                            ApoyosProgramados nuevoApoyo = new ApoyosProgramados();
                            nuevoApoyo.start = e;
                            nuevoApoyo.end = e;
                            nuevoApoyo.idoperacionprogramada = nuevoOperacionesProgramadas.id;
                            nuevoApoyo.idapoyo = f.id;

                            listaApoyosProgramados.Add(nuevoApoyo);
                        }

                        indice = indice + totalPDias;
                    }

                    db.OperacionesProgramadas.Add(nuevoOperacionesProgramadas);
                    await db.SaveChangesAsync();

                    db.ApoyosProgramados.AddRange(listaApoyosProgramados);
                    await db.SaveChangesAsync();
                
                }

            }/*FIN IF SI HAY APOYOS*/

            TempData["Mensaje"] = "Operación Programada correctamente.";
            return View(new OperacionesProgramadas().Nuevo());
        }
        public async Task<ActionResult> Editar(string id)
        {

            try { 
            ApoyoLista apoyo = await db.ApoyoLista.FindAsync(id);

            if (apoyo == null)
            {
                return HttpNotFound();
            }

            bool comprobar =new Apoyo().ComprobarApoyo(id, User.Identity.GetUserId());
            if (comprobar)
            {
                ApoyoForm editar = new ApoyoForm(apoyo);
                TempData["confirmacion"] = "Desea Eliminar esta Inspección?";
                TempData["confirmacionD"] = "Desea Eliminar este Documento?";
                return View(editar);
            }
            else {
                TempData["MensajeAP"] = "Prohibido el acceso a este Apoyo con tus credenciales";
                return RedirectToAction("Index","Acceso");
                //throw new HttpException(401, "Unauthorized");            
            }

            }
            catch (Exception e)
            {
                throw new HttpException(500, e.ToString());      
            }
            
        }
        public ActionResult Inspeccion(string id)
        {
            Inspecciones inspeccion = new Inspecciones().Ver(id);

            bool comprobar = new Apoyo().ComprobarApoyo(inspeccion.apoyo.id, User.Identity.GetUserId());

            if (!comprobar)
            {
                TempData["MensajeAP"] = "No tiene credenciales para realizar esta operación.";
                return RedirectToAction("Index", "Acceso");
            }

            return View(inspeccion);
        }
        public ActionResult Operaciones(string id) 
        {
            bool comprobar = new Apoyo().ComprobarApoyo(id, User.Identity.GetUserId());

            if (!comprobar)
            {
                TempData["MensajeAP"] = "No tiene credenciales para realizar esta operación.";
                return RedirectToAction("Index", "Acceso");
            }

            return View(db.ListaInspeccionesProgramadas.Where(m=>m.id == id).ToList());
        }
        // POST: Apoyo/Eliminar/5 
        public async Task<ActionResult> Eliminar(string id)
        {

            Apoyo apoyo = await db.Apoyo.FindAsync(id);
            if (apoyo == null)
            {
                return HttpNotFound();
            }

            bool comprobar = new Apoyo().ComprobarApoyo(id, User.Identity.GetUserId());

            if (!comprobar)
            {
                TempData["MensajeAP"] = "No tiene credenciales para realizar esta operación.";
                return RedirectToAction("Index", "Acceso");
            }


            db.Apoyo.Remove(apoyo);
            await db.SaveChangesAsync();
            Historial nuevo = new Historial("Eliminó", User.Identity.GetUserId(), "Apoyo", apoyo.id, apoyo.nombre, Request.UserHostAddress);
            TempData["Mensaje"] = "Apoyo eliminado correctamente.";
            bool el = new Ficheros().EliminarDirectorio(5, id);
            return RedirectToAction("Index");

        }
        public async Task<ActionResult> EliminarFichero(string id)
        {
            Apoyo_Documentos eliminar = db.Apoyo_Documentos.SingleOrDefault(m => m.id == id);
            bool comprobar = new Apoyo().ComprobarApoyo(eliminar.apoyo_id, User.Identity.GetUserId());
            if (!comprobar)
            {
                TempData["MensajeAP"] = "No tiene credenciales para realizar esta operación.";
                return RedirectToAction("Index", "Acceso");
            }

            string id_r = await new Ficheros().EliminarFicheros(id, 5);

            TempData["Mensaje"] = "Documento eliminado correctamente.";
            return RedirectToAction("Editar", "Apoyo", new { id = id_r });
        }
        public async Task<ActionResult> Ficheros(string id)
        {

            bool comprobar = new Apoyo().ComprobarApoyo(id, User.Identity.GetUserId());

            if (!comprobar)
            {
                TempData["MensajeAP"] = "No tiene credenciales para realizar esta operación.";
                return RedirectToAction("Index", "Acceso");
            }

            Ficheros nuevo = new Ficheros();
            await nuevo.SubirFicheros(Request.Files, id, "Apoyos", "Documentos", 5);

            return RedirectToAction("Editar", "Apoyo", new { id = id });
        }
        public async Task<ActionResult> Editar([Bind(Include = "id,nombre,linea,ano_actual,o_acceso_coche,o_distancia_pie,lat,lon,tipo_cimentacion,referencia_catastral,observaciones,seguridad,suelo,tipo_foemp,num_cir,num_empalmes,a_mantenimiento,t_coordenadas,a_o_s,subCircuitos")] ApoyoForm apoyo)
        {

            bool comprobar = new Apoyo().ComprobarApoyo(apoyo.id, User.Identity.GetUserId());

            if (!comprobar)
            {
                TempData["MensajeAP"] = "No tiene credenciales para realizar esta operación.";
                return RedirectToAction("Index", "Acceso");
            }

            if (ModelState.IsValid)
            {
                try {


                    ///Si el tipo de coordenadas son Geográficas
                    if (apoyo.t_coordenadas == 1)
                    {
                        bool editar = new Apoyo().U_Apoyo(apoyo);

                        if (editar)
                        {
                            Historial nuevo = new Historial("Editó", User.Identity.GetUserId(), "Apoyo", apoyo.id, apoyo.nombre, Request.UserHostAddress);
                            TempData["Mensaje"] = "Apoyo editado correctamente.";
                            return RedirectToAction("Editar", "Apoyo", new { id = apoyo.id });
                        }
                        else
                        {
                            TempData["Mensaje"] = "Error al editar la Apoyo.";
                            return RedirectToAction("Editar", "Apoyo", new { id = apoyo.id });
                        }

                    }
                    else {

                        bool editar = new Apoyo().UTM_E_Apoyo(apoyo);

                        if (editar)
                        {
                            Historial nuevo = new Historial("Editó", User.Identity.GetUserId(), "Apoyo", apoyo.id, apoyo.nombre, Request.UserHostAddress);
                            TempData["Mensaje"] = "Apoyo editado correctamente.";
                            return RedirectToAction("Editar", "Apoyo", new { id = apoyo.id });
                        }
                        else
                        {
                            TempData["Mensaje"] = "Error al editar la Apoyo.";
                            return RedirectToAction("Editar", "Apoyo", new { id = apoyo.id });
                        }
                    
                    }
                

                }catch{
                    TempData["Mensaje"] = "Error al editar la Apoyo.";
                    return RedirectToAction("Editar", "Apoyo", new { id = apoyo.id });
                }               

            }



            TempData["Mensaje"] = "Error al editar la Apoyo.";
            return RedirectToAction("Editar", "Apoyo", new { id = apoyo.id });
        }
 public JsonResult GetJsonDataApoyosGeoJson(string id)
 {
     var retorno = new Apoyo().ApoyosGeoJson();
     return Json(retorno, JsonRequestBehavior.AllowGet);
 }