package com.fastaccess.ui.modules.gists.gist;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.fastaccess.data.dao.model.Gist;
import com.fastaccess.data.dao.model.Login;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.helper.RxHelper;
import com.fastaccess.provider.rest.RestProvider;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
/**
* Created by Kosh on 12 Nov 2016, 12:17 PM
*/
class GistPresenter extends BasePresenter<GistMvp.View> implements GistMvp.Presenter {
private boolean isGistStarred;
private boolean isGistForked;
private Gist gist;
private String gistId;
@Nullable @Override public Gist getGist() {
return gist;
}
@NonNull @Override public String gistId() {
return gistId;
}
@SuppressWarnings("unchecked") @Override public void onActivityCreated(@Nullable Intent intent) {
if (intent == null || intent.getExtras() == null) {
return;
}
Bundle bundle = intent.getExtras();
gistId = bundle.getString(BundleConstant.EXTRA);
if (gist != null) {
checkStarring(gist.getGistId());
sendToView(GistMvp.View::onSetupDetails);
} else if (gistId != null) {
checkStarring(gistId);
makeRestCall(RestProvider.getGistService().getGist(gistId),
gistsModel -> {
this.gist = gistsModel;
sendToView(GistMvp.View::onSetupDetails);
});
} else {
sendToView(GistMvp.View::onSetupDetails); // tell the activity to finish!
}
}
@Override public void onDeleteGist() {
if (getGist() == null) return;
manageSubscription(RxHelper.getObserver(RestProvider.getGistService().deleteGist(getGist().getGistId()))
.doOnSubscribe(this::onSubscribed)
.doOnNext(booleanResponse -> {
if (booleanResponse.code() == 204) {
sendToView(GistMvp.View::onSuccessDeleted);
} else {
sendToView(GistMvp.View::onErrorDeleting);
}
})
.onErrorReturn(throwable -> {
sendToView(view -> view.showErrorMessage(throwable.getMessage()));
return null;
})
.subscribe());
}
@Override public boolean isOwner() {
return getGist() != null && getGist().getOwner() != null &&
getGist().getOwner().getLogin().equals(Login.getUser().getLogin());
}
@Override public void onStarGist() {
isGistStarred = !isGistStarred;
sendToView(view -> view.onGistStarred(isGistStarred));
}
@Override public void onForkGist() {
isGistForked = !isGistForked;
sendToView(view -> view.onGistForked(isGistForked));
}
@Override public boolean isForked() {
return isGistForked;
}
@Override public boolean isStarred() {
return isGistStarred;
}
@Override public void checkStarring(@NonNull String gistId) {
makeRestCall(RestProvider.getGistService().checkGistStar(gistId),
booleanResponse -> {
isGistStarred = booleanResponse.code() == 204;
sendToView(view -> view.onGistStarred(isGistStarred));
});
}
@Override public void onWorkOffline(@NonNull String gistId) {
if (gist == null) {
manageSubscription(RxHelper.getObserver(Gist.getGist(gistId))
.subscribe(gistsModel -> {
this.gist = gistsModel;
sendToView(GistMvp.View::onSetupDetails);
}));
}
}
}