/*******************************************************************************
 * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.internal.debug.ui.tabs.main;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.wst.xsl.internal.debug.ui.XSLDebugUIPlugin;
import org.eclipse.wst.xsl.internal.debug.ui.XSLLaunchConfigurationTab;
import org.eclipse.wst.xsl.launching.XSLLaunchConfigurationConstants;
import org.eclipse.wst.xsl.launching.config.LaunchPipeline;
import org.eclipse.wst.xsl.launching.config.LaunchTransform;

public class XSLMainTab extends XSLLaunchConfigurationTab
{
	private final InputFileBlock inputFileBlock;
	private final TransformsBlock transformsBlock;
	private final ParametersBlock parametersBlock;
	public LaunchPipeline pipeline;

	// private RenderBlock renderBlock;
	// private OutputBlock outputBlock;

	public XSLMainTab()
	{
		IResource[] resourceContext = getContext();
		IFile inputFile = getXMLInput(resourceContext);

		inputFileBlock = new InputFileBlock(inputFile);
		transformsBlock = new TransformsBlock();
		parametersBlock = new ParametersBlock(transformsBlock);
		// renderBlock = new RenderBlock();
		// outputBlock = new OutputBlock();

		setBlocks(new ILaunchConfigurationTab[]
		{ inputFileBlock, transformsBlock, parametersBlock }); // ,renderBlock,outputBlock});
	}

	@Override
	public void createControl(Composite parent)
	{
		super.createControl(parent);
		Composite comp = (Composite) getControl();
		GridLayout layout = new GridLayout(1, false);
		comp.setLayout(layout);

		inputFileBlock.createControl(comp);
		transformsBlock.createControl(comp);
		parametersBlock.createControl(comp);
		// renderBlock.createControl(comp);
		// outputBlock.createControl(comp);
	}

	@Override
	public void setDefaults(ILaunchConfigurationWorkingCopy configuration)
	{
		LaunchPipeline lp = new LaunchPipeline();
		IResource[] resourceContext = getContext();
		IFile[] stylesheets = getXSLStylesheets(resourceContext);
		for (IFile file : stylesheets)
		{
			LaunchTransform lt = new LaunchTransform(file.getFullPath().toPortableString(), LaunchTransform.RESOURCE_TYPE);
			lp.addTransformDef(lt);
		}
		savePipeline(configuration, lp);
		super.setDefaults(configuration);
	}

	@Override
	public void initializeFrom(ILaunchConfiguration configuration)
	{
		pipeline = null;
		try
		{
			String s = configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_PIPELINE, (String) null);
			if (s != null && s.length() > 0)
			{
				ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes());
				pipeline = LaunchPipeline.fromXML(inputStream);
			}
			else
			{
				pipeline = new LaunchPipeline();
			}
		}
		catch (CoreException e)
		{
			XSLDebugUIPlugin.log(e);
		}
		transformsBlock.setPipeline(pipeline);
		super.initializeFrom(configuration);
	}

	@Override
	public void performApply(ILaunchConfigurationWorkingCopy configuration)
	{
		super.performApply(configuration);
		savePipeline(configuration, pipeline);
	}

	private void savePipeline(ILaunchConfigurationWorkingCopy configuration, LaunchPipeline pipeline)
	{
		try
		{
			configuration.setAttribute(XSLLaunchConfigurationConstants.ATTR_PIPELINE, pipeline.toXML());
		}
		catch (CoreException e)
		{
			XSLDebugUIPlugin.log(e);
		}
	}

	public String getName()
	{
		return MainTabMessages.XSLMainTab_TabName;
	}

	private static IResource[] getContext()
	{

		// IProject[] projects =
		// ResourcesPlugin.getWorkspace().getRoot().getProjects();
		// project.setInput( projects);
		// String s = configuration.getAttribute(
		// IXSLTLaunchConfiguration.PROJECT, "");
		// IProject project = null;
		// if( s.equals(""))
		// {
		// if( projects.length>0)
		// {
		// project = projects[ 0];
		// }
		// }
		// else
		// project = ResourcesPlugin.getWorkspace().getRoot().getProject( s);

		IWorkbenchPage page = XSLDebugUIPlugin.getActivePage();
		List<Object> resources = new ArrayList<Object>();
		if (page != null)
		{
			// use selections to find the project
			ISelection selection = page.getSelection();
			if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection)
			{
				IStructuredSelection ss = (IStructuredSelection) selection;
				for (Iterator<?> iter = ss.iterator(); iter.hasNext();)
				{
					Object element = iter.next();
					if (element instanceof IResource)
						resources.add(element);
				}
				return (IResource[]) resources.toArray(new IResource[0]);
			}
			// use current editor to find the project
			IEditorPart part = page.getActiveEditor();
			if (part != null)
			{
				IEditorInput input = part.getEditorInput();
				IFile file = (IFile) input.getAdapter(IFile.class);
				if (file != null)
					return new IResource[]
					{ file };
			}
		}
		return new IResource[0];
	}

	private IFile getXMLInput(IResource[] context)
	{
		for (IResource resource : context)
		{
			if (resource instanceof IFile && ("xml".equalsIgnoreCase(resource.getFileExtension()) || "xhtml".equalsIgnoreCase(resource.getFileExtension()))) //$NON-NLS-1$ //$NON-NLS-2$
				return (IFile) resource;
		}
		return null;
	}

	private IFile[] getXSLStylesheets(IResource[] context)
	{
		List<IResource> stylesheets = new ArrayList<IResource>();
		for (IResource resource : context)
		{
			if (resource instanceof IFile && "xsl".equalsIgnoreCase(resource.getFileExtension())) //$NON-NLS-1$
				stylesheets.add(resource);
		}
		return (IFile[]) stylesheets.toArray(new IFile[0]);

	}
}
