package com.alorma.github.presenter.repo;
import com.alorma.github.gcm.GcmTopicsHelper;
import com.alorma.github.presenter.BaseRxPresenter;
import com.alorma.github.presenter.View;
import com.alorma.github.presenter.repo.tags.GetTagsCountUseCase;
import com.alorma.github.sdk.bean.dto.request.WebHookConfigRequest;
import com.alorma.github.sdk.bean.dto.request.WebHookRequest;
import com.alorma.github.sdk.bean.dto.request.WebHookResponse;
import com.alorma.github.sdk.bean.info.RepoInfo;
import com.alorma.github.sdk.services.webhooks.AddWebHookClient;
import core.datasource.SdkItem;
import core.repositories.Repo;
import core.repository.ActionRepository;
import rx.Observable;
import rx.Scheduler;
public class RepositoryPresenter extends BaseRxPresenter<RepoInfo, Repo, View<Repo>> {
private final GetRepositoryUseCase getRepositoryUseCase;
private final ActionRepository changeRepositoryStarUseCase;
private final ActionRepository changeRepositoryWatchUseCase;
private final GetTagsCountUseCase getTagsCountUseCase;
private Repo currentRepo;
public RepositoryPresenter(Scheduler mainScheduler, Scheduler ioScheduler, GetRepositoryUseCase getRepositoryUseCase,
ActionRepository changeRepositoryStarUseCase, ActionRepository changeRepositoryWatchUseCase,
GetTagsCountUseCase getTagsCountUseCase) {
super(mainScheduler, ioScheduler, null);
this.getRepositoryUseCase = getRepositoryUseCase;
this.changeRepositoryStarUseCase = changeRepositoryStarUseCase;
this.changeRepositoryWatchUseCase = changeRepositoryWatchUseCase;
this.getTagsCountUseCase = getTagsCountUseCase;
}
@Override
public void execute(final RepoInfo repoInfo) {
if (isViewAttached() && repoInfo != null) {
getView().showLoading();
subscribe(getRepositoryUseCase.getRepository(repoInfo), false);
getTagsCountUseCase.getTagsCount(repoInfo)
.map(SdkItem::getK)
.subscribeOn(ioScheduler)
.observeOn(mainScheduler)
.subscribe(this::showReleases, throwable -> showReleases(0));
}
}
private void showReleases(Integer integer) {
if (isViewAttached() && getView() != null && getView() instanceof RepoView) {
((RepoView) getView()).showTagsCount(integer != null ? integer : 0);
}
}
public void toggleStar() {
Observable<SdkItem<Repo>> resultObservable = Observable.defer(() -> {
if (currentRepo != null) {
Boolean isStarred = currentRepo.isStarred();
String owner = currentRepo.getOwner().getLogin();
String name = currentRepo.getName();
RepoInfo info = new RepoInfo();
info.owner = owner;
info.name = name;
return changeRepositoryStarUseCase.execute(info, isStarred);
}
return Observable.empty();
}).flatMap(aBoolean -> {
RepoInfo repoInfo = new RepoInfo();
repoInfo.owner = currentRepo.getOwner().getLogin();
repoInfo.name = currentRepo.getName();
return getRepositoryUseCase.getRepository(repoInfo, true);
});
subscribe(resultObservable, false);
}
public void toggleWatch() {
Observable<SdkItem<Repo>> resultObservable = Observable.defer(() -> {
if (currentRepo != null) {
Boolean isWatched = currentRepo.isWatched();
String owner = currentRepo.getOwner().getLogin();
String name = currentRepo.getName();
RepoInfo info = new RepoInfo();
info.owner = owner;
info.name = name;
return changeRepositoryWatchUseCase.execute(info, isWatched);
}
return Observable.empty();
}).flatMap(aBoolean -> {
RepoInfo repoInfo = new RepoInfo();
repoInfo.owner = currentRepo.getOwner().getLogin();
repoInfo.name = currentRepo.getName();
return getRepositoryUseCase.getRepository(repoInfo, true);
});
subscribe(resultObservable, false);
}
@Override
protected void subscribe(Observable<SdkItem<Repo>> observable, boolean isFromPaginated) {
observable = observable.map(SdkItem::getK).doOnNext(repo -> this.currentRepo = repo).map(SdkItem::new);
super.subscribe(observable, isFromPaginated);
}
public void subscribeRepoPushes(RepoInfo requestRepoInfo) {
WebHookRequest webhook = new WebHookRequest();
webhook.name = "web";
webhook.active = true;
webhook.events = new String[] {
"issues"
};
webhook.config = new WebHookConfigRequest();
webhook.config.content_type = "json";
webhook.config.url = "https://cryptic-ravine-97684.herokuapp.com/message";
Observable<WebHookResponse> observable = new AddWebHookClient(requestRepoInfo.owner, requestRepoInfo.name, webhook).observable();
observable.subscribeOn(ioScheduler).observeOn(mainScheduler).subscribe(webHookResponse -> {
GcmTopicsHelper.registerInTopic(requestRepoInfo);
}, throwable -> {
});
}
public interface RepoView extends View<Repo> {
void showTagsCount(int tagsCount);
}
}