package com.intellij.lang.jsgraphql.ide.actions;

import com.intellij.ide.IdeView;
import com.intellij.lang.jsgraphql.icons.JSGraphQLIcons;
import com.intellij.lang.jsgraphql.ide.project.graphqlconfig.GraphQLConfigManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.vfs.VirtualFile;

public class GraphQLCreateConfigFileAction extends AnAction {

    public GraphQLCreateConfigFileAction() {
        super("GraphQL Configuration File", "Creates a new GraphQL Configuration file (.graphqlconfig)", JSGraphQLIcons.Logos.GraphQL);
    }

    @Override
    public void actionPerformed(AnActionEvent e) {
        if (e.getProject() != null) {
            final VirtualFile virtualFile = getActionDirectory(e);
            if (virtualFile != null) {
                GraphQLConfigManager.getService(e.getProject()).createAndOpenConfigFile(virtualFile, true);
                ApplicationManager.getApplication().saveAll();
            }
        }
    }

    @Override
    public void update(AnActionEvent e) {

        boolean isAvailable = false;

        if (e.getProject() != null) {
            final DataContext dataContext = e.getDataContext();
            final IdeView view = LangDataKeys.IDE_VIEW.getData(dataContext);
            if (view != null && view.getDirectories().length > 0) {
                final Module module = LangDataKeys.MODULE.getData(dataContext);
                if (module != null) {
                    final VirtualFile actionDirectory = getActionDirectory(e);
                    if (actionDirectory != null) {
                        isAvailable = (actionDirectory.findChild(GraphQLConfigManager.GRAPHQLCONFIG) == null);
                    }
                }
            }
        }

        final Presentation presentation = e.getPresentation();
        presentation.setVisible(isAvailable);
        presentation.setEnabled(isAvailable);
    }

    private VirtualFile getActionDirectory(AnActionEvent e) {
        VirtualFile virtualFile = e.getDataContext().getData(LangDataKeys.VIRTUAL_FILE);
        if (virtualFile != null) {
            if (!virtualFile.isDirectory()) {
                virtualFile = virtualFile.getParent();
            }
        }
        return virtualFile;
    }
}