package main.java.com.konifar.stringssearch;

import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.ide.actions.GotoActionBase;
import com.intellij.ide.util.gotoByName.ChooseByNameFilter;
import com.intellij.ide.util.gotoByName.ChooseByNamePopup;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.UndoConfirmationPolicy;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import main.java.com.konifar.stringssearch.models.StringElement;
import main.java.com.konifar.stringssearch.search.SearchStringFilterFactory;
import main.java.com.konifar.stringssearch.search.SearchStringItemProvider;
import main.java.com.konifar.stringssearch.search.SearchStringModel;
import org.jetbrains.annotations.NotNull;

import static com.intellij.openapi.application.ApplicationManager.getApplication;

public class SearchStringsAction extends GotoActionBase implements DumbAware {

    @Override
    protected void gotoActionPerformed(AnActionEvent e) {
        final Project project = e.getData(CommonDataKeys.PROJECT);
        if (project == null) return;

        FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.file");

        final SearchStringModel searchStringModel = new SearchStringModel(project);
        GotoActionCallback<StringElement> callback = new GotoActionCallback<StringElement>() {
            @Override
            protected ChooseByNameFilter<StringElement> createFilter(@NotNull ChooseByNamePopup popup) {
                return SearchStringFilterFactory.get(project).create(popup, searchStringModel);
            }

            @Override
            public void elementChosen(ChooseByNamePopup popup, Object element) {
                if (element != null && element instanceof StringElement) {
                    insertToEditor(project, (StringElement) element);
                }
            }
        };

        SearchStringItemProvider provider = new SearchStringItemProvider(getPsiContext(e));
        showNavigationPopup(e, searchStringModel, callback, "strings matching pattern", true, true, provider);
    }

    private void insertToEditor(final Project project, final StringElement stringElement) {
        CommandProcessor.getInstance().executeCommand(project, new Runnable() {
            @Override
            public void run() {
                getApplication().runWriteAction(new Runnable() {
                    @Override
                    public void run() {
                        Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor();
                        if (editor != null) {
                            int offset = editor.getCaretModel().getOffset();
                            Document document = editor.getDocument();
                            String key = stringElement.getName();
                            if (key != null) {
                                document.insertString(offset, key);
                                editor.getCaretModel().moveToOffset(offset + key.length());
                            }
                        }
                    }
                });
            }
        }, "WriteStringKeyCommand", "", UndoConfirmationPolicy.DO_NOT_REQUEST_CONFIRMATION);
    }
}