package org.openlmis.core.presenter;
import com.google.inject.Inject;
import org.joda.time.DateTime;
import org.openlmis.core.exceptions.LMISException;
import org.openlmis.core.exceptions.ViewNotMatchException;
import org.openlmis.core.model.Period;
import org.openlmis.core.model.ProgramDataForm;
import org.openlmis.core.model.repository.ProgramDataFormRepository;
import org.openlmis.core.model.repository.ProgramRepository;
import org.openlmis.core.utils.Constants;
import org.openlmis.core.view.BaseView;
import org.openlmis.core.view.viewmodel.RapidTestReportViewModel;
import lombok.Getter;
import roboguice.inject.ContextSingleton;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
@ContextSingleton
public class RapidTestReportFormPresenter extends BaseReportPresenter {
@Inject
ProgramDataFormRepository programDataFormRepository;
@Inject
ProgramRepository programRepository;
@Getter
protected RapidTestReportViewModel viewModel;
@Override
public void attachView(BaseView v) throws ViewNotMatchException {
}
public Observable<RapidTestReportViewModel> loadViewModel(final long formId, final DateTime periodBegin) {
return Observable.create(new Observable.OnSubscribe<RapidTestReportViewModel>() {
@Override
public void call(Subscriber<? super RapidTestReportViewModel> subscriber) {
try {
if (formId == 0) {
generateNewRapidTestForm(periodBegin);
} else {
convertProgramDataFormToRapidTestReportViewModel(programDataFormRepository.queryById(formId));
}
subscriber.onNext(viewModel);
subscriber.onCompleted();
} catch (LMISException e) {
subscriber.onError(e);
e.reportToFabric();
}
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
private void convertProgramDataFormToRapidTestReportViewModel(ProgramDataForm programDataForm) {
viewModel = new RapidTestReportViewModel(programDataForm);
}
private void generateNewRapidTestForm(DateTime periodBegin) {
viewModel = new RapidTestReportViewModel(new Period(periodBegin));
viewModel.setStatus(RapidTestReportViewModel.Status.INCOMPLETE);
}
public Observable<RapidTestReportViewModel> onSaveDraftForm() {
return Observable.create(new Observable.OnSubscribe<RapidTestReportViewModel>() {
@Override
public void call(Subscriber<? super RapidTestReportViewModel> subscriber) {
try {
saveForm();
subscriber.onNext(viewModel);
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
public Observable<RapidTestReportViewModel> onAuthoriseDraftForm() {
return Observable.create(new Observable.OnSubscribe<RapidTestReportViewModel>() {
@Override
public void call(Subscriber<? super RapidTestReportViewModel> subscriber) {
try {
saveForm();
syncService.requestSyncImmediately();
subscriber.onNext(viewModel);
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
public void saveForm() {
try {
viewModel.convertFormViewModelToDataModel(programRepository.queryByCode(Constants.RAPID_TEST_CODE));
programDataFormRepository.batchCreateOrUpdate(viewModel.getRapidTestForm());
} catch (Exception e) {
new LMISException(e).reportToFabric();
}
}
@Override
public void deleteDraft() {
if (viewModel.getRapidTestForm().getId() != 0L) {
try {
programDataFormRepository.delete(viewModel.getRapidTestForm());
} catch (Exception e) {
new LMISException(e).reportToFabric();
}
}
}
@Override
public boolean isDraft() {
return viewModel.isDraft();
}
public boolean isSubmitted() {
return viewModel.isSubmitted();
}
public void addSignature(String sign) {
viewModel.addSignature(sign);
}
}