package org.apache.fineract.ui.online.login;

import static org.apache.fineract.data.remote.BaseApiManager.retrofit;

import android.content.Context;
import android.util.Log;

import org.apache.fineract.R;
import org.apache.fineract.data.datamanager.DataManagerAuth;
import org.apache.fineract.data.models.Authentication;
import org.apache.fineract.data.models.error.MifosError;
import org.apache.fineract.injection.ApplicationContext;
import org.apache.fineract.injection.ConfigPersistent;
import org.apache.fineract.ui.base.BasePresenter;

import java.io.IOException;
import java.lang.annotation.Annotation;

import javax.inject.Inject;

import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.HttpException;
import retrofit2.Response;

/**
 * @author Rajan Maurya
 *         On 17/06/17.
 */
@ConfigPersistent
public class LoginPresenter extends BasePresenter<LoginContract.View>
        implements LoginContract.Presenter {

    private static final String LOG_TAG = LoginPresenter.class.getSimpleName();

    private DataManagerAuth dataManagerAuth;
    private CompositeDisposable compositeDisposable;

    @Inject
    public LoginPresenter(DataManagerAuth dataManagerAuth, @ApplicationContext Context context) {
        super(context);
        this.dataManagerAuth = dataManagerAuth;
        compositeDisposable = new CompositeDisposable();
    }

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

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

    @Override
    public void login(String username, String password) {
        checkViewAttached();
        getMvpView().showProgressDialog();
        compositeDisposable.add(dataManagerAuth.login(username, password)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableObserver<Authentication>() {
                    @Override
                    public void onNext(Authentication user) {
                        getMvpView().hideProgressDialog();
                        getMvpView().showUserLoginSuccessfully(user);
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        getMvpView().hideProgressDialog();
                        if (throwable instanceof IOException) {
                            getMvpView().showError(
                                    context.getString(R.string.no_internet_connection));
                        }

                        MifosError mifosError = new MifosError();
                        Converter<ResponseBody, MifosError> errorConverter =
                                retrofit.responseBodyConverter(MifosError.class, new Annotation[0]);
                        if (throwable instanceof HttpException) {
                            HttpException httpException = (HttpException) throwable;
                            Response response = httpException.response();

                            if (response.errorBody() != null) {
                                try {
                                    mifosError = errorConverter.convert(response.errorBody());
                                } catch (IOException e) {
                                    Log.d(LOG_TAG, e.getLocalizedMessage());
                                }
                            }

                            if (mifosError.getMessage() == null) {
                                getMvpView().showError(
                                        context.getString(R.string.wrong_username_or_password));
                            } else {
                                getMvpView().showError(mifosError.getMessage());
                            }
                        }
                    }

                    @Override
                    public void onComplete() {

                    }
                })
        );
    }
}
