package org.apache.fineract.ui.online.depositaccounts.createdepositaccount.formdepositassignproduct;

import android.content.Context;

import org.apache.fineract.data.datamanager.DataManagerDeposit;
import org.apache.fineract.data.models.deposit.ProductDefinition;
import org.apache.fineract.injection.ApplicationContext;
import org.apache.fineract.injection.ConfigPersistent;
import org.apache.fineract.ui.base.BasePresenter;

import java.util.List;

import javax.inject.Inject;

import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.Function;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;

/**
 * @author Rajan Maurya
 *         On 13/08/17.
 */
@ConfigPersistent
public class FormDepositAssignProductPresenter extends
        BasePresenter<FormDepositAssignProductContract.View>
        implements FormDepositAssignProductContract.Presenter {

    private DataManagerDeposit dataManagerDeposit;
    private final CompositeDisposable  compositeDisposable;
    private List<ProductDefinition> productDefinition;

    @Inject
    public FormDepositAssignProductPresenter(@ApplicationContext Context context,
            DataManagerDeposit dataManagerDeposit) {
        super(context);
        this.dataManagerDeposit = dataManagerDeposit;
        compositeDisposable = new CompositeDisposable();
    }

    @Override
    public void attachView(FormDepositAssignProductContract.View mvpView) {
        super.attachView(mvpView);
    }

    @Override
    public void detachView() {
        super.detachView();
        compositeDisposable.clear();
    }

    @Override
    public void fetchProductDefinitions() {
        checkViewAttached();
        getMvpView().showProgressbar();
        compositeDisposable.add(dataManagerDeposit.fetchProductDefinitions()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableObserver<List<ProductDefinition>>() {
                    @Override
                    public void onNext(List<ProductDefinition> definitions) {
                        getMvpView().hideProgressbar();
                        getMvpView().showProductDefinitions(filterProductsName(definitions));
                    }

                    @Override
                    public void onError(Throwable e) {
                        getMvpView().hideProgressbar();
                        getMvpView().showError("");
                    }

                    @Override
                    public void onComplete() {

                    }
                })
        );
    }

    @Override
    public List<String> filterProductsName(List<ProductDefinition> productDefinitions) {
        this.productDefinition = productDefinitions;
        return Observable.fromIterable(productDefinitions)
                .map(new Function<ProductDefinition, String>() {
                    @Override
                    public String apply(ProductDefinition productDefinition) throws Exception {
                        return productDefinition.getName();
                    }
                }).toList().blockingGet();
    }

    @Override
    public String getProductIdentifier(Integer position) {
        return productDefinition.get(position).getIdentifier();
    }
}
