package hirondelle.fish.main.rating;
import java.math.BigDecimal;
import hirondelle.web4j.model.ModelCtorException;
import hirondelle.web4j.model.ModelUtil;
import hirondelle.web4j.model.Check;
import hirondelle.web4j.model.Id;
import hirondelle.web4j.security.SafeText;
import hirondelle.web4j.model.Validator;
import static hirondelle.web4j.util.Consts.FAILS;
public final class Rating {
public Rating (
Id aId, SafeText aName, Integer aFishRating, Integer aChipsRating,
Integer aPriceRating, Integer aLocationRating, Integer aServiceRating,
Integer aBeerRating, BigDecimal aOverallRating
) throws ModelCtorException {
fId = aId;
fName = aName;
fFishRating = aFishRating;
fChipsRating = aChipsRating;
fPriceRating = aPriceRating;
fLocationRating =aLocationRating;
fServiceRating = aServiceRating;
fBeerRating = aBeerRating;
fOverallRating = aOverallRating;
validateState();
}
public Id getId(){ return fId; }
public SafeText getRestaurant(){ return fName; }
public Integer getFishRating(){ return fFishRating; }
public Integer getChipsRating(){ return fChipsRating; }
public Integer getPriceRating(){ return fPriceRating; }
public Integer getLocationRating(){ return fLocationRating; }
public Integer getServiceRating(){ return fServiceRating; }
public Integer getBeerRating(){ return fBeerRating; }
public BigDecimal getOverallRating(){ return fOverallRating; }
@Override public String toString() {
return ModelUtil.toStringFor(this);
}
@Override public boolean equals( Object aThat ) {
Boolean result = ModelUtil.quickEquals(this, aThat);
if ( result == null ){
Rating that = (Rating) aThat;
result = ModelUtil.equalsFor(this.getSignificantFields(), that.getSignificantFields());
}
return result;
}
@Override public int hashCode() {
if ( fHashCode == 0 ) {
fHashCode = ModelUtil.hashCodeFor(getSignificantFields());
}
return fHashCode;
}
private final Id fId;
private final SafeText fName;
private final Integer fFishRating;
private final Integer fChipsRating;
private final Integer fPriceRating;
private final Integer fLocationRating;
private final Integer fServiceRating;
private final Integer fBeerRating;
private final BigDecimal fOverallRating;
private int fHashCode;
private void validateState() throws ModelCtorException {
ModelCtorException ex = new ModelCtorException();
Validator[] ratingsChecks = {Check.min(0), Check.max(10)};
if ( FAILS == Check.required(fId, Check.range(1,50)) ) {
ex.add("Id is required, 1..50 chars.");
}
if ( FAILS == Check.optional(fName, Check.range(2,50)) ) {
ex.add("Name is optional, 2..50 chars.");
}
if ( FAILS == Check.required(fFishRating, ratingsChecks) ) {
ex.add("Fish Rating is required, 0..10.");
}
if ( FAILS == Check.required(fChipsRating, ratingsChecks) ) {
ex.add("Chips Rating is required, 0..10.");
}
if ( FAILS == Check.required(fPriceRating, ratingsChecks) ) {
ex.add("Price Rating is required, 0..10.");
}
if ( FAILS == Check.required(fLocationRating, ratingsChecks) ) {
ex.add("Location Rating is required, 0..10.");
}
if ( FAILS == Check.required(fServiceRating, ratingsChecks) ) {
ex.add("Service Rating is required, 0..10.");
}
if ( FAILS == Check.required(fBeerRating, ratingsChecks) ) {
ex.add("Beer Rating is required, 0..10.");
}
BigDecimal ZERO = new BigDecimal("0.00");
BigDecimal TEN = new BigDecimal("10.00");
if ( FAILS == Check.optional(fOverallRating, Check.range(ZERO, TEN)) ) {
ex.add("Overall Rating is optional, 0.00..10.00.");
}
if ( ! ex.isEmpty() ) throw ex;
}
private Object[] getSignificantFields(){
return new Object[] {
fName, fFishRating,fChipsRating, fPriceRating,
fLocationRating, fServiceRating, fBeerRating
};
}
}