/*
* Copyright (c) 2014. The Trustees of Indiana University.
*
* This version of the code is licensed under the MPL 2.0 Open Source license with additional
* healthcare disclaimer. If the user is an entity intending to commercialize any application
* that uses this code in a for-profit venture, please contact the copyright holder.
*/
package com.muzima.view.forms;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.widget.Toast;
import com.muzima.MuzimaApplication;
import com.muzima.R;
import com.muzima.api.model.FormData;
import com.muzima.api.model.Patient;
import com.muzima.controller.ConceptController;
import com.muzima.controller.FormController;
import com.muzima.controller.ObservationController;
import com.muzima.controller.PatientController;
import com.muzima.service.FormParser;
import com.muzima.utils.Constants;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.text.ParseException;
import static com.muzima.utils.Constants.FORM_DISCRIMINATOR_REGISTRATION;
import static com.muzima.utils.Constants.STATUS_COMPLETE;
public class FormDataStore {
private static final String TAG = "FormDataStore";
private FormWebViewActivity formWebViewActivity;
private FormController formController;
private FormData formData;
private MuzimaApplication applicationContext;
public FormDataStore(FormWebViewActivity formWebViewActivity, FormController formController, FormData formData) {
this.formWebViewActivity = formWebViewActivity;
this.formController = formController;
this.formData = formData;
this.applicationContext = (MuzimaApplication) formWebViewActivity.getApplicationContext();
}
@JavascriptInterface
public void save(String jsonData, String xmlData, String status) {
formData.setXmlPayload(xmlData);
formData.setJsonPayload(jsonData);
formData.setStatus(status);
try {
if (isRegistrationComplete(status)) {
Patient newPatient = formController.createNewPatient(jsonData);
formData.setPatientUuid(newPatient.getUuid());
formWebViewActivity.startPatientSummaryView(newPatient);
}
parseForm(xmlData, status);
formController.saveFormData(formData);
formWebViewActivity.setResult(FormsActivity.RESULT_OK);
formWebViewActivity.finish();
} catch (FormController.FormDataSaveException e) {
Toast.makeText(formWebViewActivity, formWebViewActivity.getString(R.string.error_form_save), Toast.LENGTH_SHORT).show();
Log.e(TAG, "Exception occurred while saving form data", e);
} catch (ConceptController.ConceptSaveException e) {
Toast.makeText(formWebViewActivity, formWebViewActivity.getString(R.string.error_observation_form_save), Toast.LENGTH_SHORT).show();
Log.e(TAG, "Exception occurred while saving a concept parsed from the form data", e);
} catch (ObservationController.ParseObservationException e) {
Toast.makeText(formWebViewActivity, formWebViewActivity.getString(R.string.error_observation_form_save), Toast.LENGTH_SHORT).show();
Log.e(TAG, "Exception occurred while saving an observation parsed from the form data", e);
} catch (ConceptController.ConceptParseException e) {
Toast.makeText(formWebViewActivity, formWebViewActivity.getString(R.string.error_concept_parse), Toast.LENGTH_SHORT).show();
Log.e(TAG, "Exception occurred while parsing a concept parsed from the form data", e);
} catch (ParseException e) {
Toast.makeText(formWebViewActivity, formWebViewActivity.getString(R.string.error_observation_form_save), Toast.LENGTH_SHORT).show();
Log.e(TAG, "Exception occurred while parsing the xml payload", e);
} catch (XmlPullParserException e) {
Toast.makeText(formWebViewActivity, formWebViewActivity.getString(R.string.error_observation_form_save), Toast.LENGTH_SHORT).show();
Log.e(TAG, "Exception occurred while exploring the xml payload", e);
} catch (PatientController.PatientLoadException e) {
Toast.makeText(formWebViewActivity, formWebViewActivity.getString(R.string.error_observation_form_save), Toast.LENGTH_SHORT).show();
Log.e(TAG, "Exception occurred while loading a patient parsed from the form data", e);
} catch (ConceptController.ConceptFetchException e) {
Toast.makeText(formWebViewActivity, formWebViewActivity.getString(R.string.error_observation_form_save), Toast.LENGTH_SHORT).show();
Log.e(TAG, "Exception occurred while fetching a concept parsed from the form data", e);
} catch (IOException e) {
Toast.makeText(formWebViewActivity,formWebViewActivity.getString(R.string.error_observation_form_save), Toast.LENGTH_SHORT).show();
Log.e(TAG, "IOException occurred while saving observations parsed from the form data", e);
}
}
private void parseForm(String xmlData, String status) throws ConceptController.ConceptSaveException,
ParseException, XmlPullParserException, PatientController.PatientLoadException,
ConceptController.ConceptFetchException, IOException, ConceptController.ConceptParseException,
ObservationController.ParseObservationException{
if (status.equals(Constants.STATUS_INCOMPLETE)){
return;
}
FormParser formParser = getFormParser();
formParser.parseAndSaveObservations(xmlData,formData.getUuid());
}
public FormParser getFormParser() {
return new FormParser(applicationContext.getPatientController(), applicationContext.getConceptController(),
applicationContext.getEncounterController(), applicationContext.getObservationController());
}
private boolean isRegistrationComplete(String status) {
return isRegistrationForm() && status.equals(STATUS_COMPLETE);
}
@JavascriptInterface
public String getFormPayload() {
return formData.getJsonPayload();
}
@JavascriptInterface
public String getFormStatus() {
return formData.getStatus();
}
@JavascriptInterface
public void showSaveProgressBar() {
formWebViewActivity.showProgressBar("Saving...");
}
public boolean isRegistrationForm() {
return (formData.getDiscriminator() != null) && formData.getDiscriminator().equals(FORM_DISCRIMINATOR_REGISTRATION);
}
}