package com.sgaop.idea.restful.window.tool;

import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.ex.ToolWindowEx;
import com.sgaop.idea.gotosymbol.AtMappingNavigationItem;
import com.sgaop.idea.restful.tree.ApiMutableTreeNode;
import com.sgaop.idea.restful.tree.TreeNodeObject;
import com.sgaop.idea.restful.tree.TreeObjectTypeEnum;
import com.sgaop.util.FindRequestMappingItemsUtil;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;
import javax.swing.tree.DefaultTreeModel;
import java.text.Collator;
import java.util.*;

/**
 * @author 黄川 [email protected]
 * @date: 2020/5/22
 */
public class RefreshAction extends DumbAwareAction {


    private final static Comparator COMPARATOR = Collator.getInstance(Locale.ENGLISH);
    private final ToolWindowEx toolWindowEx;
    private final JTree apiTree;

    public RefreshAction(String text, String description, Icon icon, ToolWindowEx toolWindowEx, JTree apiTree) {
        super(text, description, icon);
        this.toolWindowEx = toolWindowEx;
        this.apiTree = apiTree;
    }

    @Override
    public void actionPerformed(@NotNull AnActionEvent e) {
        this.loadTree(e.getProject());
    }


    public void loadTree(Project project) {
        Module[] modules = ModuleManager.getInstance(toolWindowEx.getProject()).getModules();
        DumbService.getInstance(toolWindowEx.getProject()).smartInvokeLater(() -> {
            Task.Backgroundable backgroundable = new Task.Backgroundable(project, "Nutz Api 扫描中...") {
                @Override
                public void run(@NotNull ProgressIndicator progressIndicator) {
                    ApplicationManager.getApplication().runReadAction(() -> {
                        Set<String> repeat = new HashSet<>();
                        //定义tree 的根目录
                        int size = 0;
                        ApiMutableTreeNode root = new ApiMutableTreeNode();
                        for (Module module : modules) {
                            List<AtMappingNavigationItem> requestMappingItems = FindRequestMappingItemsUtil.findRequestMappingItems(module);
                            ApiMutableTreeNode apiMutableTreeNode = new ApiMutableTreeNode(new TreeNodeObject(project, TreeObjectTypeEnum.MODULE, module.getName()));
                            List<ApiMutableTreeNode> list = new ArrayList<>();
                            for (AtMappingNavigationItem atMappingNavigationItem : requestMappingItems) {
                                //是这个模块的api
                                size = size + 1;
                                progressIndicator.setText(atMappingNavigationItem.getText());
                                repeat.add(atMappingNavigationItem.getText());
                                TreeNodeObject treeNodeObject = new TreeNodeObject(project, atMappingNavigationItem);
                                list.add(new ApiMutableTreeNode(treeNodeObject));
                            }
                            if (list.size() > 0) {
                                Collections.sort(list, (o1, o2) -> COMPARATOR.compare(o1.toString(), o2.toString()));
                                list.forEach(mutableTreeNode -> apiMutableTreeNode.add(mutableTreeNode));
                            }
                            if (apiMutableTreeNode.getChildCount() > 0) {
                                root.add(apiMutableTreeNode);
                            }
                        }
                        root.setUserObject(new TreeNodeObject(project, TreeObjectTypeEnum.ROOT, "Found " + size + " api"));
                        apiTree.setModel(new DefaultTreeModel(root));
                    });
                }
            };
            BackgroundableProcessIndicator backgroundableProcessIndicator = new BackgroundableProcessIndicator(backgroundable);
            backgroundableProcessIndicator.setIndeterminate(true);
            ProgressManager.getInstance().runProcessWithProgressAsynchronously(backgroundable, backgroundableProcessIndicator);
        });

    }

}