@startuml
class Usuario {
  - nombre : String
  - id : int
  - password : String
  - fechaNacimiento : Date
  - foto : String
  - email : String
  - valoracion : float
  + Usuario(nombre : String, password : String, fechaNacimiento : LocalDate, foto : String, email : String)
  + {static} iniciarSesion(email : String, password : String) : int
  + {static} registrar(nombre : String, password : String, fechaNacimiento : LocalDate, foto : String, email : String) : int
  + recuperarPassword(email : String) : bool
  + modificarPerfil(nombre : String, password : String, fechaNacimiento : LocalDate, foto : String, email : String) : bool
  + eliminar(password : String) : bool
  + seguirUsuario(usuario : Usuario) : bool
  + dejarSeguirUsuario(usuario : Usuario) : bool
  + recibirValoracion(valoracion : Valoracion)
  - calcularValoracion()
  + recibirComentario(comentario : Comentario) : bool
  + crearEvento(nombre : String, ubicacion : Punto, fecha : LocalDate, etiqueta : ArrayList<String>) : bool
  + modificarEvento(evento : Evento) : bool
  + valorarEvento(destinatario : Usuario, valoracion : float)
  + valorarUsuario(destinatario : Usuario, valoracion : float)
  + toJson() : JSONObject
}
}

class Evento {
  - id : int
  - nombre : String
  - ubicacion : Punto
  - fecha : Date
  - host : Usuario
  - valoracion : float
  - etiquetas : List<String>
  - activo : bool
  + Evento(nombre : String, ubicacion : Punto, fecha : LocalDate, host : Usuario, etiquetas : List<String>)
  + modificar(nombre : String, ubicacion : Punto, fecha : LocalDate, host : Usuario, etiquetas : List<String>) : bool
  + comentar(comentario : Comentario) : bool
  + valorar(valoracion : Valoracion)) : bool
  + añadirParticipante(participante : Usuario) : bool
  + eliminarParticipante(participante : Usuario)) : bool
  + eliminar() : bool
  + añadirPublicacion(publicacion : Publicacion) : bool
  + toJson() : JSONObject
}

class Publicacion {
  - id : int
  - autor : Usuario
  - fecha : LocalDate
  - imagenes : List<String>
  - contenido : String
  + Publicacion(autor : Usuario, fecha : LocalDate, imagenes : List<String>, contenido : String)
  + eliminar() : bool
  + toJson() : JSONObject
}

class Comentario {
  - id : int
  - autor : Usuario
  - destinatario : Usuario
  - fecha : Date
  - contenido : String
  + Comentario(autor : Usuario, fecha : LocalDate, contenido : String)
  + eliminar() : bool
  + toJson() : JSONObject
}

class Valoracion {
  - autor : Usuario
  - valor : float
  + Valoracion(autor : Usuario, valor : float)
  + toJson() : JSONObject
}

class Punto {
  - x : float
  - y : float
  + Punto(x : float, y : float)
  + distanciaHasta(destino : Punto) : double
  + toString() : String
}

Usuario "0" *--> "*" Evento : eventos
Evento "1" --> "1" Usuario : host
Evento "0" *--> "*" Publicacion : publicaciones
Evento "1" *--> "*" Usuario : participantes
Evento "0" *--> "*" Comentario : comentarios
Usuario "0" *--> "*" Comentario : comentarios
Evento "0" *--> "*" Valoracion : valoraciones
Usuario "0" *--> "*" Valoracion : valoraciones
@enduml