package org.jetbrains.research.intellijdeodorant.ide.ui;

import com.intellij.analysis.AnalysisScope;
import com.intellij.ide.util.scopeChooser.EditScopesDialog;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScopesCore;
import com.intellij.ui.ComboboxWithBrowseButton;
import org.jetbrains.research.intellijdeodorant.IntelliJDeodorantBundle;

import javax.swing.*;
import java.util.Arrays;
import java.util.Collections;

public class ScopeChooserCombo extends ComboboxWithBrowseButton {
    private AnalysisScope customScope = null;
    private final Project project;

    public ScopeChooserCombo(Project project) {
        setTextFieldPreferredWidth(27);
        configureComboBox(null);
        addActionListener(a -> browseCustomScope(project));
        this.project = project;
    }

    private void configureComboBox(String scope) {
        DefaultComboBoxModel<String> comboBoxModel = new DefaultComboBoxModel<>();
        comboBoxModel.addElement(IntelliJDeodorantBundle.message("scope.all.files"));
        comboBoxModel.addElement(IntelliJDeodorantBundle.message("scope.current.file"));
        comboBoxModel.addElement(IntelliJDeodorantBundle.message("scope.opened.files"));
        if (scope != null) {
            comboBoxModel.addElement(scope);
        }
        getComboBox().setModel(comboBoxModel);
        getComboBox().setSelectedItem(scope == null ? IntelliJDeodorantBundle.message("scope.all.files") : scope);
    }

    private void browseCustomScope(Project project) {
        EditScopesDialog dialog = EditScopesDialog.showDialog(project, null);
        if (dialog.isOK()) {
            if (dialog.getSelectedScope() != null) {
                customScope = new AnalysisScope(GlobalSearchScopesCore.filterScope(project, dialog.getSelectedScope()), project);
                configureComboBox(customScope.getDisplayName());
            }
        }
    }

    public AnalysisScope getScope() {
        String s = getComboBox().getSelectedItem().toString();
        if (IntelliJDeodorantBundle.message("scope.all.files").equals(s)) {
            return new AnalysisScope(project);
        } else if (IntelliJDeodorantBundle.message("scope.current.file").equals(s)) {
            return getCurrentFileScope();
        } else if (IntelliJDeodorantBundle.message("scope.opened.files").equals(s)) {
            return getOpenedFilesScope();
        }
        return customScope;
    }

    private AnalysisScope getOpenedFilesScope() {
        VirtualFile[] files = FileEditorManager.getInstance(project).getOpenFiles();
        return files.length == 0 ? null : new AnalysisScope(project, Arrays.asList(files));
    }

    private AnalysisScope getCurrentFileScope() {
        FileEditor currentEditor = FileEditorManager.getInstance(project).getSelectedEditor();
        if (currentEditor != null) {
            VirtualFile currentFile = currentEditor.getFile();
            PsiFile file = PsiManager.getInstance(project).findFile(currentFile);
            if (file instanceof PsiJavaFile)
                return new AnalysisScope(project, Collections.singletonList(currentFile));
        }
        return null;
    }
}