package com.prateekj.snooper.networksnooper.presenter;
import android.support.annotation.NonNull;
import com.prateekj.snooper.formatter.PlainTextFormatter;
import com.prateekj.snooper.formatter.ResponseFormatter;
import com.prateekj.snooper.formatter.ResponseFormatterFactory;
import com.prateekj.snooper.infra.BackgroundTask;
import com.prateekj.snooper.infra.BackgroundTaskExecutor;
import com.prateekj.snooper.networksnooper.model.HttpCall;
import com.prateekj.snooper.networksnooper.model.HttpHeader;
import com.prateekj.snooper.networksnooper.model.HttpHeaderValue;
import com.prateekj.snooper.networksnooper.repo.SnooperRepo;
import com.prateekj.snooper.networksnooper.viewmodel.HttpBodyViewModel;
import com.prateekj.snooper.networksnooper.views.HttpCallBodyView;
import static com.prateekj.snooper.networksnooper.activity.HttpCallActivity.REQUEST_MODE;
import static com.prateekj.snooper.networksnooper.model.HttpHeader.CONTENT_TYPE;
public class HttpCallFragmentPresenter {
private SnooperRepo repo;
private int httpCallId;
private HttpCallBodyView httpCallBodyView;
private ResponseFormatterFactory formatterFactory;
private BackgroundTaskExecutor executor;
private int mode;
public HttpCallFragmentPresenter(SnooperRepo repo,
int httpCallId,
HttpCallBodyView httpCallBodyView,
ResponseFormatterFactory formatterFactory,
BackgroundTaskExecutor executor) {
this.repo = repo;
this.httpCallId = httpCallId;
this.httpCallBodyView = httpCallBodyView;
this.formatterFactory = formatterFactory;
this.executor = executor;
}
public void init(final HttpBodyViewModel viewModel, int mode) {
this.mode = mode;
final HttpCall httpCall = this.repo.findById(httpCallId);
final ResponseFormatter formatter = getFormatter(httpCall);
final String bodyToFormat = getBodyToFormat(httpCall);
executor.execute(new BackgroundTask<String>() {
@Override
public String onExecute() {
return formatter.format(bodyToFormat);
}
@Override
public void onResult(String result) {
viewModel.init(result);
httpCallBodyView.onFormattingDone();
}
});
}
private String getBodyToFormat(HttpCall httpCall) {
return this.mode == REQUEST_MODE ? httpCall.getPayload() : httpCall.getResponseBody();
}
@NonNull
private ResponseFormatter getFormatter(HttpCall httpCall) {
HttpHeader contentTypeHeader = getContentTypeHeader(httpCall);
if (contentTypeHeader == null) {
return new PlainTextFormatter();
}
HttpHeaderValue headerValue = contentTypeHeader.getValues().get(0);
return this.formatterFactory.getFor(headerValue.getValue());
}
private HttpHeader getContentTypeHeader(HttpCall httpCall) {
if (this.mode == REQUEST_MODE) {
return httpCall.getRequestHeader(CONTENT_TYPE);
}
return httpCall.getResponseHeader(CONTENT_TYPE);
}
}