package com.jantvrdik.intellij.latte.reference;

import com.intellij.lang.cacheBuilder.*;
import com.intellij.lang.findUsages.FindUsagesProvider;
import com.intellij.psi.*;
import com.intellij.psi.tree.TokenSet;
import com.jantvrdik.intellij.latte.lexer.LatteMacroLexerAdapter;
import com.jantvrdik.intellij.latte.psi.LattePhpVariable;
import com.jantvrdik.intellij.latte.psi.LatteTypes;
import org.jetbrains.annotations.*;

public class LatteFindUsagesProvider implements FindUsagesProvider {
    @Nullable
    @Override
    public WordsScanner getWordsScanner() {
        return new DefaultWordsScanner(
                new LatteMacroLexerAdapter(),
                TokenSet.create(LatteTypes.PHP_VARIABLE),
                TokenSet.create(LatteTypes.MACRO_COMMENT),
                TokenSet.EMPTY
        );
    }

    @Override
    public boolean canFindUsagesFor(@NotNull PsiElement psiElement) {
        return psiElement instanceof LattePhpVariable && ((LattePhpVariable) psiElement).isDefinition();
    }

    @Nullable
    @Override
    public String getHelpId(@NotNull PsiElement psiElement) {
        return null;
    }

    @NotNull
    @Override
    public String getType(@NotNull PsiElement element) {
        if (element instanceof LattePhpVariable) {
            return "latte variable";
        } else {
            return "";
        }
    }

    @NotNull
    @Override
    public String getDescriptiveName(@NotNull PsiElement element) {
        if (element instanceof LattePhpVariable) {
            return ((LattePhpVariable) element).getVariableName();
        } else {
            return "";
        }
    }

    @NotNull
    @Override
    public String getNodeText(@NotNull PsiElement element, boolean useFullName) {
        if (element instanceof LattePhpVariable) {
            return ((LattePhpVariable) element).getVariableName();
        } else {
            return "";
        }
    }
}