public ActionResult Registro(RegistroViewModel model, bool? id) //el id me dice si será o no anfitrion
        {
            if (ModelState.IsValid)
            {
                int currentYear = DateTime.Now.Year;
                int nacimiento = model.Nacimiento.Year;
                int diferencia = currentYear - nacimiento;

                if (diferencia >= 18)
                {
                    string salt = null;
                    while (salt == null) // si me da null, lo llamo de nuevo
                    {
                        salt = controlUsu.GeneraID(20);
                    }
                    string hash = controlUsu.Hashea(salt, model.Password);

                    if (!controlUsu.ExisteEmail(model.Correo))//si no se repite Correo
                    {

                        //Construyo Usuario
                        if (id == null) { id = false; };
                        Usuario u = new Usuario { Id = salt, Nombre = model.Nombre, Apellido = model.Apellido, Correo = model.Correo, Hash = hash, Anfitrion = id, Nacimiento = model.Nacimiento, Saldo = 0 };
                        string mensaje = u.Nombre + ", el equipo de AirBnb le da la bienvenida. " +
                                                        " Gracias por registrarse con nosotros.";
                        Mensaje m = new Mensaje
                        {
                            Id_Destinatario = u.Id,
                            Id_Remitente = "0",//---> El 0 es el equipo
                            Fecha = DateTime.Now,
                            Mensaje1 = mensaje,
                            Leido = false,
                            Tipo = "bienvenida"

                        };
                        controlUsu.MensajeBienvenida(m);
                        controlUsu.GrabaUser(u);
                        Session["usuario"] = u;
                        Session["mensajes"] = controlUsu.GetMensajes(u.Id);

                        //lo meto en la sesion para no mantenerlo a través de vistas y controladores.
                        Session["VistaAnuncios"] = id;

                        return RedirectToAction("CompletaRegistro", "Account");
                    }
                    else
                    {
                        ViewBag.Error = "Lo sentimos, ya existe un usuario con ese correo";
                    }
                }
                else
                {
                    ViewBag.Menor = "Lo sentimos, no puedes registrarte siendo menor de edad";
                }
            }
            return View(model);
        }
 partial void DeleteMensaje(Mensaje instance);
 partial void UpdateMensaje(Mensaje instance);
 partial void InsertMensaje(Mensaje instance);
		private void detach_Mensajes(Mensaje entity)
		{
			this.SendPropertyChanging();
			entity.Usuario = null;
		}
		private void attach_Mensajes(Mensaje entity)
		{
			this.SendPropertyChanging();
			entity.Usuario = this;
		}
 public void MensajeBienvenida(Mensaje m)
 {
     OperacionesBDController.MandarMensaje(m);
 }
 private void MandaNotificacionReserva(Mensaje m)
 {
         OperacionesBDController.MandarMensaje(m);
 }
        public string Reserva(string id) //--> ID del Anuncio
        {
            if (Session["usuario"] != null)
            {
                Usuario conectado = (Usuario)Session["usuario"];
                int noches = (int)Session["noches"];
                Reserva r = new Models.Reserva { Id_Anuncio = Convert.ToInt16(id), Id_Huesped = conectado.Id, Noches = noches };
                Anuncio a = controlUsu.GetAnuncio(r);

                double total = (double)(noches * a.Precio) * 1.20;
                r.Precio = (int)total;
                string idAnfitrion = getIdAnfitrion(Convert.ToInt16(id)); //id ---> Anuncio

                if (idAnfitrion.Equals(conectado.Id))
                {
                    return ("<script>alert('Este anuncio lo has publicado tu, Capullo!');" +
                   "window.location.assign('http://localhost:17204/Inicio/Index');" +
               "</script>");
                }

                if (GrabaReserva(r))//Compruebo si puede grabar en reservas. Si ha podido--> anuncio no existía
                                    //si no ha podido es porq el anuncio ya estaba reservado por ese Usuario.
                {
                    
                    string texto = "El usuario " + conectado.Nombre + " ha hecho una reserva para su anuncio en la localidad de "
                        +a.Localidad+", durante " + r.Noches+" noches, por un total de: "+ r.Precio+"€";//+20%

                    Mensaje m = new Mensaje
                    {
                        Fecha = DateTime.Now,
                        Id_Destinatario = idAnfitrion,
                        Id_Remitente = conectado.Id,
                        Leido = false,
                        Mensaje1 = texto,
                        Id_Reserva = r.Id_Reserva,
                        Tipo= "avisoreserva"    //Tipos: bienvenida, avisoReserva, confirmacion, rechazo
                    };
                    MandaNotificacionReserva(m);
                    return ("<script>alert('Reserva realizada con éxito');" +
                        "window.location.assign('http://localhost:17204/Inicio/Index');" +
                    "</script>");

                }
                else
                {
                    return ("<script>alert('Este anuncio ya lo había reservado. Espere confirmación del Anfitrión');" +
                         "window.location.assign('http://localhost:17204/Inicio/Index');" +
                     "</script>");
                }


            }
            else
            {
                return ("<script>alert('Inicia sesión o regístrate para reservar anuncios');" +
                 "window.location.assign('http://localhost:17204/Inicio/Index');" +
             "</script>");
            }

        }
 public static void MandarMensaje(Mensaje m)
 {
     using (MiDataBaseDataContext db = new MiDataBaseDataContext())
     {
         db.Mensajes.InsertOnSubmit(m);
         db.SubmitChanges();
     }
 }
        public ActionResult AccionReserva(string destinatario, string remitente, int idReserva, int idMensaje, string accion)
        {

            Usuario anfitrion = control.GetUserById(destinatario);
            Reserva r = GetReserva(idReserva);
            Usuario huesped = control.GetUserById(remitente);

            Anuncio a = getAnuncioById(r.Id_Anuncio);
            Mensaje m = null;

            if (accion.Equals("aceptar"))
            {
                string mensaje = huesped.Nombre + ", le comunicamos que " + anfitrion.Nombre + " ha aceptado su reserva en " + a.Localidad
                              + " durante " + r.Noches + " noches, por la cuantia de " + r.Precio
                              + "€. Ya puede proceder a realizar el pago de la reserva. Disfrute de su viaje!";

                m = new Mensaje
                {
                    Id_Destinatario = huesped.Id,
                    Id_Remitente = anfitrion.Id,//---> El 0 es el equipo
                    Fecha = DateTime.Now,
                    Mensaje1 = mensaje,
                    Leido = false,
                    Tipo = "confirmacion",
                    Id_Reserva = idReserva

                };
            }
            else if (accion.Equals("rechazar"))
            {
                string mensaje = huesped.Nombre + ", lamentamos comunicarle que " + anfitrion.Nombre + " ha rechazado su reserva en " + a.Localidad
                             + " durante " + r.Noches + " noches, por la cuantia de " + r.Precio
                             + "€ :(. NO deje de reservar con nosotros.";
                m = new Mensaje
                {
                    Id_Destinatario = huesped.Id,
                    Id_Remitente = anfitrion.Id,//---> El 0 es el equipo
                    Fecha = DateTime.Now,
                    Mensaje1 = mensaje,
                    Leido = false,
                    Tipo = "rechazo",
                    Id_Reserva = idReserva

                };
                BorrarReserva(idReserva);//solo borro reserva si el anfitrión rechaza...
            }

            MandarMensaje(m);
            BorraMensajeByIdMensaje(idMensaje);

            return RedirectToAction("PerfilUsuario", "Perfil");

        }
 private void MandarMensaje(Mensaje m)
 {
     OperacionesBDController.MandarMensaje(m);
 }
        public ActionResult DescartarReserva(int id, int idReserva, string remitente, string destinatario)//remitente es el Anfitrión que me ha contestado
        {
            Usuario host = control.GetUserById(remitente);
            Usuario huesped = control.GetUserById(destinatario);
            Reserva r = GetReserva(idReserva);
            Anuncio a = getAnuncioById(r.Id_Anuncio);

            string texto = host.Nombre + ", le comunicamos que " + huesped.Nombre +
                " ha decidido cancelar el pago de la reserva de su anuncio en " + a.Localidad;

            Mensaje m = new Mensaje
            {
                Id_Destinatario = host.Id,
                Id_Remitente = huesped.Id,
                Fecha = DateTime.Now,
                Leido = false,
                Mensaje1 = texto,
                Tipo = "bienvenida" //--> por no crearme oootro tipo
            };
            MandarMensaje(m);
            BorrarReserva(idReserva);
            BorraMensajeByIdMensaje(id);

            return RedirectToAction("PerfilUsuario", "Perfil");
        }
        public void Pagar(PagoViewModel model)
        {
            //borro reserva una vez que haya pagado el Huesped.
            //guardo en tabla PagosReserva
            //Aumento saldo Anfitrion
            //mando mails de confirmacion a ambos.
            double comision = (double)model.Total * 0.2;
            int saldo = model.Total - (int)comision;
            PagosReserva pago = new PagosReserva
            {
                Id_Reserva = Convert.ToInt16(model.IdReserva),
                Id_Usuario = model.IdHuesped,
                Total = model.Total,
                Comision = (int)comision,
                NumTarjeta = model.NumTarjeta
            };

            //debería generar pdf tb!!!
            GrabaPagos(pago);
            AddSaldoToHost(model.IdAnfitrion, saldo);
            BorrarReserva(Convert.ToInt16(model.IdReserva));

            Usuario host = control.GetUserById(model.IdAnfitrion);
            Usuario huesped = control.GetUserById(model.IdHuesped);

            string texto = host.Nombre + ", le comunicamos que " + huesped.Nombre +
                " ya ha realizado el pago de la reserva de su anuncio, por un total de " +
                saldo + " euros.\nGracias por confiar en AirBnb.";

            Mensaje m = new Mensaje
            {
                Id_Destinatario = model.IdAnfitrion,
                Id_Remitente = model.IdHuesped,
                Fecha = DateTime.Now,
                Leido = false,
                Mensaje1 = texto,
                Tipo = "bienvenida" //--> por no crearme oootro tipo
            };
            MandarMensaje(m);
            BorraMensajeByIdMensaje(model.IdMensaje);


            Reserva r = (Reserva)Session["reserva"];
            Anuncio a = (Anuncio)Session["anuncio"];

            string mensajeHuesped = "<h1>Le comunicamos que su pago ya ha sido realizado.</h1>\n" +
                                    "<strong><h3>Detalles Factura</h3></strong>"+
                                    "<table>"+ 
                                    "<tr><th>Titulo</th>"+
                                    "<th>Descripcion</th>" +
                                    "<th>Localidad</th>" +
                                    "<th>Noches</th>" +
                                    "<th>Precio</th>" +
                                    "<th>Total</th>" +
                                    "<th>Anfitrion</th></tr>" +
                                    "<tr><td>"+a.Titulo+"</td>"+
                                    "<td>" + a.Descripcion + "</td>" +
                                    "<td>" + a.Localidad + "</td>" +
                                    "<td>" + r.Noches + "</td>" +
                                    "<td>" + a.Precio + "€</td>" +
                                    "<td>" + r.Precio + "€</td>" +
                                    "<td>" + host.Nombre + "</td></tr>" +
                                    "</table>";

            EmailController.ConfirmaReserva(huesped, "Factura reserva", mensajeHuesped);
            EmailController.ConfirmaReserva(host, "Confirmacion pago", texto );
            ///Y al huesped le tendria que mandar el correo con PDF;

        }