/*
 * Copyright (c) 2007 NoMagic, Inc. All Rights Reserved.
 */
package com.nomagic.magicdraw.examples.codeengineering;

import com.nomagic.actions.AMConfigurator;
import com.nomagic.actions.ActionsCategory;
import com.nomagic.actions.ActionsManager;
import com.nomagic.actions.NMAction;
import com.nomagic.magicdraw.actions.ActionsConfiguratorsManager;
import com.nomagic.magicdraw.actions.ActionsID;
import com.nomagic.magicdraw.ce.CodeEngineeringManager;
import com.nomagic.magicdraw.ce.CodeEngineeringSet;
import com.nomagic.magicdraw.ce.java.JavaDescriptor;
import com.nomagic.magicdraw.core.Application;
import com.nomagic.magicdraw.core.Project;
import com.nomagic.magicdraw.plugins.Plugin;

import javax.annotation.CheckForNull;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.Collections;

/**
 * Example for showing {@link CodeEngineeringManager} open api methods.
 * How to create code engineering set and how to generate and reverse it.
 *
 * Example action is added to Tools -> Java Set Example.
 * NOTE: It needs project to be executed and .java class for {@link CodeEngineeringManager} reverse.
 *
 * @author Modestas Mikuckas
 */
public class CodeEngineeringExample extends Plugin
{
    @Override
    public void init()
    {
        ActionsConfiguratorsManager manager = ActionsConfiguratorsManager.getInstance();
        createMenuConfiguration(manager);
    }

    /**
     * Adds action to menu tools.
     *
     * @param manager instance of {@link ActionsConfiguratorsManager}
     */
    private static void createMenuConfiguration(ActionsConfiguratorsManager manager)
    {
        AMConfigurator mainMenuConfigurator = new AMConfigurator()
        {
            @Override
            public void configure(ActionsManager manager)
            {
                ActionsCategory category = (ActionsCategory) manager.getActionFor(ActionsID.TOOLS);
                if (category != null)
                {
                    ActionsCategory innerCategory = new ActionsCategory();
                    innerCategory.addAction(new JavaSetAction());
                    category.addAction(innerCategory);
                }
            }

            @Override
            public int getPriority()
            {
                return AMConfigurator.HIGH_PRIORITY;
            }
        };
        manager.addMainMenuConfigurator(mainMenuConfigurator);
    }

    @Override
    public boolean close()
    {
        return true;
    }

    @Override
    public boolean isSupported()
    {
        return true;
    }

    /**
     * Action for demonstrating {@link CodeEngineeringManager} reverse and generate
     * methods and how to create code engineering set.
     */
    private static class JavaSetAction extends NMAction
    {
        /**
         * Action id.
         */
        private static final String JAVA_SET_ACTION_ID = "JAVA_SET_ACTION_ID";

        /**
         * Constructor.
         */
        public JavaSetAction()
        {
            super(JAVA_SET_ACTION_ID, "Java Set Example", null);
        }

        @Override
        public void updateState()
        {
            setEnabled(Application.getInstance().getProject() != null);
        }

        @Override
        public void actionPerformed(@CheckForNull ActionEvent e)
        {
            JFileChooser jFileChooser = new JFileChooser();
            jFileChooser.addChoosableFileFilter(new FileFilter()
            {
                @Override
                public boolean accept(File f)
                {
                    return f.getName().endsWith(".java");
                }

                @Override
                public String getDescription()
                {
                    return "Java files";
                }
            });
            int i = jFileChooser.showOpenDialog(Application.getInstance().getMainFrame());
            if(i == JFileChooser.APPROVE_OPTION)
            {
                File selectedFile = jFileChooser.getSelectedFile();
                Project project = Application.getInstance().getProject();
                if(project != null)
                {
                    CodeEngineeringSet example = CodeEngineeringManager.createCodeEngineeringSet(JavaDescriptor.JAVA, null, "Example", project, null, null);
                    example.addFilesToCodeEngineeringSet(Collections.singletonList(selectedFile));
                    CodeEngineeringManager.reverse(example, false);

                    CodeEngineeringManager.generate(example);
                }
            }
        }
    }
}