package com.thoughtworks.gauge.extract;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.psi.PsiElement;
import com.thoughtworks.gauge.core.Gauge;
import com.thoughtworks.gauge.core.GaugeService;
import com.thoughtworks.gauge.language.psi.ConceptTable;
import com.thoughtworks.gauge.language.psi.SpecTable;
import com.thoughtworks.gauge.language.psi.impl.ConceptStepImpl;
import com.thoughtworks.gauge.language.psi.impl.SpecStepImpl;
import gauge.messages.Api;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractConceptRequest {
private List<Api.step> steps;
private final String fileName;
private final Api.step concept;
private final boolean refactorOtherUsages;
private final Api.textInfo textInfo;
public ExtractConceptRequest(String fileName, String concept, boolean refactorOtherUsages, Api.textInfo textInfo) {
this.fileName = fileName;
this.concept = Api.step.newBuilder().setName(concept).build();
this.refactorOtherUsages = refactorOtherUsages;
this.textInfo = textInfo;
}
public void convertToSteps(List<PsiElement> specSteps, Map<String, String> tableMap) {
this.steps = new ArrayList<>();
for (PsiElement specStep : specSteps) {
String text = specStep.getText().trim().substring(2).trim();
Api.step stepToAdd = Api.step.newBuilder().setName(text).build();
if (specStep.getClass().equals(SpecStepImpl.class))
stepToAdd = formatTable(tableMap, (SpecStepImpl) specStep, text, stepToAdd);
else
stepToAdd = formatTable(tableMap, (ConceptStepImpl) specStep, text, stepToAdd);
steps.add(stepToAdd);
}
}
private Api.step formatTable(Map<String, String> tableMap, SpecStepImpl specStep, String text, Api.step stepToAdd) {
SpecTable table = specStep.getInlineTable();
if (table != null) stepToAdd = getStep(tableMap, text, table.getText().trim());
return stepToAdd;
}
private Api.step formatTable(Map<String, String> tableMap, ConceptStepImpl conceptStep, String text, Api.step stepToAdd) {
ConceptTable table = conceptStep.getTable();
if (table != null) stepToAdd = getStep(tableMap, text, table.getText().trim());
return stepToAdd;
}
private Api.step getStep(Map<String, String> tableMap, String text, String tableText) {
Api.step stepToAdd;
Api.step.Builder builder = Api.step.newBuilder().setName(text.replace(tableText, "").trim()).setTable(tableText);
String tableAsParameter = getTableName(concept.getName(), tableMap, tableText);
if (tableAsParameter != null) builder = builder.setParamTableName(tableAsParameter);
stepToAdd = builder.build();
return stepToAdd;
}
private String getTableName(String concept, Map<String, String> tableMap, String tableText) {
Pattern pattern = Pattern.compile("<(.*?)>");
final Matcher matcher = pattern.matcher(concept);
while (matcher.find()) {
if (tableMap.get(matcher.group(1)) != null && tableMap.get(matcher.group(1)).equals(tableText))
return matcher.group(1);
}
return null;
}
public Api.ExtractConceptResponse makeExtractConceptRequest(PsiElement element) {
GaugeService gaugeService = Gauge.getGaugeService(ModuleUtil.findModuleForPsiElement(element), true);
String message = "Cannot connect to gauge service.";
if (gaugeService != null)
try {
return gaugeService.getGaugeConnection().sendGetExtractConceptRequest(steps, concept, refactorOtherUsages, fileName, textInfo);
} catch (Exception ignored) {
message = "Something went wrong during extract concept request.";
}
return Api.ExtractConceptResponse.newBuilder().setIsSuccess(false).setError(message).build();
}
}