package org.openlmis.core.presenter;
import com.google.inject.Inject;
import org.openlmis.core.LMISApp;
import org.openlmis.core.R;
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.service.ProgramDataFormPeriodService;
import org.openlmis.core.utils.Constants;
import org.openlmis.core.utils.DateUtil;
import org.openlmis.core.view.BaseView;
import org.openlmis.core.view.viewmodel.RapidTestReportViewModel;
import org.roboguice.shaded.goole.common.base.Optional;
import org.roboguice.shaded.goole.common.base.Predicate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import lombok.Getter;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import static org.roboguice.shaded.goole.common.collect.FluentIterable.from;
public class RapidTestReportsPresenter extends Presenter {
@Getter
private List<RapidTestReportViewModel> viewModelList = new ArrayList<>();
@Inject
private ProgramDataFormRepository programDataFormRepository;
@Inject
private ProgramDataFormPeriodService periodService;
public RapidTestReportsPresenter() {
}
@Override
public void attachView(BaseView v) throws ViewNotMatchException {
}
public Observable<List<RapidTestReportViewModel>> loadViewModels() {
return Observable.just(generateViewModels())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
private List<RapidTestReportViewModel> generateViewModels() {
viewModelList.clear();
try {
generateViewModelsForAllPeriods();
} catch (LMISException e) {
e.printStackTrace();
}
return viewModelList;
}
protected void generateViewModelsForAllPeriods() throws LMISException {
Period period = periodService.getFirstStandardPeriod();
List<ProgramDataForm> rapidTestForms = programDataFormRepository.listByProgramCode(Constants.RAPID_TEST_CODE);
while (period != null) {
addViewModel(period, rapidTestForms);
period = periodService.generateNextPeriod(period);
}
if (LMISApp.getInstance().getFeatureToggleFor(R.bool.feature_training)) {
addViewModel(Period.of(new Date()), rapidTestForms);
}
Collections.sort(viewModelList, new Comparator<RapidTestReportViewModel>() {
@Override
public int compare(RapidTestReportViewModel lhs, RapidTestReportViewModel rhs) {
return rhs.getPeriod().getBegin().toDate().compareTo(lhs.getPeriod().getBegin().toDate());
}
});
}
private void addViewModel(Period period, List<ProgramDataForm> rapidTestForms) {
RapidTestReportViewModel rapidTestReportViewModel = new RapidTestReportViewModel(period);
setExistingProgramDataForm(rapidTestReportViewModel, rapidTestForms);
viewModelList.add(rapidTestReportViewModel);
}
private void setExistingProgramDataForm(final RapidTestReportViewModel viewModel, List<ProgramDataForm> rapidTestForms) {
Optional<ProgramDataForm> existingProgramDataForm = from(rapidTestForms).firstMatch(new Predicate<ProgramDataForm>() {
@Override
public boolean apply(ProgramDataForm programDataForm) {
return DateUtil.formatDate(programDataForm.getPeriodBegin()).equals(DateUtil.formatDate(viewModel.getPeriod().getBegin().toDate()));
}
});
if (existingProgramDataForm.isPresent()) {
viewModel.setRapidTestForm(existingProgramDataForm.get());
}
}
}