package me.javaroad.plugins.ui;

import com.intellij.ide.util.PackageChooserDialog;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.PackageChooser;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiPackage;
import java.util.Map;
import java.util.Objects;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTextField;
import me.javaroad.plugins.model.TemplateGroup;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.Nullable;

/**
 * @author heyx
 */
public class SelectPathDialog extends DialogWrapper {

    private JButton outputPathBtn;
    private JButton basePackageBtn;
    private JTextField outputPathField;
    private JTextField basePackageField;
    private JComboBox<String> templateGroupCombo;
    private JPanel mainPanel;
    private final Project project;
    private final Map<String, TemplateGroup> templateGroupMap;

    public SelectPathDialog(Project project, Map<String, TemplateGroup> templateGroupMap) {
        super(project);
        this.project = project;
        this.templateGroupMap = templateGroupMap;
        setTitle("Select Path");
        initBtn();
        initCombo();
        init();
    }

    @Override
    protected void doOKAction() {
        if (StringUtils.isBlank(getOutputPath())) {
            outputPathField.requestFocus();
            return;
        }
        if (StringUtils.isBlank(getBasePackage())) {
            basePackageField.requestFocus();
            return;
        }
        if (StringUtils.isBlank(getTemplateGroup())) {
            templateGroupCombo.requestFocus();
            return;
        }
        close(0);
    }

    public String getOutputPath() {
        return outputPathField.getText();
    }

    public String getBasePackage() {
        return basePackageField.getText();
    }

    public String getTemplateGroup() {
        Object selectedGroup = templateGroupCombo.getSelectedItem();
        if (Objects.nonNull(selectedGroup)) {
            return String.valueOf(selectedGroup);
        }
        return null;
    }

    private void initCombo() {
        templateGroupMap.forEach((key, value) -> {
            templateGroupCombo.addItem(key);
        });
    }

    private void initBtn() {
        basePackageBtn.addActionListener(e -> {
            PackageChooser packageChooser = new PackageChooserDialog("Select Base Package", project);
            packageChooser.show();
            PsiPackage psiPackage = packageChooser.getSelectedPackage();
            if (Objects.nonNull(psiPackage)) {
                basePackageField.setText(psiPackage.getQualifiedName());
            }
        });

        outputPathBtn.addActionListener(e -> {
            FileChooserDescriptor descriptor = new FileChooserDescriptor(false, true, false, false, false, false);
            VirtualFile virtualFile = FileChooser.chooseFile(descriptor, project, null);
            if (Objects.nonNull(virtualFile)) {
                outputPathField.setText(virtualFile.getPath());
            }
        });
    }

    @Nullable
    @Override
    protected JComponent createCenterPanel() {
        return mainPanel;
    }
}