package tellh.com.gitclub.model.net.DataSource;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Action0;
import rx.functions.Func1;
import tellh.com.gitclub.common.config.Constant;
import tellh.com.gitclub.common.utils.RxJavaUtils;
import tellh.com.gitclub.model.entity.ArsenalRepository;
import tellh.com.gitclub.model.entity.RepositoryInfo;
import tellh.com.gitclub.model.net.service.ArsenalService;
import tellh.com.gitclub.model.net.service.RepositoryService;
/**
* Created by tlh on 2016/10/5 :)
*/
public class ArsenalDataSource {
private ArsenalService arsenalService;
private RepositoryService repositoryService;
public ArsenalDataSource(ArsenalService arsenalService, RepositoryService repositoryService) {
this.arsenalService = arsenalService;
this.repositoryService = repositoryService;
}
private Observable<List<ArsenalRepository>> getData(int page) {
return arsenalService.list(page, Constant.PER_PAGE_ARSENAL)
.compose(RxJavaUtils.<List<ArsenalRepository>>applySchedulers());
}
private Observable<RepositoryInfo> getRepository(int page) {
return getData(page)
.flatMap(new Func1<List<ArsenalRepository>, Observable<RepositoryInfo>>() {
@Override
public Observable<RepositoryInfo> call(final List<ArsenalRepository> resultsEntities) {
List<Observable<RepositoryInfo>> observableList = new ArrayList<>(Constant.PER_PAGE_ARSENAL);
for (ArsenalRepository repo : resultsEntities) {
observableList.add(repositoryService.getRepoInfo(repo.getOwner(), repo.getName()));
}
return Observable.mergeDelayError(observableList).compose(RxJavaUtils.<RepositoryInfo>applySchedulers());
}
});
}
public Observable<List<RepositoryInfo>> getRepositories(final int page) {
final List<RepositoryInfo> repositories = new ArrayList<>(Constant.PER_PAGE_ARSENAL);
return Observable.create(new Observable.OnSubscribe<List<RepositoryInfo>>() {
@Override
public void call(final Subscriber<? super List<RepositoryInfo>> subscriber) {
getRepository(page)
.doOnTerminate(new Action0() {
@Override
public void call() {
subscriber.onNext(repositories);
}
})
.subscribe(new Subscriber<RepositoryInfo>() {
@Override
public void onCompleted() {
subscriber.onCompleted();
}
@Override
public void onError(Throwable e) {
subscriber.onError(e);
}
@Override
public void onNext(RepositoryInfo repositoryInfo) {
repositories.add(repositoryInfo);
}
});
}
});
}
}