package com.reason.ide.insight.provider;

import com.intellij.codeInsight.completion.*;
import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.text.CaseInsensitiveStringHashingStrategy;
import com.reason.Log;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;

import static com.reason.ide.insight.CompletionUtils.KEYWORD_PRIORITY;

public class KeywordCompletionProvider extends CompletionProvider<CompletionParameters> {

    private static final Log LOG = Log.create("insight.keyword");

    private final String m_debugName;
    private final String[] m_keywords;

    private static final THashSet<String> KEYWORD_WITH_POPUP = ContainerUtil.newTroveSet(CaseInsensitiveStringHashingStrategy.INSTANCE, "open", "include");
    private static final InsertHandler<LookupElement> INSERT_SPACE_POPUP = new AddSpaceInsertHandler(true);
    private static final InsertHandler<LookupElement> INSERT_SPACE = new AddSpaceInsertHandler(false);

    public KeywordCompletionProvider(String debugName, String... keywords) {
        m_debugName = debugName;
        m_keywords = keywords;
    }

    @Override
    protected void addCompletions(@NotNull CompletionParameters parameters, @NotNull ProcessingContext context, @NotNull CompletionResultSet result) {
        LOG.debug(m_debugName + " expression completion");

        for (String keyword : m_keywords) {
            InsertHandler<LookupElement> insertHandler;
            if ("Some".equals(keyword)) {
                insertHandler = ParenthesesInsertHandler.getInstance(true);
            } else {
                insertHandler = KEYWORD_WITH_POPUP.contains(keyword) ? INSERT_SPACE_POPUP : INSERT_SPACE;
            }

            LookupElementBuilder builder = LookupElementBuilder.create(keyword).
                    withInsertHandler(insertHandler).
                    bold();

            result.addElement(PrioritizedLookupElement.withPriority(builder, KEYWORD_PRIORITY));
        }
    }
}