package com.jsonnetplugin;

import com.intellij.lang.ASTNode;
import com.intellij.lang.folding.FoldingBuilderEx;
import com.intellij.lang.folding.FoldingDescriptor;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.FoldingGroup;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.jsonnetplugin.psi.JsonnetArr;
import com.jsonnetplugin.psi.JsonnetArrcomp;
import com.jsonnetplugin.psi.JsonnetObj;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class JsonnetFoldingBuilder extends FoldingBuilderEx {
    @NotNull
    @Override
    public FoldingDescriptor[] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) {
        List<FoldingDescriptor> descriptors = new ArrayList<>();
        Collection<PsiElement> literalExpressions = PsiTreeUtil.findChildrenOfType(root, JsonnetObj.class);
        literalExpressions.addAll(PsiTreeUtil.findChildrenOfType(root, JsonnetArr.class));
        literalExpressions.addAll(PsiTreeUtil.findChildrenOfType(root, JsonnetArrcomp.class));
        for (final PsiElement literalExpression : literalExpressions) {
            FoldingGroup group = FoldingGroup.newGroup(
                    "jsonnet-" + literalExpression.getTextRange().getStartOffset() +
                            "-" + literalExpression.getTextRange().getEndOffset()
            );
            int start = literalExpression.getTextRange().getStartOffset() + 1;
            int end = literalExpression.getTextRange().getEndOffset() - 1;
            if (end > start)
                descriptors.add(
                        new FoldingDescriptor(
                                literalExpression.getNode(),
                                new TextRange(start, end),
                                group
                        ) {
                            @Override
                            public String getPlaceholderText() {
                                return "...";
                            }
                        }
                );
        }
        return descriptors.toArray(new FoldingDescriptor[0]);
    }

    @Override
    public String getPlaceholderText(@NotNull ASTNode node) {
        return "...";
    }

    @Override
    public boolean isCollapsedByDefault(@NotNull ASTNode node) {
        return false;
    }
}