package bndtools;

import java.util.ArrayList;
import java.util.List;

import org.bndtools.api.ILogger;
import org.bndtools.api.Logger;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import bndtools.central.Central;

public class OpenExtConfigsContributionItem extends CompoundContributionItem {

    private static final ILogger logger = Logger.getLogger(OpenExtConfigsContributionItem.class);

    private static final IContributionItem[] EMPTY = new IContributionItem[0];
    private static final ImageDescriptor extFileImg = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "icons/bullet_go.png");

    @Override
    protected IContributionItem[] getContributionItems() {
        try {
            IFile buildFile = Central.getWorkspaceBuildFile();
            if (buildFile == null)
                return EMPTY;

            IContainer cnfDir = buildFile.getParent();
            IFolder extDir = cnfDir.getFolder(new Path("ext"));
            if (extDir == null || !extDir.exists())
                return EMPTY;

            IResource[] extFiles = extDir.members();
            List<IContributionItem> result = new ArrayList<IContributionItem>(extFiles.length);

            for (final IResource extFile : extFiles) {
                if (extFile.getType() == IResource.FILE && "bnd".equalsIgnoreCase(extFile.getFileExtension())) {
                    Action action = new Action() {
                        @Override
                        public void run() {
                            try {
                                FileEditorInput input = new FileEditorInput((IFile) extFile);

                                IWorkbenchPage page = PlatformUI.getWorkbench()
                                    .getActiveWorkbenchWindow()
                                    .getActivePage();
                                page.openEditor(input, "bndtools.bndWorkspaceConfigEditor", true);
                            } catch (PartInitException e) {
                                ErrorDialog.openError(PlatformUI.getWorkbench()
                                    .getActiveWorkbenchWindow()
                                    .getShell(), "Error", "Unable to open editor", e.getStatus());
                            }
                        }
                    };
                    action.setText("Open " + extFile.getProjectRelativePath());
                    action.setImageDescriptor(extFileImg);
                    result.add(new ActionContributionItem(action));
                }
            }

            return result.toArray(new IContributionItem[0]);
        } catch (Exception e) {
            logger.logError("Unable to find default config files", e);
            return EMPTY;
        }

    }

}
