package com.fastaccess.ui.modules.repos.code.files.paths;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import com.annimon.stream.Collectors;
import com.annimon.stream.Objects;
import com.annimon.stream.Stream;
import com.fastaccess.data.dao.BranchesModel;
import com.fastaccess.data.dao.model.RepoFile;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.helper.RxHelper;
import com.fastaccess.provider.rest.RestProvider;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
/**
* Created by Kosh on 15 Feb 2017, 10:10 PM
*/
class RepoFilePathPresenter extends BasePresenter<RepoFilePathMvp.View> implements RepoFilePathMvp.Presenter {
private String repoId;
private String login;
private String path;
private String defaultBranch;
private ArrayList<RepoFile> paths = new ArrayList<>();
private ArrayList<BranchesModel> branches = new ArrayList<>();
@Override public void onItemClick(int position, View v, RepoFile item) {
if (!item.getPath().equalsIgnoreCase(path)) if (getView() != null) getView().onItemClicked(item, position);
}
@Override public void onItemLongClick(int position, View v, RepoFile item) {
onItemClick(position, v, item);
}
@Override public void onFragmentCreated(@Nullable Bundle bundle) {
if (bundle != null) {
repoId = bundle.getString(BundleConstant.ID);
login = bundle.getString(BundleConstant.EXTRA);
path = Objects.toString(bundle.getString(BundleConstant.EXTRA_TWO), "");
defaultBranch = Objects.toString(bundle.getString(BundleConstant.EXTRA_THREE), "master");
boolean forceAppend = bundle.getBoolean(BundleConstant.EXTRA_FOUR);
if (InputHelper.isEmpty(repoId) || InputHelper.isEmpty(login)) {
throw new NullPointerException(String.format("error, repoId(%s) or login(%s) is null", repoId, login));
}
if (forceAppend && paths.isEmpty()) {
List<RepoFile> repoFiles = new ArrayList<>();
if (!InputHelper.isEmpty(path)) {
Uri uri = Uri.parse(path);
StringBuilder builder = new StringBuilder();
if (uri.getPathSegments() != null && !uri.getPathSegments().isEmpty()) {
List<String> pathSegments = uri.getPathSegments();
for (int i = 0; i < pathSegments.size(); i++) {
String name = pathSegments.get(i);
RepoFile file = new RepoFile();
if (i == 0) {
builder.append(name);
} else {
builder.append("/").append(name);
}
file.setPath(builder.toString());
file.setName(name);
repoFiles.add(file);
}
}
if (!repoFiles.isEmpty()) {
sendToView(view -> view.onNotifyAdapter(repoFiles, 1));
}
}
}
sendToView(RepoFilePathMvp.View::onSendData);
if (branches.isEmpty()) {
Observable<List<BranchesModel>> observable = RxHelper.getObserver(Observable.zip(
RestProvider.getRepoService().getBranches(login, repoId),
RestProvider.getRepoService().getTags(login, repoId),
(branchPageable, tags) -> {
ArrayList<BranchesModel> branchesModels = new ArrayList<>();
if (branchPageable.getItems() != null) {
branchesModels.addAll(Stream.of(branchPageable.getItems())
.map(branchesModel -> {
branchesModel.setTag(false);
return branchesModel;
}).collect(Collectors.toList()));
}
if (tags != null) {
branchesModels.addAll(Stream.of(tags.getItems())
.map(branchesModel -> {
branchesModel.setTag(true);
return branchesModel;
}).collect(Collectors.toList()));
}
return branchesModels;
}));
manageSubscription(observable
.doOnSubscribe(() -> sendToView(view -> view.showProgress(0)))
.doOnNext(branchesModels -> {
branches.clear();
branches.addAll(branchesModels);
sendToView(view -> view.setBranchesData(branches, true));
})
.onErrorReturn(throwable -> {
sendToView(view -> view.setBranchesData(branches, true));
return null;
})
.subscribe());
}
} else {
throw new NullPointerException("Bundle is null");
}
}
@NonNull @Override public String getRepoId() {
return repoId;
}
@NonNull @Override public String getLogin() {
return login;
}
@Nullable @Override public String getPath() {
return path;
}
@NonNull @Override public ArrayList<RepoFile> getPaths() {
return paths;
}
@NonNull @Override public ArrayList<BranchesModel> getBranches() {
return branches;
}
@Override public String getDefaultBranch() {
return defaultBranch;
}
}