package de.rwth.idsg.brsm.domain;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Formula;
import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Set;
/**
* A BikeStation.
*/
@Entity
@Table(name = "T_BIKE_STATION")
public class BikeStation implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "name")
private String name;
@Column(name = "address_street")
private String addressStreet;
@Column(name = "address_city")
private String addressCity;
@Column(name = "address_zip")
private String addressZip;
@Column(name = "opening_hours")
private String openingHours;
@Column(name = "location_latitude")
private BigDecimal locationLatitude;
@Column(name = "location_longitude")
private BigDecimal locationLongitude;
@ManyToOne
@JoinColumn(name = "user_login")
@JsonBackReference
private User user;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "bikeStation", orphanRemoval = true)
@JsonManagedReference
private Set<Bike> bikes;
// @PreRemove
// public void onDelete() {
// for (Bike bike : getBikes()) {
// bike.setBikeStation(null);
// }
// }
@Formula("(SELECT count(*) FROM t_bike AS b WHERE b.bike_station_id = id AND b.is_rented = 'false')")
private int numberOfAvailableBikes;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
// protected BikeStation() {}
//
// public BikeStation(String name, String addressStreet, String addressCity, String addressZip, String openingHours, int numberPorts) {
// this.name = name;
// this.addressCity = addressCity;
// this.addressStreet = addressStreet;
// this.addressZip = addressZip;
// this.openingHours = openingHours;
// this.numberPorts = numberPorts;
// }
public boolean addBike(Bike bike) {
bike.setBikeStation(this);
return bikes.add(bike);
}
public boolean removeBike(Bike bike) {
return bikes.remove(bike);
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddressStreet() {
return addressStreet;
}
public void setAddressStreet(String addressStreet) {
this.addressStreet = addressStreet;
}
public String getAddressCity() {
return addressCity;
}
public void setAddressCity(String addressCity) {
this.addressCity = addressCity;
}
public String getAddressZip() {
return addressZip;
}
public void setAddressZip(String addressZip) {
this.addressZip = addressZip;
}
public String getOpeningHours() {
return openingHours;
}
public void setOpeningHours(String openingHours) {
this.openingHours = openingHours;
}
public BigDecimal getLocationLatitude() {
return locationLatitude;
}
public void setLocationLatitude(BigDecimal locationLatitude) {
this.locationLatitude = locationLatitude;
}
public BigDecimal getLocationLongitude() {
return locationLongitude;
}
public void setLocationLongitude(BigDecimal locationLongitude) {
this.locationLongitude = locationLongitude;
}
public Set<Bike> getBikes() {
return bikes;
}
public void setBikes(Set<Bike> bikes) {
this.bikes = bikes;
}
public int getNumberOfBikes() {
return bikes.size();
}
public int getNumberOfAvailableBikes() { return numberOfAvailableBikes; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BikeStation bikestation = (BikeStation) o;
if (id != bikestation.id) return false;
return true;
}
@Override
public int hashCode() {
return (int) (id ^ (id >>> 32));
}
@Override
public String toString() {
return "BikeStation{" +
"id=" + id +
", name='" + name + '\'' +
", addressStreet='" + addressStreet + '\'' +
", addressCity='" + addressCity + '\'' +
", addressZip='" + addressZip + '\'' +
", openingHours='" + openingHours + '\'' +
", longitude='" + locationLongitude + '\'' +
", latitude='" + locationLatitude +
'}';
}
}