package tellh.com.gitclub.presentation.presenter;
import com.tellh.nolistadapter.adapter.RecyclerViewAdapter;
import java.util.ArrayList;
import java.util.List;
import rx.functions.Action0;
import tellh.com.gitclub.R;
import tellh.com.gitclub.common.base.BasePresenter;
import tellh.com.gitclub.common.base.BaseView;
import tellh.com.gitclub.common.base.DefaultSubscriber;
import tellh.com.gitclub.common.utils.Utils;
import tellh.com.gitclub.model.entity.RepositoryInfo;
import tellh.com.gitclub.model.entity.UserEntity;
import tellh.com.gitclub.model.net.DataSource.RepositoryDataSource;
import tellh.com.gitclub.model.net.DataSource.UserDataSource;
import tellh.com.gitclub.presentation.contract.ShowError;
import static com.tellh.nolistadapter.adapter.FooterLoadMoreAdapterWrapper.UpdateType;
/**
* Created by tlh on 2016/9/16 :)
*/
public class ListUserPresenter extends BasePresenter<ListUserPresenter.ListUserView> implements IUserListPresenter {
private final RepositoryDataSource mRepositoryDataSource;
private final IUserListPresenter userListPresenter;
private final UserDataSource mUserDataSource;
private boolean isFlying;
private String owner;
private String repo;
public ListUserPresenter(RepositoryDataSource repositoryDataSource, UserDataSource userDataSource) {
this.mRepositoryDataSource = repositoryDataSource;
this.mUserDataSource = userDataSource;
userListPresenter = new UserListPresenter(this, userDataSource);
}
public void setRepo(String owner, String repo) {
this.owner = owner;
this.repo = repo;
}
public void listForks(final int page) {
if (owner == null || repo == null) {
return;
}
if (isFlying) {
getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying));
return;
}
isFlying = true;
addSubscription(
mRepositoryDataSource.listForks(owner, repo, page)
.doOnTerminate(new Action0() {
@Override
public void call() {
isFlying = false;
}
})
.subscribe(new DefaultSubscriber<List<RepositoryInfo>>() {
@Override
public void onNext(List<RepositoryInfo> list) {
ArrayList<UserEntity> userEntities = new ArrayList<>();
for (RepositoryInfo repositoryInfo : list) {
userEntities.add(repositoryInfo.getOwner());
}
getView().onGetUserList(userEntities, getUpdateType(page));
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError(getUpdateType(page), errorStr);
}
})
);
}
public void listWatchers(final int page) {
if (owner == null || repo == null) {
return;
}
if (isFlying) {
getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying));
return;
}
isFlying = true;
addSubscription(
mRepositoryDataSource.listWatchers(owner, repo, page)
.doOnTerminate(new Action0() {
@Override
public void call() {
isFlying = false;
}
})
.subscribe(new DefaultSubscriber<List<UserEntity>>() {
@Override
public void onNext(List<UserEntity> list) {
getView().onGetUserList(list, getUpdateType(page));
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError(getUpdateType(page), errorStr);
}
})
);
}
public void listStargazers(final int page) {
if (owner == null || repo == null) {
return;
}
if (isFlying) {
getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying));
return;
}
isFlying = true;
addSubscription(
mRepositoryDataSource.listStargazers(owner, repo, page)
.doOnTerminate(new Action0() {
@Override
public void call() {
isFlying = false;
}
})
.subscribe(new DefaultSubscriber<List<UserEntity>>() {
@Override
public void onNext(List<UserEntity> list) {
getView().onGetUserList(list, getUpdateType(page));
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError(getUpdateType(page), errorStr);
}
})
);
}
public void listContributors(final int page) {
if (owner == null || repo == null) {
return;
}
if (isFlying) {
getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying));
return;
}
isFlying = true;
addSubscription(
mRepositoryDataSource.listContributors(owner, repo, page)
.doOnTerminate(new Action0() {
@Override
public void call() {
isFlying = false;
}
})
.subscribe(new DefaultSubscriber<List<UserEntity>>() {
@Override
public void onNext(List<UserEntity> list) {
getView().onGetUserList(list, getUpdateType(page));
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError(getUpdateType(page), errorStr);
}
})
);
}
public void listFollowers(String userName, final int page) {
if (isFlying) {
getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying));
return;
}
isFlying = true;
addSubscription(
mUserDataSource.listFollowers(userName, page)
.doOnTerminate(new Action0() {
@Override
public void call() {
isFlying = false;
}
})
.subscribe(new DefaultSubscriber<List<UserEntity>>() {
@Override
public void onNext(List<UserEntity> list) {
getView().onGetUserList(list, getUpdateType(page));
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError(getUpdateType(page), errorStr);
}
})
);
}
public void listFollowing(String userName, final int page) {
if (isFlying) {
getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying));
return;
}
isFlying = true;
addSubscription(
mUserDataSource.listFollowing(userName, page)
.doOnTerminate(new Action0() {
@Override
public void call() {
isFlying = false;
}
})
.subscribe(new DefaultSubscriber<List<UserEntity>>() {
@Override
public void onNext(List<UserEntity> list) {
getView().onGetUserList(list, getUpdateType(page));
getView().showOnSuccess();
}
@Override
protected void onError(String errorStr) {
getView().showOnError(getUpdateType(page), errorStr);
}
})
);
}
@Override
public void getUserInfo(int position, RecyclerViewAdapter adapter) {
userListPresenter.getUserInfo(position, adapter);
}
@Override
public void followUser(int position, RecyclerViewAdapter adapter, boolean toggle) {
userListPresenter.followUser(position, adapter, toggle);
}
public interface ListUserView extends BaseView, ShowError {
void onGetUserList(List<UserEntity> list, @UpdateType int updateType);
}
}