package org.openlmis.core.presenter;
import com.google.inject.Inject;
import org.openlmis.core.exceptions.LMISException;
import org.openlmis.core.model.Product;
import org.openlmis.core.model.RnrFormItem;
import org.openlmis.core.model.repository.ProductRepository;
import org.openlmis.core.view.BaseView;
import org.openlmis.core.view.viewmodel.AddDrugsToViaInventoryViewModel;
import org.openlmis.core.view.viewmodel.InventoryViewModel;
import org.roboguice.shaded.goole.common.base.Function;
import org.roboguice.shaded.goole.common.base.Predicate;
import org.roboguice.shaded.goole.common.collect.FluentIterable;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class AddDrugsToVIAPresenter extends Presenter {
@Inject
private ProductRepository productRepository;
@Getter
final List<InventoryViewModel> inventoryViewModelList = new ArrayList<>();
public AddDrugsToVIAPresenter() {
}
@Override
public void attachView(BaseView v) {
}
public Observable<Void> loadActiveProductsNotInVIAForm(final List<String> existingProducts) {
return Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(final Subscriber<? super Void> subscriber) {
try {
inventoryViewModelList.addAll(FluentIterable.from(productRepository.queryActiveProductsInVIAProgramButNotInDraftVIAForm())
.filter(new Predicate<Product>() {
@Override
public boolean apply(Product product) {
return !existingProducts.contains(product.getCode());
}
})
.transform(new Function<Product, InventoryViewModel>() {
@Override
public InventoryViewModel apply(Product product) {
return new AddDrugsToViaInventoryViewModel(product);
}
}).toList());
subscriber.onNext(null);
subscriber.onCompleted();
} catch (LMISException e) {
e.reportToFabric();
subscriber.onError(e);
}
}
}).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
}
public Observable<ArrayList<RnrFormItem>> convertViewModelsToRnrFormItems() {
return Observable.just(new ArrayList<>(
FluentIterable.from(inventoryViewModelList).filter(new Predicate<InventoryViewModel>() {
@Override
public boolean apply(InventoryViewModel viewModel) {
return viewModel.isChecked();
}
}).transform(new Function<InventoryViewModel, RnrFormItem>() {
@Override
public RnrFormItem apply(InventoryViewModel inventoryViewModel) {
RnrFormItem rnrFormItem = new RnrFormItem();
try {
Product product = productRepository.getByCode(inventoryViewModel.getFnm());
rnrFormItem.setProduct(product);
rnrFormItem.setRequestAmount(Long.valueOf(((AddDrugsToViaInventoryViewModel) inventoryViewModel).getQuantity()));
} catch (LMISException e) {
e.reportToFabric();
}
return rnrFormItem;
}
}).toList()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}