public Usuario RegistrarUsuario(Usuario u)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    if (db.persona.Where(x => x.correo == u.persona.correo).Count() != 0)
                    {
                        throw new Exception("Ya existe un usuario con ese correo");
                    }

                    usuario usu = UsuarioConverter.convert(u);
                    persona per = PersonaConverter.convert(u.persona);

                    per.contrasenia = DAL_Usuario.GetHash(per.contrasenia);

                    usu.persona = per;
                    per.usuario = usu;

                    db.persona.Add(per);
                    db.SaveChanges();

                    Usuario usuarioRet = UsuarioConverter.convert(usu);
                    Persona personaRet = PersonaConverter.convert(per);

                    usuarioRet.persona = personaRet;

                    return(usuarioRet);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Vehiculo ModificarVehiculo(Vehiculo v)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    if (v == null || db.vehiculo.Find(v.id) == null)
                    {
                        throw new Exception("No se encontro ningun vehiculo con ese ID");
                    }

                    vehiculo veh = db.vehiculo.Find(v.id);

                    veh.cant_asientos = v.cant_asientos;
                    veh.marca         = v.marca;
                    veh.modelo        = v.modelo;
                    veh.matricula     = v.matricula;

                    db.SaveChanges();
                    return(VehiculoConverter.convert(veh));
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Pasaje CancelarPasaje(int idPasaje)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    pasaje pasaje = db.pasaje.FirstOrDefault(x => x.id == idPasaje);

                    if (pasaje == null)
                    {
                        return(null);
                    }

                    Pasaje ret = PasajeConverter.convert(pasaje);

                    db.pasaje.Remove(pasaje);
                    db.SaveChanges();

                    return(ret);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public void IniciarViaje(int idViaje)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    viaje v = db.viaje.Find(idViaje);

                    if (v == null)
                    {
                        throw new Exception("No se encontro ningun viaje con ese ID");
                    }

                    if (v.finalizado == true)
                    {
                        throw new Exception("No se pudo marcar el viaje como iniciado porque ya está marcado como finalizado.");
                    }

                    v.finalizado = false;
                    db.SaveChanges();
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Linea ModificarLinea(Linea l)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    if (l == null)
                    {
                        throw new Exception("Se deve enviar el objeto que deceas modificar");
                    }

                    if (l.nombre == null)
                    {
                        throw new Exception("El nombre que se desa modificar no puede estar vacio");
                    }

                    linea LinMod = db.linea.Find(l.id);

                    if (LinMod == null)
                    {
                        throw new Exception("La linea que se desa modificar no existe");
                    }

                    LinMod.nombre = l.nombre;

                    db.SaveChanges();

                    return(LineaConverter.convert(LinMod));
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Conductor ModificarConductor(Conductor c)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    if (c == null)
                    {
                        throw new Exception("No se encontro ningun conductor con ese ID");
                    }

                    conductor con = db.conductor.Find(c.id);
                    if (con == null)
                    {
                        throw new Exception("No se encontro ningun conductor con ese ID");
                    }

                    con.vencimiento_libreta = c.vencimiento_libreta;
                    db.SaveChanges();

                    c         = ConductorConverter.convert(con);
                    c.persona = PersonaConverter.convert(con.persona);

                    return(c);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Horario RegistrarHorario(Horario h)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    horario hor = HorarioConverter.convert(h);
                    hor.conductor = db.conductor.Find(h.conductor.id);
                    hor.linea     = db.linea.Find(h.linea.id);
                    hor.vehiculo  = db.vehiculo.Find(h.vehiculo.id);

                    if (hor.conductor == null)
                    {
                        throw new Exception("No se encontro ningun conductor con ese ID");
                    }
                    if (hor.linea == null)
                    {
                        throw new Exception("No se encontro ninguna linea con ese ID");
                    }
                    if (hor.vehiculo == null)
                    {
                        throw new Exception("No se encontro ningun vehiculo con ese ID");
                    }

                    db.horario.Add(hor);
                    db.SaveChanges();

                    return(HorarioConverter.convert(hor));
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Pasaje ReservarPasaje(int idViaje, int idParadaOrigen, int idParadaDestino, int idUsuario, int?asiento = null)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    var viaje = db.viaje.FirstOrDefault(x => x.id == idViaje);

                    if (viaje == null)
                    {
                        throw new Exception("No se encontro ningun viaje con ese ID");
                    }

                    if (viaje.horario.linea.tramo.Any(t => t.parada.id == idParadaOrigen) && viaje.horario.linea.tramo.Any(t => t.parada.id == idParadaDestino))
                    {
                        int no = viaje.horario.linea.tramo.Where(t => t.parada.id == idParadaOrigen).First().numero;
                        int nd = viaje.horario.linea.tramo.Where(t => t.parada.id == idParadaDestino).First().numero;
                        if (no >= nd)
                        {
                            throw new Exception("La parada de origen es posterior a la de destino");
                        }
                    }
                    else
                    {
                        throw new Exception("Una o ambas paradas no pertenecen a la linea");
                    }

                    var paradaOri  = db.parada.FirstOrDefault(x => x.id == idParadaOrigen);
                    var paradaDest = db.parada.FirstOrDefault(x => x.id == idParadaDestino);
                    var usuario    = db.usuario.FirstOrDefault(x => x.id == idUsuario);

                    if (usuario == null)
                    {
                        throw new Exception("No se encontro ningun usuario con ese ID");
                    }

                    var pasaje = new pasaje()
                    {
                        //parada_id_destino = idParadaDestino,
                        parada_destino = paradaDest,
                        //parada_id_origen = idParadaOrigen,
                        parada_origen = paradaOri,
                        //viaje_id = idViaje,
                        viaje      = viaje,
                        usuario_id = idUsuario,
                        usuario    = usuario,
                        asiento    = asiento,
                    };
                    db.pasaje.Add(pasaje);
                    db.SaveChanges();
                    return(PasajeConverter.convert(pasaje));
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Linea RegistrarLinea(Linea l)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    // convertir linea
                    // convertir tramos y asociarlos a la linea
                    // para cada tramo obtener la parada desde la DB y asociarlo
                    // para cada tramo convertir y asociar el precio
                    linea lin = LineaConverter.convert(l);
                    foreach (var t in l.tramos)
                    {
                        tramo tra = TramoConverter.convert(t);
                        lin.tramo.Add(tra);

                        parada par = db.parada.Find(t.parada.id);
                        if (par == null)
                        {
                            throw new Exception("No se encontro ninguna parada con ese ID");
                        }
                        tra.parada = par;

                        tra.precio.Add(PrecioConverter.convert(t.precio.First()));
                    }

                    // guardo la linea, sus tramos y sus precios (las paradas no, esas ya estaban en a DB)
                    db.linea.Add(lin);
                    //foreach (var tra in lin.tramo)
                    //{
                    //    db.tramo.Add(tra);
                    //    db.precio.Add(tra.precio.First());
                    //}
                    db.SaveChanges();

                    // Hago las conversiones inversas y las asociaciones
                    l = LineaConverter.convert(lin);
                    foreach (var tra in lin.tramo)
                    {
                        Tramo t = TramoConverter.convert(tra);
                        l.tramos.Add(t);

                        t.parada = ParadaConverter.convert(tra.parada);

                        precio pre = db.precio.FirstOrDefault(x => x.linea_id == l.id && x.parada_id == t.parada.id);
                        Precio p   = PrecioConverter.convert(pre);
                        t.precio.Add(p);
                    }

                    return(l);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public void AsignarRol(int idUsuario, Rol rol, DateTime?fechaVencLibreta)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    persona per = db.usuario.Find(idUsuario).persona;

                    if (per == null)
                    {
                        throw new Exception("El ID del usuario es incorecto.");
                    }

                    if (rol.Equals(Rol.CONDUCTOR))
                    {
                        if (fechaVencLibreta == null)
                        {
                            throw new Exception("Se deve ingresar la fecha de vencimiento de la libreta.");
                        }

                        if (!db.conductor.Any(x => x.id == per.id))
                        {
                            conductor con = new conductor();
                            con.persona             = per;
                            con.vencimiento_libreta = (DateTime)fechaVencLibreta;
                            db.conductor.Add(con);
                        }
                    }
                    else if (rol.Equals(Rol.ADMIN))
                    {
                        if (!db.admin.Any(x => x.id == per.id))
                        {
                            admin adm = new admin();
                            adm.persona = per;
                            db.admin.Add(adm);
                        }
                    }
                    else if (rol.Equals(Rol.SUPERADMIN))
                    {
                        if (!db.superadmin.Any(x => x.id == per.id))
                        {
                            superadmin spm = new superadmin();
                            spm.persona = per;
                            db.superadmin.Add(spm);
                        }
                    }

                    db.SaveChanges();
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Horario ModificarHorario(Horario h)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    horario horarioModificado = db.horario.Find(h.id);

                    if (h.hora != null)
                    {
                        horarioModificado.hora = h.hora;
                    }

                    if (h.conductor != null)
                    {
                        conductor conductor = db.conductor.Find(h.conductor.id);

                        if (conductor.Equals(null))
                        {
                            throw new Exception("El conductor que se desa asociar al horario no existe");
                        }

                        horarioModificado.conductor = conductor;
                    }

                    if (h.vehiculo != null)
                    {
                        vehiculo vehiculo = db.vehiculo.Find(h.vehiculo.id);

                        if (vehiculo.Equals(null))
                        {
                            throw new Exception("El vehiculo que se desa asociar al horario no existe");
                        }

                        horarioModificado.vehiculo = vehiculo;
                    }


                    db.Entry(horarioModificado).State = EntityState.Modified;
                    db.SaveChanges();
                    return(HorarioConverter.convert(horarioModificado));
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Tramo ModificarTramo(Precio p)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    if (p == null)
                    {
                        throw new Exception("Se deve enviar el objeto que deceas modificar");
                    }

                    if (p.tramo == null)
                    {
                        throw new Exception("Se deve enviar el objeto que deceas modificar");
                    }

                    tramo TramMod = db.tramo.Where(x => x.parada_id == p.tramo.parada.id && x.linea_id == p.tramo.linea.id).FirstOrDefault();

                    if (TramMod == null)
                    {
                        throw new Exception("Se deve enviar el objeto que deceas modificar");
                    }

                    TramMod.tiempo = p.tramo.tiempo;

                    if (p.valor >= 0)
                    {
                        precio pre = new precio()
                        {
                            fecha_validez = p.fecha_validez,
                            valor         = p.valor,
                            tramo         = TramMod,
                            linea_id      = TramMod.linea_id,
                            parada_id     = TramMod.parada_id
                        };
                        db.precio.Add(pre);
                        TramMod.precio.Add(pre);
                    }
                    db.SaveChanges();

                    return(TramoConverter.convert(TramMod));
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public ICollection <Viaje> RegistrarViajes(ICollection <Viaje> vs, int idHorario)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    horario hor = db.horario.Find(idHorario);
                    if (hor == null)
                    {
                        throw new Exception("No se encontro ningun horario con ese ID");
                    }

                    ICollection <viaje> viajes          = ViajeConverter.convert(vs);
                    ICollection <viaje> viajesGuardados = new List <viaje>();

                    foreach (var via in viajes)
                    {
                        via.horario = hor;
                        db.viaje.Add(via);
                        viajesGuardados.Add(via);
                    }
                    db.SaveChanges();

                    //-------- para retornar
                    ICollection <Viaje> viajesRet = new List <Viaje>();

                    foreach (var item in viajesGuardados)
                    {
                        Viaje v = ViajeConverter.convert(item);
                        v.horario           = HorarioConverter.convert(item.horario);
                        v.horario.vehiculo  = VehiculoConverter.convert(item.horario.vehiculo);
                        v.horario.conductor = ConductorConverter.convert(item.horario.conductor);
                        v.horario.linea     = LineaConverter.convert(item.horario.linea);
                        viajesRet.Add(v);
                    }

                    return(viajesRet);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Parada RegistrarParada(Parada p)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    parada par = ParadaConverter.convert(p);

                    db.parada.Add(par);
                    db.SaveChanges();

                    return(ParadaConverter.convert(par));
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Vehiculo RegistrarVehiculo(Vehiculo v)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    vehiculo veh = VehiculoConverter.convert(v);
                    veh.latitud  = (decimal) - 34.34;
                    veh.longitud = (decimal) - 56.71;

                    db.vehiculo.Add(veh);
                    db.SaveChanges();

                    return(VehiculoConverter.convert(veh));
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public bool ValidarPasaje(int idPasaje, int idViaje, int idParada)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    pasaje p = db.pasaje.Find(idPasaje);

                    if (p == null)
                    {
                        return(false);
                    }

                    if (p.usado)
                    {
                        return(false);
                    }

                    if (!p.parada_id_origen.Equals(idParada))
                    {
                        return(false);
                    }

                    if (!p.viaje_id.Equals(idViaje))
                    {
                        return(false);
                    }

                    p.usado = true;
                    db.SaveChanges();

                    return(true);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public Parada ModificarParada(Parada p)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    if (p == null || db.parada.Find(p.id) == null)
                    {
                        throw new Exception("No se encontro ninguna parada con ese ID");
                    }

                    parada par = db.parada.Find(p.id);
                    par.nombre = p.nombre;
                    //par.latitud = p.latitud;
                    //par.longitud = p.longitud;
                    db.SaveChanges();
                    return(ParadaConverter.convert(par));
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        public ICollection <Usuario> RegistrarPasoPorParada(int idParada, int idViaje)
        {
            using (uruguay_busEntities db = new uruguay_busEntities())
            {
                try
                {
                    IDAL_Global           blg             = new DAL_Global();
                    ICollection <usuario> retSinConvertir = new List <usuario>();
                    viaje  v = db.viaje.Find(idViaje);
                    parada p = db.parada.Find(idParada);

                    if (v == null)
                    {
                        throw new Exception("No se encontro ningun viaje con ese ID");
                    }

                    if (p == null)
                    {
                        throw new Exception("No se encontro ninguna parada con ese ID");
                    }

                    vehiculo vh = v.horario.vehiculo;

                    paso_por_parada ppp = new paso_por_parada()
                    {
                        fecha_hora = DateTime.Now,
                        viaje      = v,
                        parada     = p
                    };

                    db.paso_por_parada.Add(ppp);

                    vh.latitud  = p.latitud;
                    vh.longitud = p.longitud;
                    db.SaveChanges();


                    ICollection <parada> paradasOrdenadas = ParadaConverter.convert(blg.obtenerParadasDeLinea(v.horario.linea.id));

                    parada siguienteParada = null;
                    for (int i = 0; i < paradasOrdenadas.Count; i++)
                    {
                        if (paradasOrdenadas.ElementAt(i).id == idParada && i + 1 < paradasOrdenadas.Count)
                        {
                            siguienteParada = paradasOrdenadas.ElementAt(i + 1);
                        }
                    }

                    if (siguienteParada == null)
                    {
                        return(new List <Usuario>());
                    }

                    retSinConvertir = siguienteParada.pasajes_origen
                                      .Where(x => x.usuario != null)
                                      .Select(x => x.usuario).ToList();

                    //foreach (var item in siguienteParada.pasaje1)
                    //{
                    //    retSinConvertir.Add(item.usuario);
                    //}

                    ICollection <Usuario> retConvertido = new List <Usuario>();

                    foreach (var item in retSinConvertir)
                    {
                        Usuario nuevo = UsuarioConverter.convert(item);
                        nuevo.persona = PersonaConverter.convert(item.persona);
                        retConvertido.Add(nuevo);
                    }

                    return(retConvertido);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }