package com.kritsit.casetracker.shared.domain.model;
import javafx.beans.property.Property;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.StringProperty;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.GregorianCalendar;
public class Incident implements Externalizable {
private static final long serialVersionUID = 10L;
private IntegerProperty indexIdProperty;
private StringProperty addressProperty;
private DoubleProperty longitudeProperty;
private DoubleProperty latitudeProperty;
private StringProperty regionProperty;
private ObjectProperty<LocalDate> dateProperty;
private ObjectProperty<LocalDate> followUpDateProperty;
private BooleanProperty followedUpProperty;
public Incident() {
indexIdProperty = new SimpleIntegerProperty();
addressProperty = new SimpleStringProperty();
regionProperty = new SimpleStringProperty();
dateProperty = new SimpleObjectProperty<>();
followUpDateProperty = new SimpleObjectProperty<>();
followedUpProperty = new SimpleBooleanProperty();
longitudeProperty = new SimpleDoubleProperty();
latitudeProperty = new SimpleDoubleProperty();
}
public Incident(int indexId, String address, String region, LocalDate date,
LocalDate followUpDate, boolean followedUp) {
indexIdProperty = new SimpleIntegerProperty(indexId);
addressProperty = new SimpleStringProperty(address);
regionProperty = new SimpleStringProperty(region);
dateProperty = new SimpleObjectProperty<>(date);
followUpDateProperty = new SimpleObjectProperty<>(followUpDate);
followedUpProperty = new SimpleBooleanProperty(followedUp);
longitudeProperty = new SimpleDoubleProperty();
latitudeProperty = new SimpleDoubleProperty();
}
public Incident(int indexId, double longitude, double latitude, String region,
LocalDate date, LocalDate followUpDate, boolean followedUp) {
indexIdProperty = new SimpleIntegerProperty(indexId);
longitudeProperty = new SimpleDoubleProperty(longitude);
latitudeProperty = new SimpleDoubleProperty(latitude);
regionProperty = new SimpleStringProperty(region);
dateProperty = new SimpleObjectProperty<>(date);
followUpDateProperty = new SimpleObjectProperty<>(followUpDate);
followedUpProperty = new SimpleBooleanProperty(followedUp);
addressProperty = new SimpleStringProperty();
}
public int getIndexId() {
return indexIdProperty.get();
}
public double getLatitude() {
return latitudeProperty.get();
}
public double getLongitude() {
return longitudeProperty.get();
}
public String getAddress() {
return addressProperty.get();
}
public String getRegion() {
return regionProperty.get();
}
public LocalDate getDate() {
return dateProperty.get();
}
public LocalDate getFollowUpDate() {
return followUpDateProperty.get();
}
public Property dateProperty() {
return dateProperty;
}
public boolean isFollowedUp() {
return followedUpProperty.get();
}
public void setIndexId(int indexId) {
indexIdProperty.set(indexId);
}
public void setLongitude(double longitude) {
longitudeProperty.set(longitude);
}
public void setLatitude(double latitude) {
latitudeProperty.set(latitude);
}
public void setAddress(String address) {
addressProperty.set(address);
}
public void setRegion(String region) {
regionProperty.set(region);
}
public void setDate(LocalDate date) {
dateProperty.set(date);
}
public void setFollowUpDate(LocalDate followUpDate) {
followUpDateProperty.set(followUpDate);
}
public void setFollowedUp(boolean followedUp) {
followedUpProperty.set(followedUp);
}
public static LocalDate getDefaultFollowUpDate(LocalDate date) {
return date.plusWeeks(1L);
}
@Override
public int hashCode() {
Boolean fu = Boolean.valueOf(isFollowedUp());
return ((getAddress() + getLongitude() + getLatitude() + getRegion()).hashCode() + getDate().hashCode() + getFollowUpDate().hashCode() + fu.hashCode()) / 3;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
return obj.hashCode() == hashCode();
}
@Override
public String toString() {
String result = "Incident: ";
if (getAddress() != null && getAddress().length() != 0) {
result += getAddress() + " ";
} else {
result += getLongitude() + ", ";
result += getLatitude() + " ";
}
result += "(" + getDate().toString() + ")";
return result;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(getAddress());
out.writeDouble(getLongitude());
out.writeDouble(getLatitude());
out.writeObject(getRegion());
out.writeObject(getDate());
out.writeObject(getFollowUpDate());
out.writeBoolean(isFollowedUp());
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
setAddress((String) in.readObject());
setLongitude(in.readDouble());
setLatitude(in.readDouble());
setRegion((String) in.readObject());
setDate((LocalDate) in.readObject());
setFollowUpDate((LocalDate) in.readObject());
setFollowedUp(in.readBoolean());
}
}