package com.prateekj.snooper.networksnooper.presenter;
import android.support.annotation.NonNull;
import com.prateekj.snooper.networksnooper.activity.HttpCallTab;
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.repo.SnooperRepo;
import com.prateekj.snooper.utils.FileUtil;
import com.prateekj.snooper.networksnooper.views.HttpCallView;
import org.apache.commons.lang3.StringUtils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import static com.prateekj.snooper.networksnooper.activity.HttpCallActivity.REQUEST_MODE;
import static com.prateekj.snooper.networksnooper.activity.HttpCallActivity.RESPONSE_MODE;
import static com.prateekj.snooper.networksnooper.activity.HttpCallTab.RESPONSE;
import static com.prateekj.snooper.networksnooper.model.HttpHeader.CONTENT_TYPE;
import static java.lang.String.format;
import static java.util.Locale.US;
public class HttpCallPresenter {
private final FileUtil fileUtil;
private final BackgroundTaskExecutor executor;
private HttpCall httpCall;
private HttpCallView view;
private ResponseFormatterFactory formatterFactory;
private boolean requestViewLoaded;
private boolean responseViewLoaded;
public HttpCallPresenter(int callId, SnooperRepo snooperRepo, HttpCallView view, ResponseFormatterFactory formatterFactory, FileUtil fileUtil, BackgroundTaskExecutor executor) {
this.httpCall = snooperRepo.findById(callId);
this.view = view;
this.formatterFactory = formatterFactory;
this.fileUtil = fileUtil;
this.executor = executor;
}
public void copyHttpCallBody(int selectedItem) {
String text = getTextToCopy(selectedItem);
view.copyToClipboard(text);
}
public void shareHttpCallBody() {
final StringBuilder completeHttpCallData = getHttpCallData();
final String logFileName = getLogFileName();
executor.execute(new BackgroundTask<String>() {
@Override
public String onExecute() {
return fileUtil.createLogFile(completeHttpCallData, logFileName);
}
@Override
public void onResult(String filePath) {
if (!StringUtils.isEmpty(filePath)) {
view.shareData(filePath);
}
}
});
}
@NonNull
private String getLogFileName() {
DateFormat df = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", US);
return format("%s.txt", df.format(httpCall.getDate()));
}
public void onPermissionDenied() {
view.showMessageShareNotAvailable();
}
private String getTextToCopy(int selectedItem) {
HttpCallTab httpCallTab = HttpCallTab.byIndex(selectedItem);
String dataToCopy;
HttpHeader contentTypeHeader;
if (httpCallTab == RESPONSE) {
contentTypeHeader = httpCall.getResponseHeader(CONTENT_TYPE);
dataToCopy = httpCall.getResponseBody();
} else {
contentTypeHeader = httpCall.getRequestHeader(CONTENT_TYPE);
dataToCopy = httpCall.getPayload();
}
return getFormattedData(contentTypeHeader, dataToCopy);
}
private boolean contentHeadersPresent(HttpHeader contentTypeHeader) {
return contentTypeHeader != null && contentTypeHeader.getValues().size() > 0;
}
public void onHttpCallBodyFormatted(int mode) {
if (mode == REQUEST_MODE)
requestViewLoaded = true;
if (mode == RESPONSE_MODE)
responseViewLoaded = true;
if (requestViewLoaded && responseViewLoaded) {
view.dismissProgressDialog();
}
}
private StringBuilder getHttpCallData() {
StringBuilder dataToCopy = new StringBuilder();
HttpHeader contentTypeHeader;
contentTypeHeader = httpCall.getRequestHeader(CONTENT_TYPE);
String formattedRequestData = getFormattedData(contentTypeHeader, httpCall.getPayload());
if (!StringUtils.isEmpty(formattedRequestData)) {
dataToCopy.append("Request Body");
dataToCopy.append("\n");
dataToCopy.append(formattedRequestData);
dataToCopy.append("\n");
}
contentTypeHeader = httpCall.getResponseHeader(CONTENT_TYPE);
String formattedResponseData = getFormattedData(contentTypeHeader, httpCall.getResponseBody());
if (!StringUtils.isEmpty(formattedResponseData)) {
dataToCopy.append("Response Body");
dataToCopy.append("\n");
dataToCopy.append(formattedResponseData);
}
return dataToCopy;
}
private String getFormattedData(HttpHeader contentTypeHeader, String dataToCopy) {
if (contentHeadersPresent(contentTypeHeader)) {
ResponseFormatter formatter = this.formatterFactory.getFor(contentTypeHeader.getValues().get(0).getValue());
return formatter.format(dataToCopy);
}
return "";
}
}