package org.adaptlab.chpir.android.survey.Models;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.adaptlab.chpir.android.activerecordcloudsync.SendModel;
import org.adaptlab.chpir.android.survey.AuthUtils;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.util.Log;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import com.activeandroid.query.Select;
@Table(name = "Responses")
public class Response extends SendModel {
private static final String TAG = "Response";
public static final String SKIP = "SKIP";
public static final String RF = "RF";
public static final String NA = "NA";
public static final String DK = "DK";
public static final String LOGICAL_SKIP = "LOGICAL_SKIP";
@Column(name = "Question")
private Question mQuestion;
@Column(name = "Text")
private String mText;
@Column(name = "Survey")
private Survey mSurvey;
@Column(name = "Other_Response")
private String mOtherResponse;
@Column(name = "SpecialResponse")
private String mSpecialResponse;
@Column(name = "SentToRemote")
private boolean mSent;
@Column(name = "TimeStarted")
private Date mTimeStarted;
@Column(name = "TimeEnded")
private Date mTimeEnded;
@Column(name = "UUID")
private String mUUID;
@Column(name = "DeviceUser")
private DeviceUser mDeviceUser;
@Column(name = "QuestionVersion")
private int mQuestionVersion;
public Response() {
super();
mSent = false;
mText = "";
mSpecialResponse = "";
mUUID = UUID.randomUUID().toString();
setDeviceUser(AuthUtils.getCurrentUser());
}
public String getUUID() {
return mUUID;
}
/*
* Return true if this response matches the regular expression
* in its question. If the regular expression is the empty string,
* declare it a match and return true.
*/
public boolean isValid() {
if (mQuestion.getRegExValidation() == null) {
return true;
}
return getText().matches(mQuestion.getRegExValidation());
}
/*
* Only save if this response is valid. If valid, return
* true. If not, return false.
*/
public boolean saveWithValidation() {
if (isValid()) {
setQuestionVersion(getQuestion().getQuestionVersion());
save();
mSurvey.setLastUpdated(new Date());
mSurvey.save();
return true;
} else {
return false;
}
}
@Override
public JSONObject toJSON() {
JSONObject json = new JSONObject();
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("survey_uuid", getSurvey().getUUID());
jsonObject.put("question_id", getQuestion().getRemoteId());
jsonObject.put("text", getText());
jsonObject.put("other_response", getOtherResponse());
jsonObject.put("special_response", getSpecialResponse());
jsonObject.put("time_started", getTimeStarted());
jsonObject.put("time_ended", getTimeEnded());
jsonObject.put("question_identifier", getQuestion().getQuestionIdentifier());
jsonObject.put("uuid", getUUID());
jsonObject.put("question_version", getQuestionVersion());
if (getDeviceUser() != null) {
jsonObject.put("device_user_id", getDeviceUser().getRemoteId());
}
json.put("response", jsonObject);
} catch (JSONException je) {
Log.e(TAG, "JSON exception", je);
}
return json;
}
@Override
public boolean isPersistent() { return true; }
/*
* Finders
*/
public static List<Response> getAll() {
return new Select().from(Response.class).orderBy("Id ASC").execute();
}
/*
* Getters/Setters
*/
public Question getQuestion() {
return mQuestion;
}
public void setQuestion(Question question) {
mQuestion = question;
}
public String getText() {
return mText;
}
public void setResponse(String text) {
mText = text;
}
public void setSurvey(Survey survey) {
mSurvey = survey;
}
public Survey getSurvey() {
return mSurvey;
}
public void setOtherResponse(String otherResponse) {
mOtherResponse = otherResponse;
}
public String getOtherResponse() {
return mOtherResponse;
}
public void setSpecialResponse(String specialResponse) {
mSpecialResponse = specialResponse;
}
public String getSpecialResponse() {
return mSpecialResponse;
}
public void setTimeStarted(Date time) {
mTimeStarted = time;
}
public Date getTimeStarted() {
return mTimeStarted;
}
public void setTimeEnded(Date time) {
mTimeEnded = time;
}
public Date getTimeEnded() {
return mTimeEnded;
}
public ResponsePhoto getResponsePhoto() {
return new Select().from(ResponsePhoto.class).where("Response = ?", getId()).executeSingle();
}
@Override
public boolean isSent() {
return mSent;
}
@Override
public void setAsSent(Context context) {
mSent = true;
this.save();
if (getResponsePhoto() == null) {
this.delete();
}
mSurvey.deleteIfComplete();
}
/*
* Only send if survey is ready to send.
*/
@Override
public boolean readyToSend() {
return getSurvey().readyToSend();
}
public boolean hasSpecialResponse() {
return mSpecialResponse.equals(SKIP) || mSpecialResponse.equals(RF) ||
mSpecialResponse.equals(NA) || mSpecialResponse.equals(DK);
}
public DeviceUser getDeviceUser() {
return mDeviceUser;
}
public void setDeviceUser(DeviceUser deviceUser) {
mDeviceUser = deviceUser;
}
private void setQuestionVersion(int version) {
mQuestionVersion = version;
}
private int getQuestionVersion() {
return mQuestionVersion;
}
}