package com.fastaccess.ui.modules.repos.code.prettifier;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.fastaccess.R;
import com.fastaccess.data.dao.MarkdownModel;
import com.fastaccess.data.dao.NameParser;
import com.fastaccess.data.dao.model.ViewerFile;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.helper.Logger;
import com.fastaccess.helper.RxHelper;
import com.fastaccess.provider.markdown.MarkDownProvider;
import com.fastaccess.provider.rest.RestProvider;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
import rx.Observable;
/**
* Created by Kosh on 27 Nov 2016, 3:43 PM
*/
class ViewerPresenter extends BasePresenter<ViewerMvp.View> implements ViewerMvp.Presenter {
private String downloadedStream;
private boolean isMarkdown;
private boolean isRepo;
private boolean isImage;
private String url;
@Override public void onError(@NonNull Throwable throwable) {
throwable.printStackTrace();
int code = RestProvider.getErrorCode(throwable);
if (code == 404) {
sendToView(view -> view.onShowError(isRepo ? R.string.no_readme_found : R.string.no_file_found));
} else {
if (code == 406) {
sendToView(view -> view.openUrl(url));
return;
}
onWorkOffline();
super.onError(throwable);
}
}
@Override public void onHandleIntent(@Nullable Bundle intent) {
if (intent == null) return;
isRepo = intent.getBoolean(BundleConstant.EXTRA);
url = intent.getString(BundleConstant.ITEM);
if (!InputHelper.isEmpty(url)) {
if (MarkDownProvider.isArchive(url)) {
sendToView(view -> view.onShowError(R.string.archive_file_detected_error));
return;
}
if (isRepo) {
url = url.endsWith("/") ? (url + "readme") : (url + "/readme");
}
onWorkOnline();
}
}
@Override public String downloadedStream() {
return downloadedStream;
}
@Override public boolean isMarkDown() {
return isMarkdown;
}
@Override public void onWorkOffline() {
if (downloadedStream == null) {
manageSubscription(RxHelper.getObserver(ViewerFile.get(url))
.subscribe(fileModel -> {
if (fileModel != null) {
isImage = MarkDownProvider.isImage(fileModel.getFullUrl());
if (isImage) {
sendToView(view -> view.onSetImageUrl(fileModel.getFullUrl()));
} else {
downloadedStream = fileModel.getContent();
isRepo = fileModel.isRepo();
isMarkdown = fileModel.isMarkdown();
sendToView(view -> {
if (isRepo || isMarkdown) {
view.onSetMdText(downloadedStream, fileModel.getFullUrl());
} else {
view.onSetCode(downloadedStream);
}
});
}
}
}, throwable -> sendToView(view -> view.showErrorMessage(throwable.getMessage()))));
}
}
@Override public void onWorkOnline() {
isImage = MarkDownProvider.isImage(url);
if (isImage) {
sendToView(view -> view.onSetImageUrl(url));
return;
}
Observable<String> streamObservable = MarkDownProvider.isMarkdown(url)
? RestProvider.getRepoService(true).getFileAsHtmlStream(url)
: RestProvider.getRepoService(true).getFileAsStream(url);
makeRestCall(isRepo ? RestProvider.getRepoService(true).getReadmeHtml(url)
: streamObservable,
content -> {
downloadedStream = content;
ViewerFile fileModel = new ViewerFile();
fileModel.setContent(downloadedStream);
fileModel.setFullUrl(url);
fileModel.setRepo(isRepo);
if (isRepo) {
fileModel.setMarkdown(true);
isMarkdown = true;
isRepo = true;
sendToView(view -> view.onSetMdText(downloadedStream, url));
} else {
isMarkdown = MarkDownProvider.isMarkdown(url);
if (isMarkdown) {
MarkdownModel model = new MarkdownModel();
model.setText(downloadedStream);
NameParser parser = new NameParser(url);
if (parser.getUsername() != null && parser.getName() != null) {
model.setContext(parser.getUsername() + "/" + parser.getName());
} else {
model.setContext("");
}
Logger.e(model.getContext());
makeRestCall(RestProvider.getRepoService().convertReadmeToHtml(model), string -> {
isMarkdown = true;
downloadedStream = string;
fileModel.setMarkdown(true);
fileModel.setContent(downloadedStream);
manageSubscription(fileModel.save(fileModel).subscribe());
sendToView(view -> view.onSetMdText(downloadedStream, url));
});
return;
}
fileModel.setMarkdown(false);
sendToView(view -> view.onSetCode(downloadedStream));
}
manageSubscription(fileModel.save(fileModel).subscribe());
});
}
@Override public boolean isRepo() {
return isRepo;
}
@Override public boolean isImage() {
return isImage;
}
@NonNull @Override public String url() {
return url;
}
}