package hirondelle.predict.pub.search;
import static hirondelle.web4j.util.Consts.FAILS;
import hirondelle.web4j.model.Check;
import hirondelle.web4j.model.ModelCtorException;
import hirondelle.web4j.model.ModelUtil;
import hirondelle.web4j.model.DateTime;
import hirondelle.web4j.security.SafeText;
import hirondelle.predict.main.prediction.Prediction;
public final class SearchCriteria {
public SearchCriteria(SafeText aSearchText, SafeText aSearchStyle, DateTime aFromDate, DateTime aToDate) throws ModelCtorException {
fSearchText = aSearchText;
fFromDate = aFromDate;
fToDate = aToDate;
fSearchStyle = SearchStyle.valueOf(aSearchStyle.getRawString());
validateState();
}
SafeText getSearchText() {
return fSearchText;
}
DateTime getFromDate(){
return fFromDate != null? fFromDate.getStartOfDay() : null;
}
DateTime getToDate(){
return fToDate!= null ? fToDate.getEndOfDay() : null;
}
SearchStyle getSearchStyle(){ return fSearchStyle; }
@Override public String toString(){
return ModelUtil.toStringFor(this);
}
@Override public boolean equals(Object aThat){
Boolean result = ModelUtil.quickEquals(this, aThat);
if ( result == null ) {
SearchCriteria that = (SearchCriteria)aThat;
result = ModelUtil.equalsFor(this.getSignificantFields(), that.getSignificantFields());
}
return result;
}
@Override public int hashCode(){
if ( fHashCode == 0 ) {
fHashCode = ModelUtil.hashCodeFor(getSignificantFields());
}
return fHashCode;
}
private SafeText fSearchText;
private DateTime fFromDate;
private DateTime fToDate;
private SearchStyle fSearchStyle;
private int fHashCode;
private Object[] getSignificantFields(){
return new Object[] {fSearchText, fFromDate, fToDate, fSearchStyle};
}
private void validateState() throws ModelCtorException {
ModelCtorException ex = new ModelCtorException();
if ( FAILS == Check.required(fSearchText, Check.range(2, 255)) ) {
ex.add("Please input between 2 and 255 characters.");
}
if(FAILS == Check.required(fSearchStyle)){
ex.add("Please check off the style of search.");
}
if( fFromDate != null && fToDate != null ){
if(fFromDate.gt(fToDate)){
ex.add("The From Date cannot come after the To Date");
}
}
if ( ! ex.isEmpty() ) throw ex;
}
}