package com.fastaccess.ui.modules.repos.reactions;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import com.fastaccess.data.dao.Pageable;
import com.fastaccess.data.dao.model.ReactionsModel;
import com.fastaccess.data.dao.model.User;
import com.fastaccess.data.dao.types.ReactionTypes;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.provider.rest.RestProvider;
import com.fastaccess.provider.timeline.ReactionsProvider;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
import java.util.ArrayList;
import rx.Observable;
/**
* Created by Kosh on 11 Apr 2017, 11:20 AM
*/
public class ReactionsDialogPresenter extends BasePresenter<ReactionsDialogMvp.View> implements ReactionsDialogMvp.Presenter {
private int page;
private int previousTotal;
private int lastPage = Integer.MAX_VALUE;
private ArrayList<User> users = new ArrayList<>();
private String login;
private String repoId;
private long id;
private ReactionTypes reactionType;
private @ReactionsProvider.ReactionType int reactionTypeMode;
@Override public void onFragmentCreated(@Nullable Bundle bundle) {
if (bundle != null) {
repoId = bundle.getString(BundleConstant.EXTRA);
login = bundle.getString(BundleConstant.EXTRA_TWO);
id = bundle.getLong(BundleConstant.ID);
reactionType = (ReactionTypes) bundle.getSerializable(BundleConstant.EXTRA_TYPE);
reactionTypeMode = bundle.getInt(BundleConstant.EXTRA_THREE);
onCallApi(1, null);
}
}
@NonNull @Override public ArrayList<User> getUsers() {
return users;
}
@Override public int getCurrentPage() {
return page;
}
@Override public int getPreviousTotal() {
return previousTotal;
}
@Override public void setCurrentPage(int page) {
this.page = page;
}
@Override public void setPreviousTotal(int previousTotal) {
this.previousTotal = previousTotal;
}
@Override public void onCallApi(int page, @Nullable Object parameter) {
if (page == 1) {
lastPage = Integer.MAX_VALUE;
sendToView(view -> view.getLoadMore().reset());
}
if (page > lastPage || lastPage == 0 || (login == null || repoId == null || reactionType == null)) {
sendToView(ReactionsDialogMvp.View::hideProgress);
return;
}
setCurrentPage(page);
Observable<Pageable<ReactionsModel>> observable = null;
switch (reactionTypeMode) {
case ReactionsProvider.COMMENT:
observable = RestProvider.getReactionsService()
.getIssueCommentReaction(login, repoId, id, reactionType.getContent(), page);
break;
case ReactionsProvider.COMMIT:
observable = RestProvider.getReactionsService()
.getCommitReaction(login, repoId, id, reactionType.getContent(), page);
break;
case ReactionsProvider.HEADER:
observable = RestProvider.getReactionsService()
.getIssueReaction(login, repoId, id, reactionType.getContent(), page);
break;
case ReactionsProvider.REVIEW_COMMENT:
observable = RestProvider.getReactionsService()
.getPullRequestReactions(login, repoId, id, reactionType.getContent(), page);
break;
}
if (observable == null) {
throw new NullPointerException("Reaction is null?");
}
makeRestCall(observable, response -> {
lastPage = response.getLast();
sendToView(view -> view.onNotifyAdapter(Stream.of(response.getItems())
.filter(reactionsModel -> reactionsModel.getUser() != null)
.map(ReactionsModel::getUser)
.collect(Collectors.toList()), page));
});
}
ReactionTypes getReactionType() {
return reactionType;
}
}