package fr.adrienbrault.idea.symfony2plugin.intentions.yaml.dict;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import fr.adrienbrault.idea.symfony2plugin.action.ServiceActionUtil;
import fr.adrienbrault.idea.symfony2plugin.translation.util.TranslationInsertUtil;
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.yaml.YAMLUtil;
import org.jetbrains.yaml.psi.YAMLCompoundValue;
import org.jetbrains.yaml.psi.YAMLKeyValue;
import org.jetbrains.yaml.psi.YAMLSequence;
import org.jetbrains.yaml.psi.YAMLValue;
import org.jetbrains.yaml.psi.impl.YAMLArrayImpl;
import java.util.ArrayList;
import java.util.List;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class YamlUpdateArgumentServicesCallback implements ServiceActionUtil.InsertServicesCallback {
private final Project project;
private final YAMLKeyValue argumentsKeyValue;
private final YAMLKeyValue yamlKeyValue;
public YamlUpdateArgumentServicesCallback(Project project, YAMLKeyValue argumentsKeyValue, YAMLKeyValue serviceKeyValue) {
this.project = project;
this.argumentsKeyValue = argumentsKeyValue;
this.yamlKeyValue = serviceKeyValue;
}
@Override
public void insert(List<String> items) {
YAMLValue yamlCompoundValue = argumentsKeyValue.getValue();
if(!(yamlCompoundValue instanceof YAMLCompoundValue)) {
return;
}
int appendEndOffset = -1;
String insertString = null;
if(yamlCompoundValue instanceof YAMLArrayImpl) {
// [ @foo ]
// we wound array
List<PsiElement> yamlArguments = YamlHelper.getYamlArrayOnSequenceOrArrayElements((YAMLCompoundValue) yamlCompoundValue);
if(yamlArguments != null && yamlArguments.size() > 0) {
appendEndOffset = yamlArguments.get(yamlArguments.size() - 1).getTextRange().getEndOffset();
List<String> arrayList = new ArrayList<>();
for (String item : items) {
arrayList.add(String.format("'@%s'", StringUtils.isNotBlank(item) ? item : "?"));
}
insertString = ", " + StringUtils.join(arrayList, ", ");
}
} else if(yamlCompoundValue instanceof YAMLSequence) {
// - @foo
// search indent and EOL value
String indent = StringUtil.repeatSymbol(' ', YAMLUtil.getIndentToThisElement(yamlCompoundValue));
String eol = TranslationInsertUtil.findEol(yamlKeyValue);
List<String> yamlSequences = new ArrayList<>();
for (String item : items) {
// should be faster then YamlPsiElementFactory.createFromText
yamlSequences.add(indent + String.format("- '@%s'", StringUtils.isNotBlank(item) ? item : "?"));
}
appendEndOffset = yamlCompoundValue.getTextRange().getEndOffset();
insertString = eol + StringUtils.join(yamlSequences, eol);
}
if(appendEndOffset == -1) {
return;
}
PsiDocumentManager manager = PsiDocumentManager.getInstance(project);
Document document = manager.getDocument(yamlKeyValue.getContainingFile());
if (document == null) {
return;
}
document.insertString(appendEndOffset, insertString);
manager.doPostponedOperationsAndUnblockDocument(document);
manager.commitDocument(document);
}
}