package tellh.com.gitclub.presentation.presenter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.tellh.nolistadapter.adapter.RecyclerViewAdapter;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import rx.functions.Action0;
import tellh.com.gitclub.R;
import tellh.com.gitclub.common.base.BasePresenter;
import tellh.com.gitclub.common.base.DefaultSubscriber;
import tellh.com.gitclub.common.config.Constant.LangTrending;
import tellh.com.gitclub.common.utils.RxJavaUtils;
import tellh.com.gitclub.common.utils.Utils;
import tellh.com.gitclub.model.entity.RepositoryInfo;
import tellh.com.gitclub.model.entity.ShowCase;
import tellh.com.gitclub.model.entity.ShowCaseInfo;
import tellh.com.gitclub.model.entity.Trending;
import tellh.com.gitclub.model.net.DataSource.ArsenalDataSource;
import tellh.com.gitclub.model.net.DataSource.ExploreDataSource;
import tellh.com.gitclub.model.net.DataSource.GankDataSource;
import tellh.com.gitclub.model.net.DataSource.RepositoryDataSource;
import tellh.com.gitclub.presentation.contract.ExploreContract;
import static tellh.com.gitclub.common.config.Constant.Since;
import static tellh.com.gitclub.presentation.contract.ExploreContract.ARSENAL;
import static tellh.com.gitclub.presentation.contract.ExploreContract.GANK_IO;
public class ExplorePresenter extends BasePresenter<ExploreContract.View>
implements ExploreContract.Presenter {
private final ExploreDataSource mExploreDataSource;
private final GankDataSource mGankDataSource;
private final ArsenalDataSource mArsenalDataSource;
private boolean isFlyingGankRequest;
private boolean isFlyingArsenalRequest;
private LangTrending curLanguage;
private Since curSince;
//use combination instead of inherit.
private final IRepoListPresenter repoListPresenter;
private DialogManager dialogManager;
public ExplorePresenter(ExploreDataSource exploreDataSource, RepositoryDataSource repositoryDataSource,
GankDataSource gankDataSource, ArsenalDataSource arsenalDataSource) {
mExploreDataSource = exploreDataSource;
mGankDataSource = gankDataSource;
mArsenalDataSource = arsenalDataSource;
repoListPresenter = new RepoListPresenter(this, repositoryDataSource);
curLanguage = LangTrending.ALL;
curSince = Since.TODAY;
}
@Override
public void attachView(ExploreContract.View mvpView) {
super.attachView(mvpView);
dialogManager = new DialogManager();
}
public void listTrending(LangTrending language, Since since) {
Map<String, String> params = new LinkedHashMap<>();
if (language != LangTrending.ALL)
params.put(LangTrending.key(), language.toString());
params.put(Since.key(), since.toString());
addSubscription(
mExploreDataSource.listTrending(params)
.subscribe(new DefaultSubscriber<List<Trending>>() {
@Override
public void onNext(List<Trending> trendings) {
getView().onGetTrending(trendings);
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError(Utils.getString(R.string.error_get_trending) + errorStr,
ExploreContract.TRENDING);
}
})
);
}
@Override
public void listTrending() {
listTrending(curLanguage, curSince);
}
@Override
public void listShowCase() {
addSubscription(
mExploreDataSource.listShowCase()
.subscribe(new DefaultSubscriber<List<ShowCase>>() {
@Override
public void onNext(List<ShowCase> showCases) {
getView().onGetShowcases(showCases);
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError(Utils.getString(R.string.error_get_showcases) + errorStr,
ExploreContract.SHOWCASES);
}
})
);
}
@Override
public void getShowcaseDetail(final ShowCase showcase) {
addSubscription(
mExploreDataSource.getShowCaseDetail(showcase.getSlug())
.compose(RxJavaUtils.<ShowCaseInfo>setLoadingListener(getView()))
.subscribe(new DefaultSubscriber<ShowCaseInfo>() {
@Override
public void onNext(ShowCaseInfo showCaseInfo) {
showCaseInfo.setImage(showcase.getImage_url());
getView().onGetShowcasesDetail(showCaseInfo);
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError(Utils.getString(R.string.error_get_showcases) + errorStr);
}
})
);
}
@Override
public void listGankData(final int page) {
if (isFlyingGankRequest) {
getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying));
return;
}
isFlyingGankRequest = true;
addSubscription(
mGankDataSource.getRepositories(page)
.doOnTerminate(new Action0() {
@Override
public void call() {
isFlyingGankRequest = false;
}
})
.subscribe(new DefaultSubscriber<List<RepositoryInfo>>() {
@Override
public void onNext(List<RepositoryInfo> repositoryList) {
getView().onGetGankData(repositoryList, getUpdateType(page));
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError("Something wrong when freching Gank data.", GANK_IO);
}
})
);
}
@Override
public void listArsenalData(final int page) {
if (isFlyingArsenalRequest) {
getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying));
return;
}
isFlyingArsenalRequest = true;
addSubscription(
mArsenalDataSource.getRepositories(page)
.doOnTerminate(new Action0() {
@Override
public void call() {
isFlyingArsenalRequest = false;
}
})
.subscribe(new DefaultSubscriber<List<RepositoryInfo>>() {
@Override
public void onNext(List<RepositoryInfo> repositoryList) {
getView().onGetArsenalData(repositoryList, getUpdateType(page));
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError("Something wrong when freching ARSENAL data.", ARSENAL);
}
})
);
}
@Override
public void checkState(int position, RecyclerViewAdapter adapter) {
repoListPresenter.checkState(position, adapter);
}
@Override
public void starRepo(int position, RecyclerViewAdapter adapter, boolean toggle) {
repoListPresenter.starRepo(position, adapter, toggle);
}
@Override
public void watchRepo(int position, RecyclerViewAdapter adapter, boolean toggle) {
repoListPresenter.watchRepo(position, adapter, toggle);
}
@Override
public void forkRepo(int position, RecyclerViewAdapter adapter) {
repoListPresenter.forkRepo(position, adapter);
}
@Override
public void getRepoInfo(String owner, String name, OnGetRepoCallback callback) {
repoListPresenter.getRepoInfo(owner, name, callback);
}
public class DialogManager {
private final MaterialDialog dialogSince;
private MaterialDialog dialogLang;
public DialogManager() {
Context viewContext = getView().getViewContext();
//language dialog
dialogLang = new MaterialDialog.Builder(viewContext)
.title(R.string.title_program_language)
.items(LangTrending.getDisplayStringList())
.itemsCallbackSingleChoice(0, new MaterialDialog.ListCallbackSingleChoice() {
@Override
public boolean onSelection(MaterialDialog materialDialog, View view, int i, CharSequence charSequence) {
LangTrending[] languageMap = LangTrending.values();
curLanguage = languageMap[i];
listTrending(curLanguage, curSince);
return false;
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) {
materialDialog.dismiss();
}
})
.positiveText("OK")
.negativeText("Cancel")
.negativeColorRes(R.color.red)
.build();
dialogSince = new MaterialDialog.Builder(viewContext)
.title(R.string.title_since)
.items(Since.getDisplayStringList())
.itemsCallbackSingleChoice(0, new MaterialDialog.ListCallbackSingleChoice() {
@Override
public boolean onSelection(MaterialDialog materialDialog, View view, int i, CharSequence charSequence) {
Since[] sinces = Since.values();
curSince = sinces[i];
listTrending(curLanguage, curSince);
return false;
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) {
materialDialog.dismiss();
}
})
.positiveText("OK")
.negativeText("Cancel")
.negativeColorRes(R.color.red)
.build();
}
}
@Override
public MaterialDialog getDialogLang() {
return dialogManager.dialogLang;
}
@Override
public MaterialDialog getDialogSince() {
return dialogManager.dialogSince;
}
}